4.6 KiB
4.6 KiB
Scenár Creator
Webový nástroj pro tvorbu časových scénářů zážitkových kurzů a výjezdů.
Live: https://scenar.apps.sukany.cz
Funkce
- Grafický editor — bloky na časové ose, přetahování myší, změna délky tažením pravého okraje, snap na 15 minut
- Vícedenní scénář — nastavíš rozsah Od/Do, každý den = jeden řádek
- Série bloků — checkbox „Přidat do každého dne kurzu" vytvoří identický blok pro všechny dny najednou; při smazání lze smazat jen jeden blok nebo celou sérii
- JSON import/export — uložíš scénář, kdykoli ho znovu načteš
- Vzorový JSON —
GET /api/sample - PDF výstup — A4 na šířku, vždy 1 stránka, barevné bloky dle typů, legenda
- Garant viditelný přímo v bloku
- Bloky s poznámkou mají horní index (¹ ² ³...)
- Stránka 2 (pokud jsou poznámky): výpis všech poznámek ke scénáři
- České dny — v editoru i PDF formát „Pondělí (20.2.)", LiberationSans font pro správnou diakritiku
- Dokumentace na webu — záložka "Dokumentace" přímo v aplikaci
- Swagger UI —
GET /docs
Tech stack
| Vrstva | Technologie |
|---|---|
| Backend | FastAPI + Uvicorn (Python 3.12) |
| Frontend | Vanilla JS + interact.js (drag & drop) |
| ReportLab Canvas API + LiberationSans (česká diakritika) | |
| Data | JSON (bez databáze, bez Excelu) |
| Container | Docker / Podman, python:3.12-slim |
| Deployment | Kubernetes (RKE2), namespace scenar |
Rychlý start (lokální vývoj)
# Klonování
git clone https://git.apps.sukany.cz/martin/scenar-creator.git
cd scenar-creator
# Virtuální prostředí
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# Spuštění
uvicorn app.main:app --reload --port 8080
# Otevři v prohlížeči
open http://localhost:8080
Testy
python3 -m pytest tests/ -v
37 testů pokrývá API endpointy, PDF generátor, validaci dat, overnight bloky a series_id.
Build a deploy
Manuální postup
# 1. Build image
podman build --format docker -t git.apps.sukany.cz/martin/scenar-creator:latest .
# 2. Push do Gitea registry
podman login git.apps.sukany.cz -u <user>
podman push git.apps.sukany.cz/martin/scenar-creator:latest
# 3. Restart deploymentu na clusteru
ssh root@infra01.sukany.cz \
"kubectl -n scenar rollout restart deployment/scenar && \
kubectl -n scenar rollout status deployment/scenar"
# 4. Ověření
curl https://scenar.apps.sukany.cz/api/health
Automatický build (Gitea CI/CD)
Push na main spustí .gitea/workflows/build-and-push.yaml, který automaticky builduje a pushuje image do Gitea registry.
Deployment na cluster je stále manuální (rollout restart).
Kubernetes manifest: sukany-org/rke2-deployments → scenar/scenar.yaml
Formát JSON
{
"version": "1.0",
"event": {
"title": "Název akce",
"subtitle": "Volitelný podtitul",
"date_from": "YYYY-MM-DD",
"date_to": "YYYY-MM-DD",
"location": "Místo konání"
},
"program_types": [
{ "id": "main", "name": "Hlavní program", "color": "#3B82F6" }
],
"blocks": [
{
"id": "b1",
"date": "YYYY-MM-DD",
"start": "HH:MM",
"end": "HH:MM",
"title": "Název bloku",
"type_id": "main",
"responsible": "Garant (volitelné)",
"notes": "Poznámka → horní index v PDF (volitelné)",
"series_id": "ID sdílené série (volitelné, generováno automaticky)"
}
]
}
Overnight bloky: end < start → blok přechází přes půlnoc (validní).
Zpětná kompatibilita: pole date (jednodnevní starý formát) je stále akceptováno.
API endpointy
| Metoda | URL | Popis |
|---|---|---|
| GET | / |
Hlavní UI |
| GET | /api/health |
Health check (verze) |
| GET | /api/sample |
Vzorový JSON ke stažení |
| POST | /api/validate |
Validace ScenarioDocument |
| POST | /api/generate-pdf |
Generování PDF |
| GET | /docs |
Swagger UI |
Struktura projektu
app/
api/ REST endpointy (scenario.py, pdf.py, router.py)
core/ Business logika (pdf_generator.py, validator.py)
models/ Pydantic modely (event.py, responses.py)
static/ Frontend (index.html, css/, js/)
js/
app.js State management, modal logika
canvas.js Horizontální canvas editor (interact.js)
api.js Fetch wrapper
export.js JSON import/export
tests/ 35 pytest testů
Dockerfile python:3.12-slim + fonts-liberation
requirements.txt