from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Boolean from sqlalchemy.orm import relationship from .base import Base, BaseMixin class Sport(Base, BaseMixin): __tablename__ = "sport" __table_args__ = ( UniqueConstraint("name"), ) name = Column(String(255), nullable=False, index=True, unique=True) teams = relationship("Team") positions = relationship("FieldPosition") class Team(Base, BaseMixin): __tablename__ = "team" name = Column(String(255), nullable=False, index=True, unique=True) short_name = Column(String(255), nullable=False, ) sport_id = Column(String, ForeignKey("sport.id"), nullable=False) sport = relationship("Sport", back_populates="teams") roosters = relationship("Rooster") class FieldPosition(Base, BaseMixin): __tablename__ = "field_position" __table_args__ = ( UniqueConstraint("name", "sport_id"), UniqueConstraint("short_name", "sport_id"), ) name = Column(String(255), nullable=False, index=True) short_name = Column(String(255), nullable=False) sport_id = Column(String, ForeignKey("sport.id"), nullable=False, index=True) sport = relationship("Sport", back_populates="positions") roosters = relationship("Rooster") class Player(Base, BaseMixin): __tablename__ = "player" __table_args__ = ( UniqueConstraint("first_name", "last_name"), ) first_name = Column(String(255), nullable=False, index=True) last_name = Column(String(255), nullable=False, index=True) roosters = relationship("Rooster") def get_full_name(self) -> str: return f"{self.last_name}, {self.first_name}" class Rooster(Base, BaseMixin): __tablename__ = "rooster" __table_args__ = ( UniqueConstraint("year", "team_id", "player_id", "position_id"), ) year = Column(Integer) team_id = Column(String, ForeignKey("team.id"), nullable=False, index=True) team = relationship("Team", back_populates="roosters") player_id = Column(String, ForeignKey("player.id"), nullable=False, index=True) player = relationship("Player", back_populates="roosters") position_id = Column(String, ForeignKey("field_position.id"), nullable=False, index=True) position = relationship("FieldPosition", back_populates="roosters") cards = relationship("Card") class Vendor(Base, BaseMixin): __tablename__ = "vendor" name = Column(String(255), nullable=False, unique=True, index=True) card_sets = relationship("CardSet") cards = relationship("Card") class CardSet(Base, BaseMixin): __tablename__ = "card_set" __table_args__ = ( UniqueConstraint("name", "vendor_id"), ) name = Column(String(255), index=True) parallel_set = Column(Boolean) insert_set = Column(Boolean) vendor_id = Column(String, ForeignKey("vendor.id"), nullable=False, index=True) vendor = relationship("Vendor", back_populates="card_sets") cards = relationship("Card") class Card(Base, BaseMixin): __tablename__ = "card" __table_args__ = ( UniqueConstraint("card_number", "year", "vendor_id", "card_set_id"), ) card_number = Column(Integer, index=True) year = Column(Integer, index=True) card_set_id = Column(String, ForeignKey("card_set.id"), nullable=False) card_set = relationship("CardSet", back_populates="cards") rooster_id = Column(String, ForeignKey("rooster.id"), nullable=False) rooster = relationship("Rooster", back_populates="cards") vendor_id = Column(String, ForeignKey("vendor.id"), nullable=False) vendor = relationship("Vendor", back_populates="cards")