167 lines
5.3 KiB
Python
167 lines
5.3 KiB
Python
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 |