from typing import List, Optional from pydantic import model_validator from schemas.base import BaseSchema, OkMessageSchema from schemas.payrate import PayRateSchema from schemas.position import PositionSchema from schemas.role import RoleSchema # region Entities class PassportImageSchema(BaseSchema): id: int user_id: int image_url: str class UserDepartmentSectionsSchema(BaseSchema): section_id: int is_chief: bool class BasicUser(BaseSchema): telegram_id: int phone_number: str | None = None first_name: str second_name: str patronymic: str = "" comment: str passport_data: str | None = None is_admin: bool is_blocked: bool is_deleted: bool role_key: str pay_rate: Optional[PayRateSchema] = None passport_image_url: str | None = None passport_images: list[PassportImageSchema] | None = [] @model_validator(mode="after") def image_url_to_list(cls, values): passport_images = values.passport_images if not passport_images: return values latest_image = passport_images[-1] values.passport_image_url = latest_image.image_url return values class BaseUser(BasicUser): id: int class UserSchema(BaseUser): role: RoleSchema position: Optional[PositionSchema] = None department_sections: list[UserDepartmentSectionsSchema] | None = [] class UserUpdate(BaseUser): position_key: Optional[str] = None class UserCreate(BasicUser): position_key: Optional[str] = None # endregion # region Requests class UpdateUserRequest(BaseSchema): data: UserUpdate class UpdateUserDepartmentSectionsRequest(BaseSchema): department_sections: list[UserDepartmentSectionsSchema] class CreateUserRequest(BaseSchema): data: UserCreate # endregion # region Responses class GetAllUsersResponse(BaseSchema): users: List[UserSchema] class UpdateUserResponse(OkMessageSchema): pass class UpdateUserDepartmentSectionsResponse(OkMessageSchema): pass class CreateUserResponse(OkMessageSchema): pass class GetManagersResponse(BaseSchema): managers: List[UserSchema] class UploadPassportImageResponse(OkMessageSchema): image_url: str | None = None class GenerateInviteCodeResponse(OkMessageSchema): invite_code: Optional[str] = None # endregion