import enum from sqlalchemy import (Column, Integer, String, Date, Enum, Boolean, DECIMAL, Text, TIMESTAMP, ForeignKey) from sqlalchemy.sql import func from sqlalchemy.orm import relationship # Aggiungi questo import from .database import Base # Definiamo gli Enum Python corrispondenti ai tipi custom di PostgreSQL class GenderType(str, enum.Enum): male = "male" female = "female" other = "other" class ShoeSystemType(str, enum.Enum): EU = "EU" US = "US" UK = "UK" class BraSystemType(str, enum.Enum): US = "US" UK = "UK" EU = "EU" FR = "FR" AU = "AU" IT = "IT" JP = "JP" class Image(Base): __tablename__ = "images" id = Column(Integer, primary_key=True, index=True) celebrity_id = Column(Integer, ForeignKey("celebrities.id"), nullable=False) file_path = Column(String, nullable=False) caption = Column(Text, nullable=True) uploaded_at = Column(TIMESTAMP(timezone=True), server_default=func.now()) # Relazione inversa: "questa immagine appartiene a UNA celebrità". # Specifichiamo che deve usare la colonna `celebrity_id` di QUESTA tabella. celebrity = relationship("Celebrity", back_populates="images", foreign_keys=[celebrity_id]) class Celebrity(Base): __tablename__ = "celebrities" id = Column(Integer, primary_key=True, index=True) name = Column(String, unique=True, nullable=False, index=True) gender = Column(Enum(GenderType), nullable=False) birth_date = Column(Date, nullable=True) birth_place = Column(String, nullable=True) nationality = Column(String, nullable=True) ethnicity = Column(String, nullable=True) sexuality = Column(String, nullable=True) hair_color = Column(String, nullable=True) eye_color = Column(String, nullable=True) height_cm = Column(Integer, nullable=True) weight_kg = Column(Integer, nullable=True) body_type = Column(String, nullable=True) bust_cm = Column(Integer, nullable=True) waist_cm = Column(Integer, nullable=True) hips_cm = Column(Integer, nullable=True) chest_circumference_cm = Column(Integer, nullable=True) bra_band_size = Column(Integer, nullable=True) bra_cup_size = Column(String, nullable=True) bra_size_system = Column(Enum(BraSystemType), nullable=True) boobs_are_natural = Column(Boolean, nullable=True) shoe_size = Column(DECIMAL(4, 1), nullable=True) shoe_size_system = Column(Enum(ShoeSystemType), nullable=True) biography = Column(Text, nullable=True) official_website = Column(String, nullable=True) # 1. Relazione "una celebrità ha MOLTE immagini". # SQLAlchemy deve usare la FK che si trova nella tabella Image. images = relationship("Image", back_populates="celebrity", foreign_keys="[Image.celebrity_id]") # Chiave esterna per l'immagine del profilo profile_image_id = Column(Integer, ForeignKey("images.id", ondelete="SET NULL"), nullable=True) # 2. Relazione "una celebrità ha UNA immagine del profilo". # SQLAlchemy deve usare la FK che si trova in QUESTA tabella (celebrities). profile_image = relationship("Image", foreign_keys=[profile_image_id]) created_at = Column(TIMESTAMP(timezone=True), server_default=func.now()) updated_at = Column(TIMESTAMP(timezone=True), default=func.now(), onupdate=func.now()) # Nota: le altre tabelle (images, tattoos, etc.) andrebbero modellate qui # se si volessero gestire le relazioni in modo completo con SQLAlchemy. # Per questo esempio, ci concentriamo solo sulla tabella `celebrities`.