From c12b15e0212b25b74c54097d36959f7ef8d83be1 Mon Sep 17 00:00:00 2001 From: Rob Date: Tue, 11 Aug 2026 09:37:55 +0200 Subject: [PATCH] feat: add version check with message in app window --- 0_application/app.py | 63 +++++++++++++++++++++++++++++++++- 0_application/version_check.py | 49 ++++++++++++++++++++++++++ 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 0_application/version_check.py diff --git a/0_application/app.py b/0_application/app.py index 32c8741..da2d889 100644 --- a/0_application/app.py +++ b/0_application/app.py @@ -29,6 +29,7 @@ from src.models import AppConfig from src.parser import parse_input_file, group_by_employee, get_unique_antragsnummern, get_unique_employees from src.validator import validate_input_file, validate_template from src.writer import generate_activity_reports +from version_check import UPDATE_DIR, get_latest_version def set_active_employee(employee_name: str): @@ -76,6 +77,60 @@ except Exception as e: st.error(f"Fehler beim Laden der Konfiguration: {e}") st.stop() +# --- Versionsinformation für die dezente Anzeige am Seitenende --- +current_version_text = "" +try: + local_version, latest_version = get_latest_version() + current_version_text = f"v{'.'.join(map(str, local_version))}" + if latest_version: + available_version, _ = latest_version + version_text = ".".join(map(str, available_version)) + st.html( + f''' + + ''' + ) + with st.container(key="update_notice_open"): + if st.button("Update Ordner öffnen 📁", key="open_update_directory", help="Update-Ordner öffnen"): + if sys.platform == "win32": + os.startfile(str(UPDATE_DIR)) +except Exception: + pass + # --- Session State initialisieren --- if "parsed_records" not in st.session_state: st.session_state.parsed_records = [] @@ -94,7 +149,6 @@ if "cached_tpl_result" not in st.session_state: st.session_state.cached_tpl_result = None if "employee_months" not in st.session_state: st.session_state.employee_months = {} - # --- Layout: zwei Spalten --- col1, col2 = st.columns(2) @@ -433,3 +487,10 @@ if "generated_files" in st.session_state and st.session_state.generated_files: help="Ordner im Finder öffnen", use_container_width=True, ) + +if current_version_text: + st.markdown( + f'
' + f'Programmversion {current_version_text}
', + unsafe_allow_html=True, + ) diff --git a/0_application/version_check.py b/0_application/version_check.py new file mode 100644 index 0000000..7ba6e1b --- /dev/null +++ b/0_application/version_check.py @@ -0,0 +1,49 @@ +"""Prüft auf neuere Programmversionen im zentralen SMB-Verzeichnis.""" + +import re +from pathlib import Path + +UPDATE_DIR = Path(r"j:\Fachbereiche\BO\Produktionsschule\Maßnahmeunterlagen\20_Personal\05_Tätigkeitsnachweise ESF\Nachweise-automatisiert-generieren") +VERSION_PATTERN = re.compile(r"Tätigkeitsnachweis-Generator v(\d+)\.(\d+)\.(\d+)(?:\.\d+)?\.(zip|exe)$", re.IGNORECASE) +CHANGELOG_PATTERN = re.compile(r"^## \[(\d+)\.(\d+)(?:\.(\d+))?\]", re.MULTILINE) + + +def get_latest_version(): + match = CHANGELOG_PATTERN.search(Path(__file__).with_name("CHANGELOG.md").read_text(encoding="utf-8")) + current = tuple(int(part or 0) for part in match.groups()) if match else (0, 0, 0) + try: + available = UPDATE_DIR.exists() + except OSError: + available = False + if not available: + return current, None + newer = [] + try: + paths = UPDATE_DIR.iterdir() + for path in paths: + found = VERSION_PATTERN.fullmatch(path.name) + if found: + version = tuple(int(found.group(i)) for i in range(1, 4)) + if version > current: + newer.append((version, path)) + except OSError: + return current, None + if newer: + return current, max(newer) + return current, None + + +def main() -> int: + current, latest = get_latest_version() + print(f"[INFO] Lokale Version: v{'.'.join(map(str, current))}") + if latest: + version, path = latest + print(f"[HINWEIS] Neuere Version verfügbar: v{'.'.join(map(str, version))}") + print(f"[HINWEIS] Datei: {path}") + else: + print("[INFO] Keine neuere Version gefunden oder Update-Verzeichnis nicht erreichbar.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())