Files
scenar-creator/README.md
Martin Sukany 9a7ffdeb2c copilot test
2025-11-13 11:37:28 +01:00

2.8 KiB

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):
python -m http.server --cgi 8000
# Otevři v prohlížeči: http://localhost:8000/cgi-bin/scenar.py
  1. Alternativně připrav virtuální prostředí a spusť testy:
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í:

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