"""Модуль DTO-моделей пользователей""" import re from typing import List from pydantic import ConfigDict, EmailStr, field_validator from sqlmodel import Field, SQLModel class UserBase(SQLModel): """Базовая модель пользователя""" username: str = Field(min_length=3, max_length=50, index=True, unique=True) email: EmailStr = Field(index=True, unique=True) full_name: str | None = Field(default=None, max_length=100) model_config = ConfigDict( json_schema_extra={ "example": { "username": "johndoe", "email": "john@example.com", "full_name": "John Doe", } } ) class UserCreate(UserBase): """Модель пользователя для создания""" password: str = Field(min_length=8, max_length=100) @field_validator("password") @classmethod def validate_password(cls, v: str) -> str: """Валидация пароля""" if not re.search(r"[A-Z]", v): raise ValueError("Пароль должен содержать символы в верхнем регистре") if not re.search(r"[a-z]", v): raise ValueError("Пароль должен содержать символы в нижнем регистре") if not re.search(r"\d", v): raise ValueError("пароль должен содержать цифры") return v class UserLogin(SQLModel): """Модель аутентификации для пользователя""" username: str password: str class UserRead(UserBase): """Модель пользователя для чтения""" id: int is_active: bool is_verified: bool roles: List[str] = [] class UserUpdate(SQLModel): """Модель пользователя для обновления""" email: EmailStr | None = None full_name: str | None = None password: str | None = None class UserList(SQLModel): """Список пользователей""" users: List[UserRead] total: int