from __future__ import annotations from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, JSON, Enum from sqlalchemy.orm import relationship from sqlalchemy.sql import func from app.database import Base class VersionConfig(Base): __tablename__ = "version_config" id = Column(Integer, primary_key=True, autoincrement=True) stats_iterations = Column(Integer) stats_years = Column(Integer) stats_guests = Column(String(50)) quote_text = Column(Text) quote_author = Column(String(200)) updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now()) upgrades = relationship("VersionUpgrade", back_populates="config", cascade="all, delete-orphan", order_by="VersionUpgrade.sort_order") highlights = relationship("VersionHighlight", back_populates="config", cascade="all, delete-orphan", order_by="VersionHighlight.sort_order") compare = relationship("VersionCompare", back_populates="config", uselist=False, cascade="all, delete-orphan") timeline = relationship("VersionTimeline", back_populates="config", cascade="all, delete-orphan", order_by="VersionTimeline.sort_order") philosophy = relationship("VersionPhilosophy", back_populates="config", cascade="all, delete-orphan", order_by="VersionPhilosophy.sort_order") class VersionUpgrade(Base): __tablename__ = "version_upgrades" id = Column(Integer, primary_key=True, autoincrement=True) config_id = Column(Integer, ForeignKey("version_config.id", ondelete="CASCADE"), nullable=False) tag = Column(String(50)) name = Column(String(200)) description = Column(Text) reason = Column(Text) sort_order = Column(Integer, default=0) config = relationship("VersionConfig", back_populates="upgrades") class VersionHighlight(Base): __tablename__ = "version_highlights" id = Column(Integer, primary_key=True, autoincrement=True) config_id = Column(Integer, ForeignKey("version_config.id", ondelete="CASCADE"), nullable=False) label = Column(String(50)) text = Column(Text) sort_order = Column(Integer, default=0) config = relationship("VersionConfig", back_populates="highlights") class VersionCompare(Base): __tablename__ = "version_compare" id = Column(Integer, primary_key=True, autoincrement=True) config_id = Column(Integer, ForeignKey("version_config.id", ondelete="CASCADE"), nullable=False) headers = Column(JSON) rows = Column(JSON) config = relationship("VersionConfig", back_populates="compare") class VersionTimeline(Base): __tablename__ = "version_timeline" id = Column(Integer, primary_key=True, autoincrement=True) config_id = Column(Integer, ForeignKey("version_config.id", ondelete="CASCADE"), nullable=False) version = Column(String(20), nullable=False) date = Column(String(20)) title = Column(String(200)) reason = Column(Text) sort_order = Column(Integer, default=0) config = relationship("VersionConfig", back_populates="timeline") changes = relationship("VersionTimelineChange", back_populates="timeline", cascade="all, delete-orphan", order_by="VersionTimelineChange.sort_order") class VersionTimelineChange(Base): __tablename__ = "version_timeline_changes" id = Column(Integer, primary_key=True, autoincrement=True) timeline_id = Column(Integer, ForeignKey("version_timeline.id", ondelete="CASCADE"), nullable=False) type = Column(Enum("add", "update", "remove"), nullable=False) text = Column(Text, nullable=False) sort_order = Column(Integer, default=0) timeline = relationship("VersionTimeline", back_populates="changes") class VersionPhilosophy(Base): __tablename__ = "version_philosophy" id = Column(Integer, primary_key=True, autoincrement=True) config_id = Column(Integer, ForeignKey("version_config.id", ondelete="CASCADE"), nullable=False) label = Column(String(50)) text = Column(Text) sort_order = Column(Integer, default=0) config = relationship("VersionConfig", back_populates="philosophy")