from pydantic import BaseModel, Field, EmailStr, constr,validator from typing import List, Optional from enum import IntEnum from datetime import datetime #Валидация пароля import re def check_password_complexity(cls, password): #Проверка пароля на соответствие сложности if password is None: return password if not re.search(r'[A-Za-z]', password): raise ValueError('Password must contain at least one letter') if not re.search(r'\d', password): raise ValueError('Password must contain at least one digit') if not re.search(r'[!@#$%^&*(),.?":{}|<>]', password): raise ValueError('Password must contain at least one special symbol') return password #Валидация полей с пользователями class UsersInfo(BaseModel): email:EmailStr = Field(..., min_length=6, max_length=254, description="email of the user") description: str = Field(..., description="description of the user") activated:bool = Field(..., description="Has the user activated their account") password:constr(min_length=8) = Field(..., description="Password with min 8 chars, letters and digits") @validator('password') def password_validator(cls, password): return check_password_complexity(cls, password) class CreateUser(UsersInfo): pass class UserUpdate(BaseModel): email:Optional[EmailStr] = Field(None, min_length=6, max_length=254, description="users' email") description:Optional[str] = Field(None, description="description of the user") activated:Optional[bool] = Field(None, description="Has the user activated their account") password:Optional[constr(min_length=8)] = Field(None, description="Password with min 8 chars, letters and digits") can_edit:Optional[bool] = Field(None, description="The user can edit something") can_delete:Optional[bool] = Field(None, description="The user can delete something") can_view:Optional[bool]=Field(None, descriptiopn="The user can view something") @validator('password') def password_validator(cls, password): return check_password_complexity(cls, password) class UserLogin(BaseModel): email:EmailStr = Field(..., min_length=6, max_length=254, description="user's email") password:str = Field(..., description="Password") class UserReset(BaseModel): email:EmailStr = Field(..., min_length=6, max_length=254, description="user's email") new_password:constr(min_length=8) = Field(None,description="New_password") @validator('new_password') def password_validator(cls, new_password): return check_password_complexity(cls, new_password) class UserOut(BaseModel): email:EmailStr description:str activated:bool created_at:datetime