from datetime import datetime from pydantic import BaseModel class QuizCreate(BaseModel): model_config = {"protected_namespaces": ()} section_id: int | None = None title: str mode: str = "timed" # timed, learning time_limit_minutes: int | None = None model_id: str | None = None # override extraction model question_category_id: int | None = None # assign extracted questions to this bank category extraction_mode: str = "standard" # standard — current working mode (inline Correct Answer / Preferred Response) # questions_only — extract Q+options only, no answers (admin fills later) # two_step — separate answer key section (PREP 2013 style) # regex — AI analyses format then extracts answer key with regex # ai_decide — AI reads a sample and decides which approach to use class QuizUpdate(BaseModel): title: str class QuestionResponse(BaseModel): id: int question_text: str question_type: str options: list[str] | None image_path: str | None = None class Config: from_attributes = True class QuestionWithAnswer(QuestionResponse): correct_answer: str explanation: str | None page_reference: int | None class QuizResponse(BaseModel): id: int section_id: int | None = None user_id: int title: str questions_count: int mode: str time_limit_minutes: int | None skipped_questions: str | None = None category_id: int | None = None created_at: datetime deleted_at: datetime | None = None is_published: int = 1 is_shared: int = 0 questions_per_attempt: int | None = None class Config: from_attributes = True class QuizDetail(QuizResponse): questions: list[QuestionResponse] = [] class QuizLearningDetail(QuizResponse): """Learning mode — includes answers and explanations.""" questions: list[QuestionWithAnswer] = [] class QuizReview(QuizResponse): questions: list[QuestionWithAnswer] = []