163 lines
4.2 KiB
Markdown
163 lines
4.2 KiB
Markdown
# 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 <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
|
|
|
|
```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
|
|
```
|