# Спринты по 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 рабочих дней** (в зависимости от объёма автотестов и глубины рефакторинга генератора).