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

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")