Merge pull request 'org-unit-user-create: список ССП и РФ при создании и обновлении юзеров' (#27) from org-unit-user-create into test

Reviewed-on: #27
This commit is contained in:
tsygankoviva 2026-06-03 16:10:55 +03:00
commit 1a533f46f1
4 changed files with 34 additions and 10 deletions

View File

@ -121,7 +121,7 @@ async def get_user(
@router.put("/", response_model=UserResponse) @router.post("/", response_model=BaseSingleResponse[UserAdminListResponse])
async def create_user( async def create_user(
user_data: UserCreate, user_data: UserCreate,
db: AsyncSession = Depends(get_db), db: AsyncSession = Depends(get_db),
@ -129,10 +129,15 @@ async def create_user(
): ):
user_service = UserService(db) user_service = UserService(db)
user = await user_service.create_user(user_data=user_data, creator=current_user) user = await user_service.create_user(user_data=user_data, creator=current_user)
return UserResponse(success=True, message="Пользователь создан", result=user)
result = UserAdminListResponse.model_validate(user)
if user_data.load_orgs:
result.org_units = []
return BaseSingleResponse(success=True, message="Пользователь создан", result=result)
@router.patch("/{user_id}", response_model=UserResponse) @router.patch("/{user_id}", response_model=BaseSingleResponse[UserAdminListResponse])
async def update_user( async def update_user(
user_id: int, user_id: int,
user_data: UserUpdate, user_data: UserUpdate,
@ -145,7 +150,8 @@ async def update_user(
user_data=user_data, user_data=user_data,
user=current_user, user=current_user,
) )
return UserResponse(success=True, message="Пользователь обновлен", result=user) result = UserAdminListResponse.model_validate(user)
return UserResponse(success=True, message="Пользователь обновлен", result=result)
@router.delete("/{user_id}", response_model=UserResponse) @router.delete("/{user_id}", response_model=UserResponse)

View File

@ -85,6 +85,7 @@ class UserBase(BaseModel):
class UserCreate(UserBase): class UserCreate(UserBase):
password: str | None = Field(default=None, examples=["pass123"]) password: str | None = Field(default=None, examples=["pass123"])
load_orgs: bool = Field(default=False)
model_config = ConfigDict( model_config = ConfigDict(
json_schema_extra={ json_schema_extra={
@ -94,6 +95,7 @@ class UserCreate(UserBase):
"full_name": "Иван Иванов", "full_name": "Иван Иванов",
"role_id": 3, "role_id": 3,
"password": "pass123", "password": "pass123",
"load_orgs": True,
} }
} }
) )
@ -116,6 +118,7 @@ class UserUpdate(BaseModel):
) )
role_id: Optional[int] = None role_id: Optional[int] = None
is_active: Optional[bool] = True is_active: Optional[bool] = True
load_orgs: bool = Field(default=False)
class UserInDB(UserBase): class UserInDB(UserBase):

View File

@ -195,10 +195,15 @@ class UserRepository:
}, },
) )
).scalar_one() ).scalar_one()
await self.db.commit() await self.db.flush()
return await self.get(user_id) return await self.get(user_id)
async def update(self, user_id: int, user_data: dict) -> Optional[AppUser]: async def update(
self,
user_id: int,
user_data: dict,
load_orgs: bool = False,
) -> Optional[AppUser]:
user = await self.get(user_id) user = await self.get(user_id)
if not user: if not user:
return None return None
@ -231,5 +236,7 @@ class UserRepository:
"is_active": user_data.get("is_active"), "is_active": user_data.get("is_active"),
}, },
) )
await self.db.commit() await self.db.flush()
return await self.get(user_id) self.db.expire(user)
result = await self.get(user_id, load_orgs=load_orgs)
return result

View File

@ -90,7 +90,11 @@ class UserService:
if conflict: if conflict:
raise UsernameConflictException() raise UsernameConflictException()
updated = await self.user_repo.update(user_id, update_payload) updated = await self.user_repo.update(
user_id=user_id,
user_data=update_payload,
load_orgs=user_data.load_orgs,
)
if role_id is not None and role is not None: if role_id is not None and role is not None:
had_many_ssp_role = previous_role_id in ( had_many_ssp_role = previous_role_id in (
@ -107,7 +111,11 @@ class UserService:
) )
if (had_many_ssp_role and not has_many_ssp_role_now) or is_executor_to_dfip_transition: if (had_many_ssp_role and not has_many_ssp_role_now) or is_executor_to_dfip_transition:
await self.user_repo.clear_many_ssp(user_id) await self.user_repo.clear_many_ssp(user_id)
if user_data.load_orgs:
updated = self.user_repo.get(
user_id=user_id,
load_orgs=user_data.load_orgs,
)
return updated return updated
async def delete_user(self, user_id: int, user: AppUser): async def delete_user(self, user_id: int, user: AppUser):