from datetime import datetime
from typing import Union
from pydantic import BaseModel, Field
[docs]
class Template(BaseModel):
"""Represents a template for code replacement in the questionnaire."""
[docs]
class Answer(BaseModel):
"""Represents an answer to a question in the questionnaire."""
[docs]
templates: list[Template] = Field(default_factory=list)
[docs]
followups: list[Union["Question", "Switch"]] = Field(default_factory=list)
[docs]
class Question(BaseModel):
"""Represents a question in the questionnaire."""
[docs]
variable: str | None = None
[docs]
class Case(BaseModel):
"""Represents a case in a switch statement within the questionnaire."""
[docs]
value: int | None = None
[docs]
questions: list[Union[Question, "Switch"]]
[docs]
class Switch(BaseModel):
"""Represents a switch statement in the questionnaire."""
# Rebuild models to support self-referencing types and forward references
Question.model_rebuild()
Answer.model_rebuild()
Case.model_rebuild()
Switch.model_rebuild()
[docs]
class QuestionAnswer(BaseModel):
"""Represents a user's answer to a question."""
[docs]
class QuestionAnswers(BaseModel):
"""Represents a collection of user answers to questions."""
[docs]
answers: list[QuestionAnswer] = Field(default_factory=list)
[docs]
timestamp: datetime = Field(default_factory=datetime.now)
[docs]
class Questionnaire(BaseModel):
"""Represents a questionnaire with an initial template and a list of questions."""
[docs]
feedback_url: str | None = None
[docs]
questions: list[Question | Switch]