Дорабоки интерфейса системы тестирования. Раздел 1 Шапка+Верхний brick
This commit is contained in:
+132
-62
@@ -1,78 +1,148 @@
|
||||
# Состояние проекта (человеческий обзор)
|
||||
# Состояние проекта
|
||||
|
||||
**Репозиторий:** [TestingWebApp](https://git.pirogov.ai/l_konstantin/TestingWebApp) · ветка разработки: **`dev`**
|
||||
**Дата среза:** 2026-04-24
|
||||
**Репозиторий:** [TestingWebApp](https://git.pirogov.ai/l_konstantin/TestingWebApp) · ветка разработки **`dev`**
|
||||
**Прод:** **[https://edullm.pirogov.ai/](https://edullm.pirogov.ai/)**
|
||||
**Дата среза:** 2026-04-28
|
||||
|
||||
Этот документ — не дублирование ТЗ, а **короткое объяснение**, что уже работает в коде и что логично делать дальше. Подробные задачи: [revision_task/card1.md](revision_task/card1.md), [revision_task/BACKLOG.md](revision_task/BACKLOG.md).
|
||||
Не дубль ТЗ, а карта «что реально работает в коде, на каком контуре,
|
||||
и что логично сделать дальше».
|
||||
|
||||
---
|
||||
|
||||
## Что уже сделано (как это устроено)
|
||||
## TL;DR
|
||||
|
||||
### Вход и роли
|
||||
- Прод и dev работают **только на Flask-контуре** (`flask_app/`,
|
||||
Python 3.11 + Flask 3 + Jinja2 + Tailwind CDN + SQLAlchemy).
|
||||
- Каталоги `backend/` (Express) и `frontend/` (React) — архив, не
|
||||
разворачиваются и не используются; удаление запланировано в
|
||||
спринте **E1.6**.
|
||||
- БД — **`clinic_tests`** (PostgreSQL). Схема в Этапе 1 не меняется.
|
||||
- Этап 2 (слияние с `HR_TG_Bot/tgFlaskForm`) пока не делаем —
|
||||
[`migration-to-tgflaskform.md`](migration-to-tgflaskform.md).
|
||||
|
||||
- Сотрудник входит по **логину и паролю** (сессия через cookie + JWT).
|
||||
- В шапке показываются **роль** и **Фамилия с инициалами** (например, *Иванов И. О.*), полное ФИО — во всплывающей подсказке.
|
||||
- В **режиме разработки** (`NODE_ENV=development`) у удобного тестирования могут быть дополнительные кнопки (например, создание теста сотрудником — `devUi` в ответе `/api/auth/me`).
|
||||
|
||||
### «Цепочка» теста и черновики
|
||||
|
||||
- У каждого теста есть **одна логическая цепочка** в базе: все правки вопросов относятся к ней, но **версия контента** (`v1`, `v2`, …) может расти.
|
||||
- **Пока никто не проходил** этот тест — автор правит **на месте**: сохраняет черновик, и меняется текущая активная версия **без** лишнего дублирования строк в истории.
|
||||
- **Как только по цепочке появилась хотя бы одна завершённая попытка** — каждое **содержательное** сохранение с изменениями создаёт **новую версию** (новый номер, старая остаётся в истории). Старые результаты остаются привязаны к **той** версии, с которой человек реально отвечал.
|
||||
- **Активная версия** — та, с которой сейчас стартуют новые попытки. Автор может **вручную** переключить активную версию в таблице истории (с подтверждением), если бизнесу так нужно.
|
||||
- **Публикация / видимость:** в кабинете (аккордеон **«Показ в каталоге»**, подсекция **«Видимость»**) тест можно **скрыть из общего списка** (цепочка остаётся в базе) или **снова показать**; **назначения** (подсекция **«Кому выдать»**) — при включённой фиче, см. раздел «Назначения» ниже.
|
||||
- **Мобильный UI** кабинета (колонка списка на узком экране, фикс-футер, группировка разделов, копи): [СПРИНТЫ_МОБИЛЬНЫЙ_ДИЗАЙН.md](СПРИНТЫ_МОБИЛЬНЫЙ_ДИЗАЙН.md) · [РУКОВОДСТВО_КАБИНЕТ_ТЕСТОВ.md](РУКОВОДСТВО_КАБИНЕТ_ТЕСТОВ.md) (тезисы для врачей/кураторов).
|
||||
- **Унификация стека (Этап 1, текущий)**: Express → Flask + React → Jinja **внутри TestingWebApp** (`flask_app/`). БД остаётся `clinic_tests`, схема не меняется. План и журнал — [migration-final.md](migration-final.md).
|
||||
- **Слияние с HR-кабинетом (Этап 2, на будущее, без сроков)**: перенос в `HR_TG_Bot/tgFlaskForm` как blueprint `cabinet/testing`, ETL `clinic_tests → hr_bot_test`. План — [migration-to-tgflaskform.md](migration-to-tgflaskform.md). Карта Express-функционала и справочный gap-analysis с уже существующим модулем HR-кабинета — [migration-final-inventory.md](migration-final-inventory.md).
|
||||
|
||||
### Список тестов и доступ
|
||||
|
||||
- В каталоге **«Тесты»** видны цепочки, где вы **автор**, и тесты, **назначенные вам** (через назначение на пользователя; в dev назначения обычно **включены**).
|
||||
- Под названием показывается **«Автор: Вы»** для своих тестов и **«Автор: Фамилия И. О.»** для чужих (назначенных).
|
||||
- **Пройти** тест — кнопка **справа** в строке; **карточка** теста — клик по названию **слева** (попытка с карточки не стартует сама).
|
||||
|
||||
### Прохождение и результат
|
||||
|
||||
- Открывается экран вопросов (один или несколько верных вариантов); после **«Завершить тест»** — итог: сколько верно, процент, **зачёт** по порогу.
|
||||
- **Разбор:** после сдачи показывается, по **каждому вопросу**, что выбрал пользователь и какие варианты верны. Отдельная страница разбора доступна по ссылке; **автор** в аккордеоне **«История»** (подсекция **«Прохождения»**) видит **завершённые** попытки и кнопку **«Разбор»** (раньше секция называлась **«Прогоны и разбор»**).
|
||||
|
||||
### Импорт и ИИ (MVP)
|
||||
|
||||
- Можно загрузить **файл** (PDF, DOCX, текст): сервер **извлекает текст** и при настроенном ключе **LLM** (например, `DEEPSEEK_API_KEY` / `OPENAI_API_KEY` в окружении) предлагает **черновик** вопросов. В UI: подсекция **«Документ в вопросы»** внутри **«Вопросы»** (раньше — отдельный блок «Импорт из файла»). Дальше тот же поток, что и при ручном редактировании: правки → **сохранить черновик** (с учётом правил версий выше).
|
||||
- **Полный** набор сценариев из ТЗ (отдельная страница настроек ключа, «проверить тест целиком», модалки с чекбоксами и т.д.) — в [sprint-02](revision_task/sprint-02.md); часть уже заложена в сервисах, UI доводится.
|
||||
|
||||
### Назначения (MVP)
|
||||
|
||||
- **Автор** в **«Показ в каталоге»** → **«Кому выдать»** может **назначить** сотрудников из справочника (поиск, фильтры, **«Выбрать всех»** в текущем списке; в dev — при включённой фиче в `docker-compose` / `.env`). Назначение **не** перепривязывается автоматически к каждой новой версии контента: **старт попытки** всегда берёт **текущую активную** версию на момент нажатия **«Пройти»**.
|
||||
|
||||
### Интеграция с HR (в зачатке)
|
||||
|
||||
- Поддержан сценарий **входа через учётки HR** (`HR_AUTH` + `HR_DATABASE_URL`) для проверок на одном кластере Postgres с экосистемой `Postgres_TG_Bots` (см. [README — установка](../README.md)).
|
||||
- Целевой **RBAC** из HR-таблиц — [card1, часть A](revision_task/card1.md#часть-a--авторизация-по-паролю-бд-postgres_tg_bots); сейчас — упрощённое сопоставление ролей.
|
||||
Главный трекер по спринтам — [`migration-final.md`](migration-final.md).
|
||||
|
||||
---
|
||||
|
||||
## Что в планах (логичный следующий слой)
|
||||
## Что уже работает на новом контуре (E1.0–E1.3, E1.8)
|
||||
|
||||
### Вход
|
||||
- `/login` (форма) и `/api/auth/login` (JSON), `/api/auth/logout`,
|
||||
`/api/auth/me`.
|
||||
- По умолчанию — bcrypt-хеши из `clinic_tests.users`.
|
||||
- `HR_AUTH=1` + `HR_DATABASE_URL` — вход через `hr_bot_test.users`
|
||||
(Werkzeug); запись синхронизируется в `clinic_tests.users` UPSERT-ом по
|
||||
`staff_id`. Сценарий «пользователь без `staff_id`» — пропускается с
|
||||
предупреждением в логах.
|
||||
|
||||
### Каталог тестов (`/tests`)
|
||||
- Видны цепочки, где вы автор, и активные публичные.
|
||||
- Создание теста через модалку («Название» + «Описание»).
|
||||
- Кнопка «Скрыть» / «Вернуть» работает на цепочку целиком.
|
||||
|
||||
### Редактор теста (`/tests/<id>/edit`)
|
||||
- Поля шапки: название, описание, проходной балл, переключатель
|
||||
«Цепочка активна».
|
||||
- Вопросы и варианты: добавить / удалить / переместить, отметить верные.
|
||||
- **Версионирование.** Пока по цепочке нет завершённых попыток —
|
||||
правки идут «на месте». После первой попытки любое содержательное
|
||||
сохранение делает форк (`version + 1`, `parent_id` = прежняя),
|
||||
старая версия остаётся в БД и не видна в каталоге.
|
||||
- Подробная модель поведения и проверочные сценарии —
|
||||
[`QA-versioning-and-ai.md`](QA-versioning-and-ai.md).
|
||||
|
||||
### AI-помощник в редакторе
|
||||
| Кнопка | Что делает |
|
||||
|---|---|
|
||||
| По названию | Генерирует весь набор вопросов по теме. Параметры — кол-во вопросов и вариантов. |
|
||||
| По текущей сетке | Дописывает варианты для уже расставленных карточек. |
|
||||
| Проверить | Рецензирует тест: вердикт + блоки рекомендаций. |
|
||||
| Улучшить | «Было → стало» по каждому вопросу/варианту с чекбоксами. |
|
||||
| AI: вопрос | На карточке вопроса — переформулировка / генерация дистракторов. |
|
||||
|
||||
При отсутствии ключа — единая ошибка с ссылкой на `/settings`.
|
||||
|
||||
### Импорт документа
|
||||
- PDF / DOCX / TXT / MD до 16 МБ.
|
||||
- `pypdf` для PDF, `python-docx` для DOCX, плоский текст — как есть.
|
||||
- Извлечённый текст идёт в LLM, на выходе — черновик теста, который
|
||||
открывается в редакторе.
|
||||
|
||||
### Настройки (`/settings`)
|
||||
- Статус общего LLM-ключа (берётся из ENV: `DEEPSEEK_API_KEY` →
|
||||
`OPENAI_API_KEY`).
|
||||
- Провайдер, модель, base URL.
|
||||
- Кнопка «Проверить подключение» — пинг `/v1/chat/completions` через
|
||||
`ping_llm()`.
|
||||
- Ключ на клиента не уходит и в БД не пишется.
|
||||
|
||||
---
|
||||
|
||||
## Чего на Flask пока нет
|
||||
|
||||
Эти сценарии будут реализованы в E1.4–E1.5. До этого в приложении они
|
||||
просто отсутствуют (старый Express-контур не используется и не
|
||||
поднимается):
|
||||
|
||||
- **Назначение теста сотруднику** — поиск по справочнику, «Выбрать
|
||||
всех», фильтры по подразделениям.
|
||||
- **Прохождение** — экран вопросов, таймер, сохранение попытки.
|
||||
- **Результат и разбор ошибок** — отдельная страница с ответами
|
||||
пользователя и правильными вариантами.
|
||||
- **Трекер попыток** — единый список завершённых попыток с фильтрами
|
||||
(подразделение / сотрудник / тест / статус / результат).
|
||||
|
||||
---
|
||||
|
||||
## Что в работе и в планах
|
||||
|
||||
### Этап 1 — паритет внутри TestingWebApp
|
||||
|
||||
| Спринт | Содержание | Статус |
|
||||
|---|---|---|
|
||||
| E1.0 | База Flask-приложения (БД-пул, сессии, `base.html`). | ✅ |
|
||||
| E1.1 | Auth + `/api/me` (bcrypt + Werkzeug, опц. `HR_AUTH`). | ✅ |
|
||||
| E1.2 | Каталог тестов и редактор (функциональный минимум). | ✅ |
|
||||
| E1.3 | Импорт документов (PDF / DOCX / TXT / MD). | ✅ |
|
||||
| E1.4 | Назначения и прохождение тестов. | ⬜ Следующий. |
|
||||
| E1.5 | Трекер попыток + страница настроек цепочки. | ⬜ |
|
||||
| E1.6 | Cutover внутри репозитория (удаление `backend/` + `frontend/`). | ⬜ |
|
||||
| E1.7 | UX-полировка редактора: 4 аккордеона + drag-n-drop. | ⬜ |
|
||||
| E1.8 | AI-функции v2 (`/settings`, generate-by-title, check, improve). | ✅ |
|
||||
|
||||
Подробности — [`migration-final.md`](migration-final.md).
|
||||
|
||||
### Этап 2 — слияние с HR-кабинетом (на будущее)
|
||||
|
||||
- Перенос blueprint'ом в `HR_TG_Bot/tgFlaskForm` под путь
|
||||
`/cabinet/testing`.
|
||||
- ETL `clinic_tests → hr_bot_test`. Скрипт-заготовка:
|
||||
[`HR_TG_Bot/tgFlaskForm/tools/migrate_clinic_tests_to_hr.py`](../../HR_TG_Bot/tgFlaskForm/tools/migrate_clinic_tests_to_hr.py)
|
||||
(`--dry-run` / `--apply`).
|
||||
- Авторизация — через сессию HR-кабинета.
|
||||
- Подробности и риски — [`migration-to-tgflaskform.md`](migration-to-tgflaskform.md)
|
||||
(и [простыми словами](migration-to-tgflaskform-plain.md)).
|
||||
|
||||
### Долгий бэклог
|
||||
|
||||
| Направление | Суть |
|
||||
|-------------|------|
|
||||
| **AI по ТЗ §4.2** | Ключ в настройках (не на клиенте), кнопки «сгенерировать/проверить/улучшить» с превью и подтверждением, регресс с версиями. |
|
||||
| **Дашборды (ТЗ этап 2)** | Единая картина по отделу / клинике, фильтры, история. |
|
||||
| **MAX / мини-приложение** | Встраивание в общий HR-контур клиники. |
|
||||
| **Таймер, подсказки, медиа в вопросах** | Режимы прохождения и вложения — отдельные этапы ТЗ. |
|
||||
| **E2E и интеграционные тесты** | Расширение `V.9`, стабильный CI. |
|
||||
| **Назначения** | Сроки, лимит попыток, назначения «по отделу» (частично в бэклоге [BACKLOG_IDEAS](revision_task/BACKLOG_IDEAS.md)). |
|
||||
|
||||
Журнал приёмок и чек-листы: [TESTING_JOURNAL.md](revision_task/TESTING_JOURNAL.md).
|
||||
|---|---|
|
||||
| Дашборды (ТЗ этап 2) | Единая картина по отделу / клинике, фильтры, история. |
|
||||
| MAX / мини-приложение | Встраивание в общий HR-контур клиники. |
|
||||
| Таймер, подсказки, медиа в вопросах | Режимы прохождения и вложения — отдельные этапы ТЗ. |
|
||||
| E2E и интеграционные тесты | Расширение `V.9`, стабильный CI. |
|
||||
| Назначения по отделу | Сроки, лимит попыток, групповые назначения. |
|
||||
|
||||
---
|
||||
|
||||
## Связанные файлы
|
||||
## Связанные документы
|
||||
|
||||
- [Руководство пользователя dev-контура](DEV_CONTOUR_USER_GUIDE.md)
|
||||
- [Руководство кабинета (простыми словами)](РУКОВОДСТВО_КАБИНЕТ_ТЕСТОВ.md)
|
||||
- [Спринты: мобильный UI](СПРИНТЫ_МОБИЛЬНЫЙ_ДИЗАЙН.md)
|
||||
- [Предложение по дизайну (ист. + актуализация)](ПРЕДЛОЖЕНИЕ_ДИЗАЙН_СОЗДАНИЕ_ТЕСТА.md)
|
||||
- [README с установкой](../README.md)
|
||||
- [Карта задач card1](revision_task/card1.md)
|
||||
- [README репозитория](../README.md)
|
||||
- [Главный трекер миграции — `migration-final.md`](migration-final.md)
|
||||
- [Карта Express + gap-analysis с `tgFlaskForm` — `migration-final-inventory.md`](migration-final-inventory.md)
|
||||
- [План Этапа 2 — `migration-to-tgflaskform.md`](migration-to-tgflaskform.md)
|
||||
- [Инструкция тестировщику — `QA-versioning-and-ai.md`](QA-versioning-and-ai.md)
|
||||
- [Спринты мобильного UX редактора](СПРИНТЫ_МОБИЛЬНЫЙ_ДИЗАЙН.md)
|
||||
- [Кратко для врачей-кураторов](РУКОВОДСТВО_КАБИНЕТ_ТЕСТОВ.md)
|
||||
- [Руководство по dev-контуру](DEV_CONTOUR_USER_GUIDE.md)
|
||||
- [ТЗ заказчика](ТЗ.md)
|
||||
|
||||
Reference in New Issue
Block a user