Merge pull request 'svod-roles: своды доступны всем по их ссп или рф' (#140) from svod-roles into test
Reviewed-on: #140
This commit is contained in:
commit
3c5d51e56e
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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]
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user