org-unit-user-create: список ССП и РФ при создании и обновлении юзеров

This commit is contained in:
tsygankoviv 2026-06-03 16:07:35 +03:00
parent e0dc613c3c
commit f3eb75cf51
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(
user_data: UserCreate,
db: AsyncSession = Depends(get_db),
@ -129,10 +129,15 @@ async def create_user(
):
user_service = UserService(db)
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(
user_id: int,
user_data: UserUpdate,
@ -145,7 +150,8 @@ async def update_user(
user_data=user_data,
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)

View File

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

View File

@ -195,10 +195,15 @@ class UserRepository:
},
)
).scalar_one()
await self.db.commit()
await self.db.flush()
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)
if not user:
return None
@ -231,5 +236,7 @@ class UserRepository:
"is_active": user_data.get("is_active"),
},
)
await self.db.commit()
return await self.get(user_id)
await self.db.flush()
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:
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:
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:
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
async def delete_user(self, user_id: int, user: AppUser):