bugfix
This commit is contained in:
@@ -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 рабочих дней** (в зависимости от объёма автотестов и глубины рефакторинга генератора).
|
||||
Reference in New Issue
Block a user