This commit is contained in:
Константин Лебединский
2026-04-30 14:11:15 +05:00
parent ebb58d4b5a
commit db9851eeda
8 changed files with 527 additions and 24 deletions
+220
View File
@@ -0,0 +1,220 @@
# Спринты по 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.52.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.52 дня.
---
## Спринт 4 — Подсказки и прогресс генерации
### Объём
- В параметрах теста при включённых подсказках показать действие «Сгенерировать подсказки».
- Генерация подсказок работает только по заполненным вопросам.
- Если тест генерируется с нуля и подсказки уже включены — подсказки генерируются в том же пайплайне.
- Добавить прогресс по этапам генерации + локальные индикаторы загрузки в соответствующих блоках UI.
### Задачи
1. **Кнопка/ссылка «Сгенерировать подсказки»**
- Показ только при `hintsEnabled=true`.
- Показ количества: `N без подсказок`.
- Запуск только по вопросам, где есть текст + варианты.
2. **Пайплайн генерации «с нуля»**
- Если `hintsEnabled=true`, после генерации вопросов автоматически запускать генерацию подсказок.
- Ошибки подсказок не должны ломать весь тест: частичный результат допустим с отчётом.
3. **Прогресс и статусы**
- Этапы:
- подготовка документа,
- извлечение текста,
- генерация структуры,
- генерация вопросов,
- генерация подсказок,
- финализация.
- В UI показывать текущий этап и процент/счётчик.
- Спиннеры показывать только у активного блока (не глобально на всю форму).
4. **Наблюдаемость**
- Логи этапов и длительности.
- В ответ API возвращать breakdown по шагам/ошибкам.
### Критерии приёмки
- Пользователь видит, что именно сейчас генерируется.
- Подсказки отдельно запускаются и генерируются только для валидных вопросов.
- При генерации «с нуля» с включёнными подсказками подсказки появляются автоматически.
### Оценка
- 23 дня.
---
## Спринт 5 — Регрессия, UX-полировка, выпуск
### Объём
- Сквозное тестирование сценариев.
- Документация для пользователей и команды.
- Подготовка релиз-нота.
### Тест-кейсы (минимум)
1. Неавторизованный пользователь открывает приватные URL → редирект на логин.
2. Каталог тестов: есть переход «На главную».
3. Шаблон 12×4 + генерация из PDF → на выходе 12×4.
4. Глобальный мультивыбор + локальное выключение на 1 вопросе → `min=1` на этом вопросе.
5. Включены подсказки:
- кнопка «Сгенерировать подсказки» доступна,
- генерируются только по заполненным вопросам.
6. Генерация с нуля + подсказки включены → подсказки сгенерированы в том же запуске.
7. Прогресс этапов отображается корректно, загрузка локальная.
### Оценка
- 11.5 дня.
---
## Приоритеты
- **P0:** Спринт 1 (доступ всем авторизованным), критичный функциональный bugfix.
- **P1:** Спринт 2 (контракт шаблона), устранение основного функционального несоответствия.
- **P1:** Спринт 3 (массовый мультивыбор), важная продуктовая логика.
- **P2:** Спринт 4 (подсказки + прогресс), прозрачность и удобство.
- **P2:** Спринт 5 (регрессия + выпуск).
## Суммарная оценка
Ориентир: **6.5–10 рабочих дней** (в зависимости от объёма автотестов и глубины рефакторинга генератора).