svod-roles: своды доступны всем по их ссп или рф
This commit is contained in:
parent
158409ef73
commit
46aaae1423
@ -5,7 +5,7 @@ from typing import Literal, Optional
|
|||||||
from fastapi import APIRouter, Depends, HTTPException, Query, Response
|
from fastapi import APIRouter, Depends, HTTPException, Query, Response
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
|
||||||
from src.api.v1.deps import require_admin
|
from src.api.v1.deps import get_current_user
|
||||||
from src.db.models.app_user import AppUser
|
from src.db.models.app_user import AppUser
|
||||||
from src.db.session import get_db
|
from src.db.session import get_db
|
||||||
from src.domain.schemas import BaseListResponse, SheetResponse
|
from src.domain.schemas import BaseListResponse, SheetResponse
|
||||||
@ -54,7 +54,7 @@ async def get_summary(
|
|||||||
response: Response,
|
response: Response,
|
||||||
org_ids: Optional[str] = None,
|
org_ids: Optional[str] = None,
|
||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
current_user: AppUser = Depends(require_admin),
|
current_user: AppUser = Depends(get_current_user),
|
||||||
) -> BaseListResponse[SheetResponse]:
|
) -> BaseListResponse[SheetResponse]:
|
||||||
if sheet not in VALID_SUMMARY_SHEETS:
|
if sheet not in VALID_SUMMARY_SHEETS:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@ -64,9 +64,10 @@ async def get_summary(
|
|||||||
|
|
||||||
t0 = time.perf_counter()
|
t0 = time.perf_counter()
|
||||||
summary_service = SummaryService(db)
|
summary_service = SummaryService(db)
|
||||||
rows = await summary_service.get_rows(
|
rows = await summary_service.get_svod1_rows(
|
||||||
year=year,
|
year=year,
|
||||||
sheet=sheet,
|
sheet=sheet,
|
||||||
|
user=current_user,
|
||||||
org_ids=_parse_org_ids(org_ids),
|
org_ids=_parse_org_ids(org_ids),
|
||||||
)
|
)
|
||||||
db_ms = (time.perf_counter() - t0) * 1000
|
db_ms = (time.perf_counter() - t0) * 1000
|
||||||
@ -100,7 +101,7 @@ async def get_summary2(
|
|||||||
sort_by: Literal["org_name", "section_code"] = "org_name",
|
sort_by: Literal["org_name", "section_code"] = "org_name",
|
||||||
sort_direction: Literal["asc", "desc"] = "asc",
|
sort_direction: Literal["asc", "desc"] = "asc",
|
||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
current_user: AppUser = Depends(require_admin),
|
current_user: AppUser = Depends(get_current_user),
|
||||||
) -> BaseListResponse[SheetResponse]:
|
) -> BaseListResponse[SheetResponse]:
|
||||||
sheet = sheet.upper()
|
sheet = sheet.upper()
|
||||||
if sheet not in VALID_SUMMARY2_SHEETS:
|
if sheet not in VALID_SUMMARY2_SHEETS:
|
||||||
@ -114,6 +115,7 @@ async def get_summary2(
|
|||||||
rows = await summary_service.get_svod2_rows(
|
rows = await summary_service.get_svod2_rows(
|
||||||
year=year,
|
year=year,
|
||||||
sheet=sheet,
|
sheet=sheet,
|
||||||
|
user=current_user,
|
||||||
org_ids=_parse_org_ids(org_ids),
|
org_ids=_parse_org_ids(org_ids),
|
||||||
offset=offset,
|
offset=offset,
|
||||||
limit=limit,
|
limit=limit,
|
||||||
|
|||||||
@ -6,7 +6,7 @@ class SummaryRepository:
|
|||||||
def __init__(self, db: AsyncSession):
|
def __init__(self, db: AsyncSession):
|
||||||
self.db = db
|
self.db = db
|
||||||
|
|
||||||
async def get_rows(
|
async def get_svod1_rows(
|
||||||
self,
|
self,
|
||||||
year: int,
|
year: int,
|
||||||
sheet: str,
|
sheet: str,
|
||||||
|
|||||||
@ -1,20 +1,28 @@
|
|||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
|
||||||
|
from src.db.models.app_user import AppUser
|
||||||
|
from src.db.models.role import UserRoleEnum
|
||||||
from src.repository.summary_repository import SummaryRepository
|
from src.repository.summary_repository import SummaryRepository
|
||||||
|
from src.repository.user_repository import UserRepository
|
||||||
|
|
||||||
|
|
||||||
class SummaryService:
|
class SummaryService:
|
||||||
def __init__(self, db: AsyncSession):
|
def __init__(self, db: AsyncSession):
|
||||||
self.db = db
|
self.db = db
|
||||||
self.summary_repo = SummaryRepository(db)
|
self.summary_repo = SummaryRepository(db)
|
||||||
|
self.user_repo = UserRepository(db)
|
||||||
|
|
||||||
async def get_rows(
|
async def get_svod1_rows(
|
||||||
self,
|
self,
|
||||||
year: int,
|
year: int,
|
||||||
sheet: str,
|
sheet: str,
|
||||||
|
user: AppUser,
|
||||||
org_ids: list[int] | None = None,
|
org_ids: list[int] | None = None,
|
||||||
) -> list[tuple]:
|
) -> list[tuple]:
|
||||||
return await self.summary_repo.get_rows(
|
org_ids = await self._allowed_org_ids(user, org_ids)
|
||||||
|
if org_ids == []:
|
||||||
|
return []
|
||||||
|
return await self.summary_repo.get_svod1_rows(
|
||||||
year=year,
|
year=year,
|
||||||
sheet=sheet,
|
sheet=sheet,
|
||||||
org_ids=org_ids,
|
org_ids=org_ids,
|
||||||
@ -24,12 +32,16 @@ class SummaryService:
|
|||||||
self,
|
self,
|
||||||
year: int,
|
year: int,
|
||||||
sheet: str,
|
sheet: str,
|
||||||
|
user: AppUser,
|
||||||
org_ids: list[int] | None = None,
|
org_ids: list[int] | None = None,
|
||||||
offset: int | None = None,
|
offset: int | None = None,
|
||||||
limit: int | None = None,
|
limit: int | None = None,
|
||||||
sort_by: str = "org_name",
|
sort_by: str = "org_name",
|
||||||
sort_direction: str = "asc",
|
sort_direction: str = "asc",
|
||||||
) -> list[tuple]:
|
) -> list[tuple]:
|
||||||
|
org_ids = await self._allowed_org_ids(user, org_ids)
|
||||||
|
if org_ids == []:
|
||||||
|
return []
|
||||||
return await self.summary_repo.get_svod2_rows(
|
return await self.summary_repo.get_svod2_rows(
|
||||||
year=year,
|
year=year,
|
||||||
sheet=sheet,
|
sheet=sheet,
|
||||||
@ -39,3 +51,20 @@ class SummaryService:
|
|||||||
sort_by=sort_by,
|
sort_by=sort_by,
|
||||||
sort_direction=sort_direction,
|
sort_direction=sort_direction,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
async def _allowed_org_ids(
|
||||||
|
self,
|
||||||
|
user: AppUser,
|
||||||
|
requested_org_ids: list[int] | None,
|
||||||
|
) -> list[int] | None:
|
||||||
|
if user.role_id == UserRoleEnum.ADMIN:
|
||||||
|
return requested_org_ids
|
||||||
|
|
||||||
|
db_user = await self.user_repo.get(user_id=user.id, load_orgs=True)
|
||||||
|
if not db_user:
|
||||||
|
return []
|
||||||
|
|
||||||
|
allowed_org_ids = {org.id for org in db_user.org_units}
|
||||||
|
if requested_org_ids is None:
|
||||||
|
return list(allowed_org_ids)
|
||||||
|
return [org_id for org_id in requested_org_ids if org_id in allowed_org_ids]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user