From 209e1a5fe787fbd7f0b68669955c23d4fe21271e Mon Sep 17 00:00:00 2001 From: tsygankoviva Date: Mon, 31 Aug 2026 16:54:19 +0300 Subject: [PATCH 1/4] =?UTF-8?q?phase-edit-fix:=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BE=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20justification=20=D0=B2=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B5=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/db/models/form_type.py | 2 +- api/src/domain/schemas.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/db/models/form_type.py b/api/src/db/models/form_type.py index 27384fb..9137add 100644 --- a/api/src/db/models/form_type.py +++ b/api/src/db/models/form_type.py @@ -41,7 +41,7 @@ class FormType(Base): FormTypeEnum.FORM_1: ["plan", "contract_summary", "allocation", "sequestration", "reserve", "approved", "collegial", "ckk", "contract_detail", "q1", "q2", "q3", "q4", "totals"], FormTypeEnum.FORM_2: ["plan", "seq_dfip", "seq_ssp", "approved", "contract", "booking", "q1", "q2", "q3", "q4", "totals", "contract_summary", "allocation", "collegial", "ckk", "fact_q1", "fact_q2", "fact_q3", "fact_q4"], FormTypeEnum.FORM_3: ["q1", "q2", "q3", "q4", "year"], - FormTypeEnum.FORM_4: ["plan", "seq_dfip", "approved", "contract", "booking", "q1", "q2", "q3", "q4", "totals", "contract_summary", "allocation", "reserve", "collegial", "ckk"], + FormTypeEnum.FORM_4: ["header", "plan", "seq_dfip", "approved", "contract", "booking", "q1", "q2", "q3", "q4", "totals", "contract_summary", "allocation", "reserve", "collegial", "ckk"], } _sheet_list_with_directions = { diff --git a/api/src/domain/schemas.py b/api/src/domain/schemas.py index b34328b..d9d8ad8 100644 --- a/api/src/domain/schemas.py +++ b/api/src/domain/schemas.py @@ -3,7 +3,7 @@ import enum from typing import Any, Dict, Generic, List, Literal, Optional, TypeVar from sqlalchemy.exc import MissingGreenlet -FormPhaseRole = Literal["DFIP", "EXECUTOR_RF", "ADMIN"] +FormPhaseRole = Literal["DFIP", "EXECUTOR_RF", "ADMIN", "DURRS"] from pydantic import BaseModel, ConfigDict, EmailStr, Field, field_validator, model_validator From c7d566086eddf90836f485d310242650d6138779 Mon Sep 17 00:00:00 2001 From: tsygankoviva Date: Tue, 1 Sep 2026 10:28:18 +0300 Subject: [PATCH 2/4] =?UTF-8?q?new-role-fix:=20=D1=84=D0=B8=D0=BA=D1=81=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=BE=D0=B2=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=80=D0=BE=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/api/v1/deps.py | 9 +++++++-- api/src/api/v1/users.py | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/api/src/api/v1/deps.py b/api/src/api/v1/deps.py index 1093752..29038d2 100644 --- a/api/src/api/v1/deps.py +++ b/api/src/api/v1/deps.py @@ -102,6 +102,7 @@ def require_executor( UserRoleEnum.ADMIN, UserRoleEnum.EXECUTOR_DFIP, UserRoleEnum.EXECUTOR_RF, + UserRoleEnum.EXECUTOR_DURRS, ]: raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, @@ -110,10 +111,14 @@ def require_executor( return current_user -def require_executor_dfip( +def require_executor_dfip_or_durrs( current_user: AppUser = Depends(get_current_active_user_with_set_db), ) -> AppUser: - if current_user.role_id not in [UserRoleEnum.ADMIN, UserRoleEnum.EXECUTOR_DFIP]: + if current_user.role_id not in [ + UserRoleEnum.ADMIN, + UserRoleEnum.EXECUTOR_DFIP, + UserRoleEnum.EXECUTOR_DURRS, + ]: raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="Недостаточно прав", diff --git a/api/src/api/v1/users.py b/api/src/api/v1/users.py index aeba3ce..1469867 100644 --- a/api/src/api/v1/users.py +++ b/api/src/api/v1/users.py @@ -4,7 +4,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from src.api.v1.deps import ( get_current_active_user, require_admin, - require_executor_dfip, + require_executor_dfip_or_durrs, ) from src.db.session import get_db from src.db.models.app_user import AppUser @@ -65,7 +65,7 @@ async def get_users( async def get_many_ssp( user_id: int, db: AsyncSession = Depends(get_db), - current_user: AppUser = Depends(require_executor_dfip), + current_user: AppUser = Depends(require_executor_dfip_or_durrs), ): user_service = UserService(db) ssp_list = await user_service.get_many_ssp(user_id, current_user) From 02d33a3314ca5d1fce437f5b39384f9302a67eef Mon Sep 17 00:00:00 2001 From: tsygankoviva Date: Tue, 1 Sep 2026 11:16:57 +0300 Subject: [PATCH 3/4] =?UTF-8?q?new-role-fix:=20=D0=B2=D1=8B=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=20=D1=81=D1=81=D0=BF=20=D0=B4=D0=BB=D1=8F=20=D0=B4=D1=83?= =?UTF-8?q?=D1=80=D1=80=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/pages/AdminPanel/UsersPage/ModalEditUserSsp.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/pages/AdminPanel/UsersPage/ModalEditUserSsp.jsx b/web/src/pages/AdminPanel/UsersPage/ModalEditUserSsp.jsx index 2385a5d..62a6679 100644 --- a/web/src/pages/AdminPanel/UsersPage/ModalEditUserSsp.jsx +++ b/web/src/pages/AdminPanel/UsersPage/ModalEditUserSsp.jsx @@ -104,7 +104,7 @@ export const ModalEditUserSsp = ({ open, onClose, user, deps = [], onEdit }) => }> - {curUser.role_id == ROLES_NAME_ID['executor_dfip'] && ( + {[ROLES_NAME_ID['executor_dfip'], ROLES_NAME_ID['executor_durrs']].includes(curUser.role_id) && ( Date: Tue, 1 Sep 2026 11:37:02 +0300 Subject: [PATCH 4/4] =?UTF-8?q?new-role-fix:=20=D0=B2=D1=8B=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=20=D1=81=D1=81=D0=BF=20=D0=B4=D0=BB=D1=8F=20=D0=B4=D1=83?= =?UTF-8?q?=D1=80=D1=80=D1=81=20=D1=84=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/services/user_service.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/src/services/user_service.py b/api/src/services/user_service.py index 009f2e7..091b2a9 100644 --- a/api/src/services/user_service.py +++ b/api/src/services/user_service.py @@ -160,6 +160,7 @@ class UserService: UserRoleEnum.ADMIN.value, UserRoleEnum.EXECUTOR_DFIP.value, UserRoleEnum.EXECUTOR_RF.value, + UserRoleEnum.EXECUTOR_DURRS.value, ): err = AccessDeniedException() err.description = ( @@ -190,6 +191,7 @@ class UserService: UserRoleEnum.ADMIN.value, UserRoleEnum.EXECUTOR_DFIP.value, UserRoleEnum.EXECUTOR_RF.value, + UserRoleEnum.EXECUTOR_DURRS.value, ): err = AccessDeniedException() err.description = (