Merge pull request 'svod-roles: своды доступны всем по их ссп или рф' (#140) from svod-roles into test

Reviewed-on: #140
This commit is contained in:
tsygankoviva 2026-09-01 13:49:38 +03:00
commit 3c5d51e56e
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 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,

View File

@ -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,

View File

@ -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]