# 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 - **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 - **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](https://interactjs.io/) (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) ```bash # 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 ```bash python3 -m pytest tests/ -v ``` 35 testů pokrývá API endpointy, PDF generátor a validaci dat. --- ## Build a deploy ### Manuální postup ```bash # 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 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 ```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é)" } ] } ``` **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 ```