"""Schémas Pydantic pour les emplacements. Définit les schémas de validation pour les requêtes et réponses API. """ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from app.models.location import LocationType class LocationBase(BaseModel): """Schéma de base pour les emplacements.""" name: str = Field(..., min_length=1, max_length=100, description="Nom de l'emplacement") type: LocationType = Field(..., description="Type d'emplacement") description: str | None = Field(None, max_length=500, description="Description optionnelle") class LocationCreate(LocationBase): """Schéma pour la création d'un emplacement.""" parent_id: int | None = Field(None, description="ID du parent (None si racine)") class LocationUpdate(BaseModel): """Schéma pour la mise à jour d'un emplacement (tous les champs optionnels).""" name: str | None = Field(None, min_length=1, max_length=100) type: LocationType | None = None description: str | None = Field(None, max_length=500) parent_id: int | None = None class LocationResponse(LocationBase): """Schéma de réponse pour un emplacement.""" model_config = ConfigDict(from_attributes=True) id: int parent_id: int | None path: str created_at: datetime updated_at: datetime class LocationWithChildren(LocationResponse): """Schéma de réponse avec les enfants.""" children: list["LocationWithChildren"] = Field(default_factory=list) class LocationWithItemCount(LocationResponse): """Schéma de réponse avec le nombre d'objets.""" item_count: int = Field(default=0, description="Nombre d'objets à cet emplacement") class LocationTree(BaseModel): """Schéma pour l'arborescence complète des emplacements.""" id: int name: str type: LocationType path: str children: list["LocationTree"] = Field(default_factory=list) item_count: int = 0 model_config = ConfigDict(from_attributes=True)