From 14f64a281785fbd75604974094fd9f7ab96366a1 Mon Sep 17 00:00:00 2001 From: grey-cat-1908 <61203964+grey-cat-1908@users.noreply.github.com> Date: Tue, 20 Aug 2024 06:45:07 +0000 Subject: [PATCH] Scale question type --- models/answer.py | 12 +++++++++++- models/form.py | 27 ++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/models/answer.py b/models/answer.py index fc7dd0e..91b31c4 100644 --- a/models/answer.py +++ b/models/answer.py @@ -18,6 +18,7 @@ class AnswerError(Enum): INCORRECT_IDS = "The ids for some questions are incorrect." TIN_VALIDATION_FAILED = "The TIN validation process failed." SNILS_VALIDATION_FAILED = "The SNILS validation process failed." + SCALE_VALUE_NOT_IN_RANGE = "The scale value must be within the specified range." class BaseValue(BaseModel): @@ -51,6 +52,15 @@ class TextValue(BaseValue): raise ValueError(AnswerError.SNILS_VALIDATION_FAILED.value) +class ScaleValue(BaseValue): + question_type: form.QuestionType = form.QuestionType.scale + value: int + + def validate(self, question: form.ScaleQuestion) -> None: + if not (question.min_value <= self.value <= question.max_value): + raise ValueError(AnswerError.SCALE_VALUE_NOT_IN_RANGE.value) + + class SelectorValue(BaseValue): question_type: form.QuestionType = form.QuestionType.selector values: set[int] @@ -69,7 +79,7 @@ class SelectorValue(BaseValue): raise ValueError(AnswerError.TOO_MANY_SELECTED.value) -Value: TypeAlias = SelectorValue | TextValue +Value: TypeAlias = SelectorValue | TextValue | ScaleValue class AnswerData(BaseModel): diff --git a/models/form.py b/models/form.py index f219edf..acb630a 100644 --- a/models/form.py +++ b/models/form.py @@ -14,11 +14,14 @@ class FormError(Enum): MIN_VALUES_ERR = "min_values must be greater than or equal to 1." MAX_VALUES_ERR = "max_values cannot be less than min_length or greater than the number of options." SIMMILAR_ID_ERR = "All questions must have different id's" + SCALE_MIN_VALUE_ERR = "min_value must be in range from 0 to 1" + SCALE_MAX_VALUE_ERR = "max_value must be in range from 2 to 10" class QuestionType(IntEnum): text = 1 selector = 2 + scale = 3 class TextValidator(IntEnum): @@ -76,6 +79,28 @@ class TextQuestion(BaseQuestion): return v +class ScaleQuestion(BaseQuestion): + question_type: QuestionType = QuestionType.scale + min_value: int + min_label: str | None = None + max_value: int + max_label: str | None = None + + @field_validator("min_value") + @classmethod + def validate_min_value(cls, v, info): + if v not in [0, 1]: + raise ValueError(FormError.SCALE_MIN_VALUE_ERR.value) + return v + + @field_validator("max_value") + @classmethod + def validate_max_value(cls, v, info): + if v < 2 or v > 10: + raise ValueError(FormError.SCALE_MAX_VALUE_ERR.value) + return v + + class SelectorQuestion(BaseQuestion): question_type: QuestionType = QuestionType.selector min_values: int = 1 @@ -101,7 +126,7 @@ class SelectorQuestion(BaseQuestion): return v -Question: TypeAlias = SelectorQuestion | TextQuestion +Question: TypeAlias = SelectorQuestion | TextQuestion | ScaleQuestion class Page(BaseModel):