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ý JSONGET /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 UIGET /docs

Tech stack

Vrstva Technologie
Backend FastAPI + Uvicorn (Python 3.12)
Frontend Vanilla JS + interact.js (drag & drop)
PDF 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-deploymentsscenar/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
Description
No description provided
Readme 977 KiB
Languages
JavaScript 36.8%
Python 34.5%
CSS 15.7%
HTML 12.2%
Dockerfile 0.4%
Other 0.4%