mirror of
https://github.com/wowlikon/LiB.git
synced 2026-02-04 20:34:38 +00:00
68 lines
2.1 KiB
Python
68 lines
2.1 KiB
Python
"""Модуль 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
|