8 changed files with 527 additions and 24 deletions
@ -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.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 рабочих дней** (в зависимости от объёма автотестов и глубины рефакторинга генератора). |
||||
Loading…
Reference in new issue