lct-hack/backend/scripts/seed.py
Ivan Gerasimov 6b2c96bab6 lct-03 и lct-04: журнал сессий и библиотека сценариев
БД: 11 таблиц, первая миграция. Группы и связь trainee → group заложены
сразу, даже пустыми — размечать накопленные сессии задним числом значит
делать лишнюю миграцию. Номер попытки живёт в сессии, отдельной таблицы
попыток нет: дельта считается запросом по (trainee_id, scenario_id).

Сценарии: строгая схема — опечатка в имени поля падает на старте, а не
игнорируется молча. ground_truth собирается кодом, попытка задать
incident_type, dds или required_facts в YAML отвергается: иначе генератор
разведёт факты и эталон и курсанта оштрафуют за правильный ответ. Руками
задаются только нормализованные адрес и число пострадавших — из фразы
«улица Ленина, 14, квартира 47, 5-й этаж» кодом «улица Ленина, 14»
не достать.

GET /api/scenarios/{id} больше не отдаёт чек-лист. Это содержимое
подсказок: отдать его целиком значит выдать в контрольном режиме то,
чего там быть не должно, в обход выдачи по одному пункту.

Тесты базы поднимают свой движок на каждый тест: глобальный кэшируется
и привязывается к первому событийному циклу.
2026-09-15 20:10:05 +03:00

30 lines
847 B
Python

"""make seed: сценарии из /scenarios в БД."""
import asyncio
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
from app.db.base import get_sessionmaker # noqa: E402
from app.scenarios import store # noqa: E402
from app.scenarios.loader import ScenarioError # noqa: E402
LIBRARY = Path(__file__).resolve().parents[2] / "scenarios"
async def main() -> None:
try:
scenarios = store.load_from_disk(LIBRARY)
except ScenarioError as exc:
print(f"библиотека не прошла проверку: {exc}")
raise SystemExit(1) from exc
async with get_sessionmaker()() as db:
count = await store.seed(db, scenarios)
print(f"залито сценариев: {count}")
if __name__ == "__main__":
asyncio.run(main())