from pgvector.sqlalchemy import Vector from sqlalchemy import Column, Integer, String, Text, JSON, ForeignKey from sqlalchemy.orm import relationship from app.config import settings from app.database import Base from app.models.question_category import QuestionCategory # noqa — ensures mapper resolves from app.models.quiz_question_link import QuizQuestionLink # noqa class Question(Base): __tablename__ = "questions" id = Column(Integer, primary_key=True, index=True) # source_quiz_id: which quiz this question was originally extracted for (informational). # Content membership is tracked via quiz_question_links junction table. source_quiz_id = Column("quiz_id", Integer, ForeignKey("quizzes.id", ondelete="SET NULL"), nullable=True) question_category_id = Column(Integer, ForeignKey("question_categories.id", ondelete="SET NULL"), nullable=True) question_text = Column(Text, nullable=False) question_type = Column(String, nullable=False) # mcq, true_false, fill_blank options = Column(JSON, nullable=True) # list of strings for mcq correct_answer = Column(String, nullable=False) explanation = Column(Text, nullable=True) page_reference = Column(Integer, nullable=True) image_path = Column(String, nullable=True) embedding = Column(Vector(1024), nullable=True) # semantic search vector question_category = relationship("QuestionCategory", back_populates="questions", foreign_keys=[question_category_id])