diff --git a/api/src/api/v1/forms.py b/api/src/api/v1/forms.py index dfeb922..f831e00 100644 --- a/api/src/api/v1/forms.py +++ b/api/src/api/v1/forms.py @@ -79,6 +79,23 @@ async def get_forms( ) +@router.get("/{form_id}") +async def get_form( + form_id: int, + db: AsyncSession = Depends(get_db), + current_user: AppUser = Depends(get_current_active_user_with_set_db), +) -> BaseSingleResponse[BudgetFormResponse]: + bf_service = BudgetFormService(db) + form = await bf_service.get( + user=current_user, + budget_form_id=form_id, + load_org=True, + ) + return BaseSingleResponse( + result = BudgetFormResponse.model_validate(form), + ) + + @router.get("/{form_id}/sheets") async def get_form_sheets( form_id: int, diff --git a/api/src/repository/budget_form_repository.py b/api/src/repository/budget_form_repository.py index 5d719b3..1335cbc 100644 --- a/api/src/repository/budget_form_repository.py +++ b/api/src/repository/budget_form_repository.py @@ -60,6 +60,7 @@ class BudgetFormRepository: budget_form_id: int, org_unit: int | list[int] | None = None, load_form_type: bool = False, + load_org: bool = False, ) -> BudgetForm | None: query = select(BudgetForm) @@ -71,6 +72,10 @@ class BudgetFormRepository: where.append(BudgetForm.org_unit_id.in_(org_unit)) query = query.where(*where) + if load_org: + query = query.options( + joinedload(BudgetForm.org_unit) + ) if load_form_type: query = query.options( diff --git a/api/src/services/budget_form_service.py b/api/src/services/budget_form_service.py index 8091310..9221e1a 100644 --- a/api/src/services/budget_form_service.py +++ b/api/src/services/budget_form_service.py @@ -47,11 +47,13 @@ class BudgetFormService: budget_form_id: int, user: AppUser, load_form_type: bool = False, + load_org: bool = False, ) -> list[BudgetForm] | tuple[int, list[BudgetForm]]: if user.role_id == UserRoleEnum.ADMIN: return await self.bf_repo.get( budget_form_id=budget_form_id, load_form_type=load_form_type, + load_org=load_org, ) user = await self.user_repo.get( user_id=user.id, @@ -61,4 +63,5 @@ class BudgetFormService: budget_form_id=budget_form_id, org_unit=[ou.id for ou in user.org_units], load_form_type=load_form_type, + load_org=load_org, ) diff --git a/api/tests/integration/test_forms_api_smoke.py b/api/tests/integration/test_forms_api_smoke.py index 4bd4ee6..f587926 100644 --- a/api/tests/integration/test_forms_api_smoke.py +++ b/api/tests/integration/test_forms_api_smoke.py @@ -10,6 +10,14 @@ def test_forms_list_smoke(client, admin_tokens, auth_headers): assert isinstance(payload["result"], list) +def test_form_smoke(client, admin_tokens, auth_headers): + response = client.get("/api/v1/form/1", headers=auth_headers(admin_tokens)) + assert response.status_code == 200 + payload = response.json() + assert "result" in payload + assert isinstance(payload["result"], dict) + + def test_forms_sheets_not_found_error_shape(client, admin_tokens, auth_headers): response = client.get( "/api/v1/form/999/sheets", headers=auth_headers(admin_tokens)