From 46aaae1423d9a06f2b7f0a8468f9947cdfc2278e Mon Sep 17 00:00:00 2001 From: tsygankoviva Date: Tue, 1 Sep 2026 13:48:25 +0300 Subject: [PATCH] =?UTF-8?q?svod-roles:=20=D1=81=D0=B2=D0=BE=D0=B4=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=BD=D1=8B=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BF=D0=BE=20=D0=B8=D1=85=20=D1=81=D1=81=D0=BF?= =?UTF-8?q?=20=D0=B8=D0=BB=D0=B8=20=D1=80=D1=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/api/v1/summary.py | 10 ++++--- api/src/repository/summary_repository.py | 2 +- api/src/services/summary_service.py | 33 ++++++++++++++++++++++-- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/api/src/api/v1/summary.py b/api/src/api/v1/summary.py index 2e7bbd5..84b2f8d 100644 --- a/api/src/api/v1/summary.py +++ b/api/src/api/v1/summary.py @@ -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, diff --git a/api/src/repository/summary_repository.py b/api/src/repository/summary_repository.py index 1354f3f..781b477 100644 --- a/api/src/repository/summary_repository.py +++ b/api/src/repository/summary_repository.py @@ -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, diff --git a/api/src/services/summary_service.py b/api/src/services/summary_service.py index 2af8c92..eb5550f 100644 --- a/api/src/services/summary_service.py +++ b/api/src/services/summary_service.py @@ -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]