# Scenar Creator Jednoduchá CGI aplikace pro vytváření časových plánů (Excel) z nahraného Excelu se seznamem programů. Krátký, praktický popis, jak projekt spustit, testovat a kde hledat důležité části kódu. ## Co to dělá - `cgi-bin/scenar.py` načte Excel s řádky obsahujícími Datum, Začátek, Konec, Program, Typ, Garant, Poznámka. - Na základě polí `Typ` vytvoří HTML formulář pro přiřazení popisů a barev, a nakonec vygeneruje výsledný sešit (OpenPyXL) s časovou osou. ## Rychlý start (lokálně, bez Dockeru) 1) V kořeni repozitáře spusť jednoduchý CGI server (vyžaduje Python): ```bash python -m http.server --cgi 8000 # Otevři v prohlížeči: http://localhost:8000/cgi-bin/scenar.py ``` 2) Alternativně připrav virtuální prostředí a spusť testy: ```bash python -m venv .venv source .venv/bin/activate pip install -r requirements.txt pytest -q ``` ## Docker (produkční přiblížení) Dockerfile vytváří image na `python:3.12-slim`, instaluje `pandas` a `openpyxl`, nastaví Apache s povoleným CGI a DocumentRoot na `/var/www/htdocs`. Nasazení: ```bash docker build -t scenar-creator . docker run -p 8080:8080 scenar-creator # Pak otevři: http://localhost:8080/ ``` ## Testy - Testy jsou v `tests/` a používají `pytest`. - Přidal jsem testy pro funkci `read_excel` (happy path + invalid time). Spuštění viz výše. ## Struktura projektu (klíčové soubory) - `cgi-bin/scenar.py` — hlavní CGI skript (HTML generováno inline). Hledej funkce: - `read_excel(file_content)` — parsování vstupního xlsx (pandas) → vrací (valid_data, error_rows) - `create_timetable(...)` — vytváří OpenPyXL sešit - `get_program_types(form)` — načítání dynamických polí `type_code_{i}`, `desc_{i}`, `color_{i}` - `templates/scenar_template.xlsx` — šablona pro uživatele - `tmp/` — místo, kam se výsledné soubory ukládají při běhu (v Dockeru `/var/www/htdocs/tmp`) - `.github/copilot-instructions.md` — instrukce pro AI agenty (přehled konvencí a místa úprav) ## Konvence a poznámky pro vývojáře - HTML jsou inline stringy v `scenar.py` (sekce `if step == '1'`, `if step == '2'`, `if step == '3'`). Pokud budeš měnit UI, uprav tyto bloky. - Výstupní soubor se ukládá s "safe" jménem: povolena písmena, čísla a `. _ -` a mezera. - Barvy pro OpenPyXL: v kódu se převádějí na AARRGGBB pomocí `'FF' + raw_color.lstrip('#')`. - Parsování času: `normalize_time` podporuje `%H:%M` a `%H:%M:%S`. ## Doporučené další kroky - Přidat `requirements.txt` (hotovo) s pevnými verzemi pro deterministické buildy. - Přesunout jádro logiky z `cgi-bin/scenar.py` do importovatelného modulu (např. `scenar_core.py`) pro snazší testování a údržbu. - Přidat GitHub Actions workflow, který spouští `pytest` na PR. ## Kontakt Autor: Martin Sukaný — martin@sukany.cz