from pydantic import BaseModel, HttpUrl from typing import Optional, List from datetime import date, datetime from .models import GenderType, ShoeSystemType, BraSystemType, SurgeryType # ============================================================================= # SCHEMI PER I MODELLI CORRELATI (LOOKUP E SATELLITE) # ============================================================================= # --- Profession --- class ProfessionBase(BaseModel): name: str class ProfessionCreate(ProfessionBase): pass class Profession(ProfessionBase): id: int class Config: from_attributes = True # --- Studio --- class StudioBase(BaseModel): name: str class StudioCreate(StudioBase): pass class Studio(StudioBase): id: int class Config: from_attributes = True # --- Tattoo --- class TattooBase(BaseModel): description: str body_location: Optional[str] = None class TattooCreate(TattooBase): pass class Tattoo(TattooBase): id: int celebrity_id: int class Config: from_attributes = True # --- Alias --- class CelebrityAliasBase(BaseModel): alias_name: str class CelebrityAliasCreate(CelebrityAliasBase): pass class CelebrityAlias(CelebrityAliasBase): id: int celebrity_id: int class Config: from_attributes = True # --- Cosmetic Surgery --- class CosmeticSurgeryBase(BaseModel): surgery_type: SurgeryType surgery_date: Optional[date] = None new_bra_band_size: Optional[int] = None new_bra_cup_size: Optional[str] = None new_bra_size_system: Optional[BraSystemType] = None notes: Optional[str] = None class CosmeticSurgeryCreate(CosmeticSurgeryBase): pass class CosmeticSurgery(CosmeticSurgeryBase): id: int celebrity_id: int created_at: datetime class Config: from_attributes = True # --- Image --- class ImageBase(BaseModel): file_path: str caption: Optional[str] = None class ImageCreate(ImageBase): pass class Image(ImageBase): id: int celebrity_id: int uploaded_at: datetime class Config: from_attributes = True # --- Richiesta per impostare l'immagine del profilo --- class SetProfileImageRequest(BaseModel): image_id: int class ImageUrlRequest(BaseModel): url: HttpUrl # Pydantic valida automaticamente che sia un URL valido # ============================================================================= # SCHEMI PER CELEBRITY # ============================================================================= # Schema di base con i campi comuni class CelebrityBase(BaseModel): name: str gender: GenderType birth_date: Optional[date] = None birth_place: Optional[str] = None nationality: Optional[str] = None ethnicity: Optional[str] = None sexuality: Optional[str] = None hair_color: Optional[str] = None eye_color: Optional[str] = None height_cm: Optional[int] = None weight_kg: Optional[int] = None body_type: Optional[str] = None bust_cm: Optional[int] = None waist_cm: Optional[int] = None hips_cm: Optional[int] = None chest_circumference_cm: Optional[int] = None bra_band_size: Optional[int] = None bra_cup_size: Optional[str] = None bra_size_system: Optional[BraSystemType] = None boobs_are_natural: Optional[bool] = None shoe_size: Optional[float] = None shoe_size_system: Optional[ShoeSystemType] = None biography: Optional[str] = None official_website: Optional[str] = None profile_image_id: Optional[int] = None # Schema per la creazione di una nuova celebrità (eredita da Base) class CelebrityCreate(CelebrityBase): pass # Schema per l'aggiornamento (tutti i campi sono opzionali) class CelebrityUpdate(BaseModel): name: Optional[str] = None gender: Optional[GenderType] = None birth_date: Optional[date] = None birth_place: Optional[str] = None nationality: Optional[str] = None ethnicity: Optional[str] = None sexuality: Optional[str] = None hair_color: Optional[str] = None eye_color: Optional[str] = None height_cm: Optional[int] = None weight_kg: Optional[int] = None body_type: Optional[str] = None bust_cm: Optional[int] = None waist_cm: Optional[int] = None hips_cm: Optional[int] = None chest_circumference_cm: Optional[int] = None bra_band_size: Optional[int] = None bra_cup_size: Optional[str] = None bra_size_system: Optional[BraSystemType] = None boobs_are_natural: Optional[bool] = None shoe_size: Optional[float] = None shoe_size_system: Optional[ShoeSystemType] = None biography: Optional[str] = None official_website: Optional[str] = None profile_image_id: Optional[int] = None # Schema per la lettura dei dati (include campi generati dal DB e le relazioni) class Celebrity(CelebrityBase): id: int created_at: datetime updated_at: datetime # Campi relazionali che verranno popolati automaticamente da SQLAlchemy profile_image: Optional[Image] = None images: List[Image] = [] tattoos: List[Tattoo] = [] aliases: List[CelebrityAlias] = [] # Per semplicità, possiamo usare qui gli schemi di base, # ma in un'app reale potresti volere schemi specifici per la "lettura". professions: List[Profession] = [] studios: List[Studio] = [] cosmetic_surgeries: List[CosmeticSurgery] = [] class Config: from_attributes = True # Permette a Pydantic di leggere dati da un modello ORM