svod-roles: своды доступны всем по их ссп или рф

This commit is contained in:
tsygankoviva 2026-09-01 13:48:25 +03:00
parent 158409ef73
commit 46aaae1423
3 changed files with 38 additions and 7 deletions

View File

@ -5,7 +5,7 @@ from typing import Literal, Optional
from fastapi import APIRouter, Depends, HTTPException, Query, Response
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.session import get_db
from src.domain.schemas import BaseListResponse, SheetResponse
@ -54,7 +54,7 @@ async def get_summary(
response: Response,
org_ids: Optional[str] = None,
db: AsyncSession = Depends(get_db),
current_user: AppUser = Depends(require_admin),
current_user: AppUser = Depends(get_current_user),
) -> BaseListResponse[SheetResponse]:
if sheet not in VALID_SUMMARY_SHEETS:
raise HTTPException(
@ -64,9 +64,10 @@ async def get_summary(
t0 = time.perf_counter()
summary_service = SummaryService(db)
rows = await summary_service.get_rows(
rows = await summary_service.get_svod1_rows(
year=year,
sheet=sheet,
user=current_user,
org_ids=_parse_org_ids(org_ids),
)
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_direction: Literal["asc", "desc"] = "asc",
db: AsyncSession = Depends(get_db),
current_user: AppUser = Depends(require_admin),
current_user: AppUser = Depends(get_current_user),
) -> BaseListResponse[SheetResponse]:
sheet = sheet.upper()
if sheet not in VALID_SUMMARY2_SHEETS:
@ -114,6 +115,7 @@ async def get_summary2(
rows = await summary_service.get_svod2_rows(
year=year,
sheet=sheet,
user=current_user,
org_ids=_parse_org_ids(org_ids),
offset=offset,
limit=limit,

View File

@ -6,7 +6,7 @@ class SummaryRepository:
def __init__(self, db: AsyncSession):
self.db = db
async def get_rows(
async def get_svod1_rows(
self,
year: int,
sheet: str,

View File

@ -1,20 +1,28 @@
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.user_repository import UserRepository
class SummaryService:
def __init__(self, db: AsyncSession):
self.db = db
self.summary_repo = SummaryRepository(db)
self.user_repo = UserRepository(db)
async def get_rows(
async def get_svod1_rows(
self,
year: int,
sheet: str,
user: AppUser,
org_ids: list[int] | None = None,
) -> 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,
sheet=sheet,
org_ids=org_ids,
@ -24,12 +32,16 @@ class SummaryService:
self,
year: int,
sheet: str,
user: AppUser,
org_ids: list[int] | None = None,
offset: int | None = None,
limit: int | None = None,
sort_by: str = "org_name",
sort_direction: str = "asc",
) -> list[tuple]:
org_ids = await self._allowed_org_ids(user, org_ids)
if org_ids == []:
return []
return await self.summary_repo.get_svod2_rows(
year=year,
sheet=sheet,
@ -39,3 +51,20 @@ class SummaryService:
sort_by=sort_by,
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]