Files
anotherboobsdirectory/packages/backend/app/schemas.py
2025-10-10 20:50:46 +02:00

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