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.

12 KiB

Спринты по bugfix-задачам (Тесты / Доступ / Генерация)

Дата: 2026-04-30
Контур: flask_app (UI + API + сервисы генерации)

Цели пакета

  1. Дать доступ всем авторизованным пользователям ко всем активным тестам (без назначений).
  2. Привести поведение шаблона генерации теста к ожидаемому (кол-во вопросов/вариантов/правильных ответов).
  3. Добавить массовые настройки «несколько вариантов ответа».
  4. Улучшить поток работы с подсказками и прозрачность прогресса генерации.

Спринт 1 — Доступ всем авторизованным (без назначений)

Объём

  • Убрать зависимость прохождения теста от назначений (TestAssignment*).
  • Разрешить доступ к активным тестам для любого авторизованного пользователя.
  • Проверить, что каталог и старт попытки работают консистентно с новой политикой.

Задачи

  1. Политика доступа

    • В user_has_test_access вернуть ok=True для любого активного теста, если тест существует и пользователь авторизован.
    • Оставить проверки авторства только там, где они нужны для редактора/версий/админских действий.
  2. Проверка API прохождения

    • start_attempt, play, submit, review не должны требовать назначения на пользователя.
    • Ошибка «Доступ запрещён» не возникает для обычного авторизованного сотрудника при прохождении активного теста.

Критерии приёмки

  • Любой авторизованный пользователь может открыть и пройти любой активный тест, даже без назначения.
  • При этом операции автора (редактор, версии, массовые действия) остаются ограничены автором.

Оценка

  • 0.5 дня.

Спринт 2 — Шаблон генерации: контракт и предсказуемость

Проблема

Сейчас пользователь создаёт шаблон (например, 12×4), затем генерирует из документа и получает иной результат (например, 10×3). Ожидания и фактический контракт не совпадают.

Объём

  • Зафиксировать единый контракт: какие параметры шаблона обязательны для генератора.
  • Принудительно соблюдать:
    • количество вопросов,
    • количество вариантов в вопросе,
    • границы количества правильных ответов.
  • Добавить валидацию и пост-проверку результата генерации.

Задачи

  1. Формальный контракт шаблона

    • Явно определить обязательные поля shape:
      • questions_count
      • options_per_question
      • multiple_answers_default
      • correct_answers_min/max
    • Хранить shape вместе с тестом/версией как источник истины.
  2. Генерация по документу с shape

    • Передавать shape в генератор при generate from document.
    • После генерации валидировать фактическую структуру.
    • При расхождении:
      • либо автоматически нормализовать (добить/сжать до нужного формата),
      • либо показать понятную ошибку и не сохранять черновик.
  3. Пользовательская обратная связь

    • На экране до запуска показывать «Будет сгенерировано: 12 вопросов, 4 варианта».
    • После завершения показывать фактический итог и предупреждение, если пришлось авто-нормализовать.

Критерии приёмки

  • Для шаблона 12×4 итоговый тест всегда 12 вопросов по 4 варианта.
  • Несоответствие не проходит «тихо»: либо авто-исправление с уведомлением, либо явная ошибка.

Оценка

  • 1.5–2.5 дня.

Спринт 3 — Массовый контроль «Несколько вариантов ответа»

Объём

  • Добавить глобальный чекбокс «Несколько вариантов ответа» (для всех вопросов).
  • В шаблоне добавить диапазон правильных ответов: от _ до _.
  • При отключении мультивыбора на конкретном вопросе нижняя граница «от» фиксируется в 1.

Задачи

  1. UI шаблона

    • Глобальный switch/checkbox: «Несколько вариантов ответа для всех вопросов».
    • Поля диапазона:
      • Мин. правильных (от),
      • Макс. правильных (до),
      • валидация 1 <= min <= max <= options_per_question.
  2. Применение к вопросам

    • При включении глобального флага обновлять все вопросы:
      • hasMultipleAnswers=true.
    • При выключении:
      • hasMultipleAnswers=false,
      • minCorrect=1, maxCorrect=1.
    • На уровне отдельного вопроса разрешить override.
  3. Правило «заморозки min=1»

    • Если на вопросе hasMultipleAnswers=false, то:
      • minCorrect автоматически = 1,
      • поле minCorrect read-only/disabled.
  4. Серверная валидация

    • API сохраняет/проверяет тот же инвариант.
    • Невалидные комбинации отклоняются с понятным сообщением.

Критерии приёмки

  • Глобальный флаг влияет на все вопросы.
  • Локальное отключение мультивыбора фиксирует min=1.
  • Генератор и редактор работают в одинаковой логике, без рассинхрона.

Оценка

  • 1.5–2 дня.

Спринт 4 — Подсказки и прогресс генерации

Объём

  • В параметрах теста при включённых подсказках показать действие «Сгенерировать подсказки».
  • Генерация подсказок работает только по заполненным вопросам.
  • Если тест генерируется с нуля и подсказки уже включены — подсказки генерируются в том же пайплайне.
  • Добавить прогресс по этапам генерации + локальные индикаторы загрузки в соответствующих блоках UI.

Задачи

  1. Кнопка/ссылка «Сгенерировать подсказки»

    • Показ только при hintsEnabled=true.
    • Показ количества: N без подсказок.
    • Запуск только по вопросам, где есть текст + варианты.
  2. Пайплайн генерации «с нуля»

    • Если hintsEnabled=true, после генерации вопросов автоматически запускать генерацию подсказок.
    • Ошибки подсказок не должны ломать весь тест: частичный результат допустим с отчётом.
  3. Прогресс и статусы

    • Этапы:
      • подготовка документа,
      • извлечение текста,
      • генерация структуры,
      • генерация вопросов,
      • генерация подсказок,
      • финализация.
    • В UI показывать текущий этап и процент/счётчик.
    • Спиннеры показывать только у активного блока (не глобально на всю форму).
  4. Наблюдаемость

    • Логи этапов и длительности.
    • В ответ API возвращать breakdown по шагам/ошибкам.

Критерии приёмки

  • Пользователь видит, что именно сейчас генерируется.
  • Подсказки отдельно запускаются и генерируются только для валидных вопросов.
  • При генерации «с нуля» с включёнными подсказками подсказки появляются автоматически.

Оценка

  • 2–3 дня.

Спринт 5 — Регрессия, UX-полировка, выпуск

Объём

  • Сквозное тестирование сценариев.
  • Документация для пользователей и команды.
  • Подготовка релиз-нота.

Тест-кейсы (минимум)

  1. Неавторизованный пользователь открывает приватные URL → редирект на логин.
  2. Каталог тестов: есть переход «На главную».
  3. Шаблон 12×4 + генерация из PDF → на выходе 12×4.
  4. Глобальный мультивыбор + локальное выключение на 1 вопросе → min=1 на этом вопросе.
  5. Включены подсказки:
    • кнопка «Сгенерировать подсказки» доступна,
    • генерируются только по заполненным вопросам.
  6. Генерация с нуля + подсказки включены → подсказки сгенерированы в том же запуске.
  7. Прогресс этапов отображается корректно, загрузка локальная.

Оценка

  • 1–1.5 дня.

Приоритеты

  • P0: Спринт 1 (доступ всем авторизованным), критичный функциональный bugfix.
  • P1: Спринт 2 (контракт шаблона), устранение основного функционального несоответствия.
  • P1: Спринт 3 (массовый мультивыбор), важная продуктовая логика.
  • P2: Спринт 4 (подсказки + прогресс), прозрачность и удобство.
  • P2: Спринт 5 (регрессия + выпуск).

Суммарная оценка

Ориентир: 6.5–10 рабочих дней (в зависимости от объёма автотестов и глубины рефакторинга генератора).