You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.8 KiB
89 lines
2.8 KiB
from datetime import datetime |
|
from typing import Optional |
|
|
|
from pydantic import BaseModel |
|
|
|
|
|
# ── Начало попытки ────────────────────────────────────────── |
|
|
|
class AttemptStart(BaseModel): |
|
test_id: int |
|
|
|
|
|
class AnswerForTest(BaseModel): |
|
"""Вариант ответа без поля is_correct — не раскрываем правильные ответы.""" |
|
id: int |
|
text: str |
|
|
|
model_config = {"from_attributes": True} |
|
|
|
|
|
class QuestionForTest(BaseModel): |
|
id: int |
|
text: str |
|
is_multiple: bool # True = несколько правильных ответов → показываем чекбоксы |
|
answers: list[AnswerForTest] # перемешаны случайно |
|
|
|
model_config = {"from_attributes": True} |
|
|
|
|
|
class AttemptStarted(BaseModel): |
|
"""Возвращается после старта попытки.""" |
|
id: int |
|
test_id: int |
|
test_title: str |
|
test_description: Optional[str] |
|
started_at: datetime |
|
time_limit: Optional[int] # минуты, из теста |
|
allow_navigation_back: bool # из теста |
|
questions: list[QuestionForTest] # перемешаны случайно |
|
|
|
model_config = {"from_attributes": True} |
|
|
|
|
|
# ── Сдача попытки ──────────────────────────────────────────── |
|
|
|
class QuestionAnswer(BaseModel): |
|
"""Ответы сотрудника на один вопрос.""" |
|
question_id: int |
|
answer_ids: list[int] # выбранные варианты (может быть пустым) |
|
|
|
|
|
class AttemptSubmitDto(BaseModel): |
|
answers: list[QuestionAnswer] |
|
|
|
|
|
# ── Результат ──────────────────────────────────────────────── |
|
|
|
class AnswerResult(BaseModel): |
|
id: int |
|
text: str |
|
is_correct: bool # правильный ли ответ вообще |
|
is_selected: bool # выбрал ли его сотрудник |
|
|
|
model_config = {"from_attributes": True} |
|
|
|
|
|
class QuestionResult(BaseModel): |
|
id: int |
|
text: str |
|
is_answered_correctly: bool # вся комбинация ответов верна |
|
answers: list[AnswerResult] |
|
|
|
model_config = {"from_attributes": True} |
|
|
|
|
|
class AttemptResult(BaseModel): |
|
id: int |
|
test_id: int |
|
test_title: str |
|
started_at: datetime |
|
finished_at: datetime |
|
score: float # процент правильных ответов |
|
passed: bool # преодолён ли порог зачёта |
|
passing_score: int # порог из теста |
|
correct_count: int |
|
total_count: int |
|
questions: list[QuestionResult] |
|
|
|
model_config = {"from_attributes": True}
|
|
|