126 行
5.1 KiB
Python
126 行
5.1 KiB
Python
from __future__ import annotations
|
|
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, JSON
|
|
from sqlalchemy.orm import relationship
|
|
from sqlalchemy.sql import func
|
|
|
|
from app.database import Base
|
|
|
|
|
|
class ProductConfig(Base):
|
|
__tablename__ = "product_config"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
narrative = Column(Text)
|
|
pricing_philosophy = Column(Text)
|
|
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now())
|
|
|
|
versions = relationship("ProductVersion", back_populates="config", cascade="all, delete-orphan", order_by="ProductVersion.sort_order")
|
|
summer_camp = relationship("SummerCamp", back_populates="config", uselist=False, cascade="all, delete-orphan")
|
|
selection_guide = relationship("SelectionGuide", back_populates="config", uselist=False, cascade="all, delete-orphan")
|
|
|
|
|
|
class ProductVersion(Base):
|
|
__tablename__ = "product_versions"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
config_id = Column(Integer, ForeignKey("product_config.id", ondelete="CASCADE"), nullable=False)
|
|
version_id = Column(String(50), unique=True, nullable=False)
|
|
name = Column(String(200), nullable=False)
|
|
days = Column(Integer, nullable=False)
|
|
nights = Column(Integer, nullable=False)
|
|
audience = Column(String(255))
|
|
description = Column(Text)
|
|
tag = Column(String(50))
|
|
sort_order = Column(Integer, default=0)
|
|
|
|
config = relationship("ProductConfig", back_populates="versions")
|
|
highlights = relationship("ProductVersionHighlight", back_populates="version", cascade="all, delete-orphan", order_by="ProductVersionHighlight.sort_order")
|
|
|
|
|
|
class ProductVersionHighlight(Base):
|
|
__tablename__ = "product_version_highlights"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
version_id = Column(Integer, ForeignKey("product_versions.id", ondelete="CASCADE"), nullable=False)
|
|
text = Column(Text, nullable=False)
|
|
sort_order = Column(Integer, default=0)
|
|
|
|
version = relationship("ProductVersion", back_populates="highlights")
|
|
|
|
|
|
class SummerCamp(Base):
|
|
__tablename__ = "summer_camp"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
config_id = Column(Integer, ForeignKey("product_config.id", ondelete="CASCADE"), nullable=False)
|
|
name = Column(String(200))
|
|
positioning = Column(Text)
|
|
days = Column(Integer)
|
|
nights = Column(Integer)
|
|
sessions_json = Column(JSON)
|
|
difference_from_v9 = Column(Text)
|
|
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now())
|
|
|
|
config = relationship("ProductConfig", back_populates="summer_camp")
|
|
principles = relationship("SummerCampPrinciple", back_populates="camp", cascade="all, delete-orphan", order_by="SummerCampPrinciple.sort_order")
|
|
activities = relationship("SummerCampActivity", back_populates="camp", cascade="all, delete-orphan", order_by="SummerCampActivity.sort_order")
|
|
itinerary = relationship("SummerCampItinerary", back_populates="camp", cascade="all, delete-orphan", order_by="SummerCampItinerary.sort_order")
|
|
faq = relationship("SummerCampFaq", back_populates="camp", cascade="all, delete-orphan", order_by="SummerCampFaq.sort_order")
|
|
|
|
|
|
class SummerCampPrinciple(Base):
|
|
__tablename__ = "summer_camp_principles"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
camp_id = Column(Integer, ForeignKey("summer_camp.id", ondelete="CASCADE"), nullable=False)
|
|
text = Column(String(255), nullable=False)
|
|
sort_order = Column(Integer, default=0)
|
|
|
|
camp = relationship("SummerCamp", back_populates="principles")
|
|
|
|
|
|
class SummerCampActivity(Base):
|
|
__tablename__ = "summer_camp_activities"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
camp_id = Column(Integer, ForeignKey("summer_camp.id", ondelete="CASCADE"), nullable=False)
|
|
text = Column(Text, nullable=False)
|
|
sort_order = Column(Integer, default=0)
|
|
|
|
camp = relationship("SummerCamp", back_populates="activities")
|
|
|
|
|
|
class SummerCampItinerary(Base):
|
|
__tablename__ = "summer_camp_itinerary"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
camp_id = Column(Integer, ForeignKey("summer_camp.id", ondelete="CASCADE"), nullable=False)
|
|
text = Column(Text, nullable=False)
|
|
sort_order = Column(Integer, default=0)
|
|
|
|
camp = relationship("SummerCamp", back_populates="itinerary")
|
|
|
|
|
|
class SummerCampFaq(Base):
|
|
__tablename__ = "summer_camp_faq"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
camp_id = Column(Integer, ForeignKey("summer_camp.id", ondelete="CASCADE"), nullable=False)
|
|
question = Column(Text, nullable=False)
|
|
answer = Column(Text, nullable=False)
|
|
sort_order = Column(Integer, default=0)
|
|
|
|
camp = relationship("SummerCamp", back_populates="faq")
|
|
|
|
|
|
class SelectionGuide(Base):
|
|
__tablename__ = "selection_guide"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
config_id = Column(Integer, ForeignKey("product_config.id", ondelete="CASCADE"), nullable=False)
|
|
by_vacation_length = Column(JSON)
|
|
by_child_age = Column(JSON)
|
|
by_preference = Column(JSON)
|
|
|
|
config = relationship("ProductConfig", back_populates="selection_guide")
|