71 lines
2.8 KiB
Python
71 lines
2.8 KiB
Python
from datetime import datetime
|
|
from . import db
|
|
|
|
|
|
class Session(db.Model):
|
|
__tablename__ = "sessions"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
code = db.Column(db.String(6), unique=True, nullable=False, index=True)
|
|
status = db.Column(db.String(20), nullable=False, default="waiting")
|
|
current_recipe_index = db.Column(db.Integer, nullable=False, default=0)
|
|
matched_recipe_id = db.Column(db.Integer, db.ForeignKey("recipes.id"), nullable=True)
|
|
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
|
|
|
|
participants = db.relationship("Participant", backref="session", cascade="all, delete-orphan")
|
|
settings = db.relationship("SessionSettings", backref="session", cascade="all, delete-orphan", uselist=False)
|
|
recipes = db.relationship(
|
|
"Recipe",
|
|
backref="session",
|
|
cascade="all, delete-orphan",
|
|
foreign_keys="Recipe.session_id",
|
|
order_by="Recipe.position",
|
|
)
|
|
|
|
|
|
class Participant(db.Model):
|
|
__tablename__ = "participants"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
session_id = db.Column(db.Integer, db.ForeignKey("sessions.id"), nullable=False)
|
|
name = db.Column(db.String(80), nullable=False)
|
|
is_host = db.Column(db.Boolean, nullable=False, default=False)
|
|
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
|
|
|
|
|
|
class SessionSettings(db.Model):
|
|
__tablename__ = "session_settings"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
session_id = db.Column(db.Integer, db.ForeignKey("sessions.id"), nullable=False, unique=True)
|
|
required_likes = db.Column(db.Integer, nullable=False, default=2)
|
|
match_mode = db.Column(db.String(20), nullable=False, default="first_match")
|
|
voting_round = db.Column(db.Integer, nullable=False, default=1)
|
|
|
|
|
|
class Recipe(db.Model):
|
|
__tablename__ = "recipes"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
session_id = db.Column(db.Integer, db.ForeignKey("sessions.id"), nullable=False)
|
|
position = db.Column(db.Integer, nullable=False)
|
|
title = db.Column(db.String(255), nullable=False)
|
|
url = db.Column(db.Text, nullable=False)
|
|
image_url = db.Column(db.Text, nullable=True)
|
|
meta = db.Column(db.String(255), nullable=True)
|
|
|
|
|
|
class Vote(db.Model):
|
|
__tablename__ = "votes"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
session_id = db.Column(db.Integer, db.ForeignKey("sessions.id"), nullable=False)
|
|
participant_id = db.Column(db.Integer, db.ForeignKey("participants.id"), nullable=False)
|
|
recipe_id = db.Column(db.Integer, db.ForeignKey("recipes.id"), nullable=False)
|
|
vote = db.Column(db.String(3), nullable=False) # yes/no
|
|
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
|
|
|
|
__table_args__ = (
|
|
db.UniqueConstraint("participant_id", "recipe_id", name="uq_participant_recipe_vote"),
|
|
)
|