from sqlalchemy import Column, Integer, String, Text, DateTime, JSON, ForeignKey, Enum as SAEnum from sqlalchemy.orm import relationship from sqlalchemy.sql import func from database import Base class Exercise(Base): __tablename__ = "exercises" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) title = Column(String(200), nullable=False) exercise_type = Column( SAEnum( "game_snake", "game_match", "game_adventure", "choice", "fill_blank", "true_false", "drag_sort", "matching", name="exercise_type", ), default="choice", ) subject = Column(String(50), default="") knowledge_points = Column(JSON, default=list) questions = Column(JSON, default=list) settings = Column(JSON, default=dict) created_at = Column(DateTime, server_default=func.now()) updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now()) author = relationship("User", back_populates="exercises") attempts = relationship("ExerciseAttempt", back_populates="exercise", lazy="selectin") class ExerciseAttempt(Base): __tablename__ = "exercise_attempts" id = Column(Integer, primary_key=True, index=True) exercise_id = Column(Integer, ForeignKey("exercises.id"), nullable=False) student_name = Column(String(50), default="") answers = Column(JSON, default=list) score = Column(Integer, default=0) total = Column(Integer, default=0) duration = Column(Integer, default=0) created_at = Column(DateTime, server_default=func.now()) exercise = relationship("Exercise", back_populates="attempts")