You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.8 KiB
Python
76 lines
2.8 KiB
Python
from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime, ForeignKey
|
|
from sqlalchemy.ext.declarative import declarative_base
|
|
from sqlalchemy.orm import relationship
|
|
from sqlalchemy.sql import func
|
|
|
|
Base = declarative_base()
|
|
|
|
|
|
class Theme(Base):
|
|
__tablename__ = "themes"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
name = Column(String(100), nullable=False, unique=True)
|
|
description = Column(Text)
|
|
created_at = Column(DateTime, server_default=func.now())
|
|
|
|
questions = relationship("Question", back_populates="theme")
|
|
|
|
|
|
class Question(Base):
|
|
__tablename__ = "questions"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
theme_id = Column(Integer, ForeignKey("themes.id"), nullable=False)
|
|
question_text = Column(Text, nullable=False)
|
|
correct_answer = Column(Text, nullable=False)
|
|
hint = Column(Text)
|
|
difficulty_level = Column(Integer, default=1)
|
|
created_at = Column(DateTime, server_default=func.now())
|
|
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now())
|
|
|
|
theme = relationship("Theme", back_populates="questions")
|
|
game_answers = relationship("GameAnswer", back_populates="question")
|
|
|
|
|
|
class Player(Base):
|
|
__tablename__ = "players"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
name = Column(String(50), nullable=False)
|
|
email = Column(String(100))
|
|
created_at = Column(DateTime, server_default=func.now())
|
|
|
|
game_sessions = relationship("GameSession", back_populates="player")
|
|
|
|
|
|
class GameSession(Base):
|
|
__tablename__ = "game_sessions"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
player_id = Column(Integer, ForeignKey("players.id"), nullable=False)
|
|
started_at = Column(DateTime, server_default=func.now())
|
|
ended_at = Column(DateTime)
|
|
total_score = Column(Integer, default=0)
|
|
questions_answered = Column(Integer, default=0)
|
|
session_duration = Column(Integer, default=0) # in seconds
|
|
|
|
player = relationship("Player", back_populates="game_sessions")
|
|
game_answers = relationship("GameAnswer", back_populates="session")
|
|
|
|
|
|
class GameAnswer(Base):
|
|
__tablename__ = "game_answers"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
session_id = Column(Integer, ForeignKey("game_sessions.id"), nullable=False)
|
|
question_id = Column(Integer, ForeignKey("questions.id"), nullable=False)
|
|
attempt_number = Column(Integer, nullable=False) # 1, 2, or 3
|
|
user_answer = Column(Text)
|
|
is_correct = Column(Boolean, default=False)
|
|
hint_used = Column(Boolean, default=False)
|
|
points_earned = Column(Integer, default=0)
|
|
answered_at = Column(DateTime, server_default=func.now())
|
|
|
|
session = relationship("GameSession", back_populates="game_answers")
|
|
question = relationship("Question", back_populates="game_answers") |