117 lines
4.1 KiB
Python
117 lines
4.1 KiB
Python
from sqlalchemy import (
|
|
Column,
|
|
Integer,
|
|
String,
|
|
Text,
|
|
Numeric,
|
|
Boolean,
|
|
Date,
|
|
JSON,
|
|
)
|
|
from sqlalchemy.orm import DeclarativeBase
|
|
|
|
|
|
class Base(DeclarativeBase):
|
|
pass
|
|
|
|
|
|
class Program(Base):
|
|
__tablename__ = "programs"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
day_of_week = Column(Integer, nullable=False) # 1=Mon … 7=Sun
|
|
day_label = Column(String(10), nullable=False) # "Monday", …
|
|
time = Column(String(10), nullable=False) # "6:00 AM"
|
|
title = Column(String(200), nullable=False)
|
|
host = Column(String(100), nullable=False)
|
|
genre = Column(String(80), nullable=False)
|
|
|
|
|
|
class Event(Base):
|
|
__tablename__ = "events"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
date = Column(Date, nullable=False)
|
|
title = Column(String(200), nullable=False)
|
|
description = Column(Text, nullable=False)
|
|
location = Column(String(200), nullable=False)
|
|
icon = Column(String(10), nullable=False)
|
|
rsvp_url = Column(String(500), nullable=True)
|
|
active = Column(Boolean, default=True)
|
|
|
|
|
|
class DonationTier(Base):
|
|
__tablename__ = "donation_tiers"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
name = Column(String(50), unique=True, nullable=False)
|
|
amount = Column(Numeric(10, 2), nullable=False)
|
|
icon = Column(String(10), nullable=False)
|
|
benefits = Column(JSON, nullable=False)
|
|
display_order = Column(Integer, nullable=False)
|
|
|
|
|
|
class StationConfig(Base):
|
|
__tablename__ = "station_config"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
key = Column(String(20), unique=True, nullable=False, default="default")
|
|
|
|
# Identity
|
|
callsign = Column(String(10), nullable=False, default="KMTN")
|
|
name_primary = Column(String(100), nullable=False, default="KMountain")
|
|
name_secondary = Column(String(100), nullable=False, default="Flower Radio")
|
|
tagline = Column(String(200), nullable=False, default="Community Radio — Est. 1987")
|
|
frequency = Column(String(10), nullable=False, default="98.7 FM")
|
|
founded_year = Column(Integer, nullable=False, default=1987)
|
|
|
|
# Nonprofit
|
|
nonprofit_type = Column(String(10), nullable=False, default="501(c)(3)")
|
|
ein = Column(String(20), nullable=False, default="84-XXXXXXX")
|
|
|
|
# Images (URL strings relative to app root)
|
|
logo_url = Column(String(500), nullable=False, default="svg/small-flower.svg")
|
|
hero_background_url = Column(String(500), nullable=False, default="svg/mountain-landscape.svg")
|
|
hero_icon_url = Column(String(500), nullable=False, default="svg/orange-flower.svg")
|
|
hero_divider_url = Column(String(500), nullable=False, default="svg/mountain-divider.svg")
|
|
|
|
# Contact
|
|
address = Column(Text, nullable=False, default="42 Pine Street\nMountain View, CO 80424")
|
|
phone = Column(String(30), nullable=False, default="(970) 555-0198")
|
|
email = Column(String(100), nullable=False, default="hello@kmountainflower.org")
|
|
website = Column(String(200), nullable=False, default="kmountainflower.org")
|
|
|
|
|
|
class HistoryEntry(Base):
|
|
__tablename__ = "history_entries"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
year = Column(Integer, nullable=False)
|
|
title = Column(String(200), nullable=False)
|
|
body = Column(Text, nullable=False)
|
|
display_order = Column(Integer, nullable=False)
|
|
active = Column(Boolean, default=True)
|
|
|
|
|
|
class TeamMember(Base):
|
|
__tablename__ = "team_members"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
name = Column(String(100), nullable=False)
|
|
title = Column(String(150), nullable=False)
|
|
bio = Column(Text, nullable=True)
|
|
photo_url = Column(String(500), nullable=True)
|
|
display_order = Column(Integer, nullable=False)
|
|
active = Column(Boolean, default=True)
|
|
|
|
|
|
class CommunityHighlight(Base):
|
|
__tablename__ = "community_highlights"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
icon = Column(String(10), nullable=False)
|
|
title = Column(String(200), nullable=False)
|
|
description = Column(Text, nullable=False)
|
|
display_order = Column(Integer, nullable=False)
|
|
active = Column(Boolean, default=True)
|