from datetime import datetime from sqlalchemy import Boolean, Column, DateTime, Enum, Float, ForeignKey, Integer, String, Text from sqlalchemy.orm import relationship from app.db.session import Base class Quiz(Base): __tablename__ = "quizzes" id = Column(Integer, primary_key=True, index=True) title = Column(String, nullable=False) description = Column(Text) user_id = Column(Integer, ForeignKey("users.id")) is_public = Column(Boolean, default=False) time_limit_minutes = Column(Integer, default=10) pass_percentage = Column(Float, default=70.0) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Relationships user = relationship("User", back_populates="quizzes") quiz_questions = relationship("QuizQuestion", back_populates="quiz", cascade="all, delete-orphan") quiz_attempts = relationship("QuizAttempt", back_populates="quiz") class QuizQuestion(Base): __tablename__ = "quiz_questions" id = Column(Integer, primary_key=True, index=True) quiz_id = Column(Integer, ForeignKey("quizzes.id"), nullable=False) question_id = Column(Integer, ForeignKey("questions.id"), nullable=False) position = Column(Integer, default=0) # For ordering questions # Relationships quiz = relationship("Quiz", back_populates="quiz_questions") question = relationship("Question", back_populates="quiz_questions") answers = relationship("QuizQuestionAnswer", back_populates="quiz_question") class QuizAttempt(Base): __tablename__ = "quiz_attempts" id = Column(Integer, primary_key=True, index=True) quiz_id = Column(Integer, ForeignKey("quizzes.id"), nullable=False) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) status = Column(Enum("started", "completed", "abandoned", name="attempt_status_enum"), default="started") score = Column(Float) started_at = Column(DateTime, default=datetime.utcnow) completed_at = Column(DateTime) # Relationships quiz = relationship("Quiz", back_populates="quiz_attempts") user = relationship("User", back_populates="quiz_attempts") answers = relationship("QuizQuestionAnswer", back_populates="quiz_attempt", cascade="all, delete-orphan") class QuizQuestionAnswer(Base): __tablename__ = "quiz_question_answers" id = Column(Integer, primary_key=True, index=True) quiz_attempt_id = Column(Integer, ForeignKey("quiz_attempts.id"), nullable=False) quiz_question_id = Column(Integer, ForeignKey("quiz_questions.id"), nullable=False) selected_option_id = Column(Integer, ForeignKey("question_options.id")) is_correct = Column(Boolean) answered_at = Column(DateTime, default=datetime.utcnow) # Relationships quiz_attempt = relationship("QuizAttempt", back_populates="answers") quiz_question = relationship("QuizQuestion", back_populates="answers") selected_option = relationship("QuestionOption", back_populates="user_answers")