112 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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
 | 
						|
 | 
						|
# endregion
 |