from pydantic import BaseModel, EmailStr from typing import Optional, List from datetime import datetime # User Schemas class UserBase(BaseModel): name: str email: EmailStr rol: str = "operator" active: bool = True class UserCreate(UserBase): password: str class UserUpdate(BaseModel): name: Optional[str] = None email: Optional[EmailStr] = None password: Optional[str] = None rol: Optional[str] = None active: Optional[bool] = None class UserResponse(UserBase): id: int creation_time: datetime update_time: datetime class Config: from_attributes = True class UserWithModifications(UserResponse): modifications: List["ModificationSimple"] = [] # Audit Schemas class ModificationSimple(BaseModel): id: int action: str updated_attribute: Optional[str] = None before_value: Optional[str] = None after_value: Optional[str] = None modification_date: datetime class Config: from_attributes = True class ModificationResponse(ModificationSimple): user: Optional[UserResponse] = None updater: Optional[UserResponse] = None # Auth Schemas class Token(BaseModel): access_token: str token_type: str user: UserResponse class TokenData(BaseModel): user_id: Optional[int] = None class LoginRequest(BaseModel): email: EmailStr password: str class RoleChangeRequest(BaseModel): new_role: str # Resolver referencias circulares UserWithModifications.model_rebuild() ModificationResponse.model_rebuild()