# modules/users/schemas.py from pydantic import BaseModel, EmailStr, Field, validator from datetime import datetime from typing import Optional # import re from enum import Enum class TipoUsuario(str, Enum): ROOT = "root" ADMIN = "admin" ADMIN_LICENCIAS = "admin_licencias" USER = "user" class RolOperativo(str, Enum): COMPRAS ="compras" VENTAS ="ventas" LOGISTICA ="logistica" ADUANA_SOFT ="aduana_soft" CLIENTE ="cliente" OPERATIVO ="operativo" # ============================================ # BASE SCHEMAS # ============================================ class UserBase(BaseModel): name: str = Field(...) middle_Name: Optional[str] = Field(None) last_Name: str = Field(...) rfc: str = Field(..., example="PORF8513JH3") email: EmailStr tipo_usuario: TipoUsuario rol_operativo: RolOperativo permite_diot: bool = False class UserCreate(UserBase): password: str = Field(..., min_length=8) enterprise_id: Optional[int] = Field(None) firma: Optional[str] = Field(None) @validator("password") def validate_password(cls, v): if len(v) < 8: raise ValueError("La contrasena debe tener al menos 8 caracteres") if not re.search(r"[A-Z]", v): raise ValueError("La contrasena debe contenera la emnos una mayuscula") return v class UserResponse(UserBase): id: int is_active: bool last_login: datetime created_by: Optional[int] updated_by: Optional[int] deleted_by: Optional[int] created_at: datetime updated_at: Optional[datetime] deleted_at: Optional[datetime] class Config: from_attributes = True class UpdateUser(UserBase): name: Optional[str] = None middle_Name: Optional[str] = None last_Name: Optional[str] = None rfc: Optional[str] = None email: Optional[EmailStr] = None permite_diot: bool = None rol_operativo: Optional[RolOperativo] = None tipo_usuario: Optional[TipoUsuario] = None firma: Optional[str] = Field(None, max_length=110) brnaches_id: Optional[int] = None license_id: Optional[int] = None is_active: Optional[bool] = None class Config: from_attributes = True #============================================ class UserLogin(BaseModel): email: EmailStr = Field(..., examples=["User@example.com"]) password: str = Field(..., min_length=8) class LoginResponse(BaseModel): access_token: str token_type: str = "bearer" class DeleteResponse(BaseModel): message: str