From 40cfe78aa7a7f7646227a36c49e11ce2330fa658 Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:10:22 +0200 Subject: [PATCH] fix: add icons to update notification details --- AppImage/scripts/notification_templates.py | 30 ++++++++++++++ .../tests/test_notification_runtime_i18n.py | 41 +++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/AppImage/scripts/notification_templates.py b/AppImage/scripts/notification_templates.py index a5714d5c..66a9065a 100644 --- a/AppImage/scripts/notification_templates.py +++ b/AppImage/scripts/notification_templates.py @@ -2221,6 +2221,7 @@ FIELD_EMOJI = { 'kernel_count': '\u2699\uFE0F', 'important_list': '\U0001F4CB', # clipboard 'current_version': '\U0001F4E6', # package \u2014 installed version + 'new_version': '\U0001F195', # NEW button \u2014 offered version 'latest_version': '\U0001F195', # NEW button \u2014 upstream version 'kernel': '\u2699\uFE0F', # gear \u2014 running kernel 'menu_label': '\U0001F4D6', # open book \u2014 menu navigation hint @@ -2394,12 +2395,41 @@ def enrich_with_emojis(event_type: str, title: str, body: str, # Build enriched body: prepend field emojis to recognizable lines lines = preprocessed.split('\n') enriched_lines = [] + app_update_is_single = ( + not isinstance(data.get('updates'), list) or len(data['updates']) < 2 + ) + app_update_lead_added = False + app_update_version = None + if event_type == 'app_update_available' and app_update_is_single: + app_update_version = f"{data.get('installed', '')} → {data.get('latest', '')}".strip() for line in lines: stripped = line.strip() if not stripped: enriched_lines.append(line) continue + + # App-update notifications deliberately use a compact, prose-like + # template rather than field labels. Keep their two structured lines + # as readable as other update notifications without depending on a + # translated phrase to recognize them. + if event_type == 'app_update_available' and app_update_is_single: + if not app_update_lead_added: + enriched_lines.append(f'📦 {stripped}') + app_update_lead_added = True + continue + if app_update_version and stripped == app_update_version: + enriched_lines.append(f'🔄 {stripped}') + continue + + # The Proxmox VE detector emits the manager version as a concise, + # structured technical detail outside the localized template fields. + # Mark only that known detail; arbitrary detector text remains intact. + if event_type == 'pve_update' and re.match( + r'^pve-manager\s+\S+\s+(?:→|->)\s+\S+$', stripped, + ): + enriched_lines.append(f'🔧 {stripped}') + continue # First, check health-specific patterns health_enriched = False diff --git a/AppImage/scripts/tests/test_notification_runtime_i18n.py b/AppImage/scripts/tests/test_notification_runtime_i18n.py index 2e24fde8..dde2f917 100644 --- a/AppImage/scripts/tests/test_notification_runtime_i18n.py +++ b/AppImage/scripts/tests/test_notification_runtime_i18n.py @@ -221,6 +221,47 @@ class RuntimeCatalogTests(unittest.TestCase): self.assertIn("📦 Kontajner repopulse-labs-test (CT 210) má 1 aktualizácií Docker:", enriched_body) self.assertIn("🐳 • Docker Engine: 29.8.0 → 29.8.1", enriched_body) + def test_app_and_proxmox_update_body_icons_cover_versions(self): + app_data = { + "hostname": "HomeLAB_1", "app_name": "Uptime Kuma", "vmid": "108", + "ct_name": "uptime-kuma", "installed": "2.5.4", "latest": "2.5.5", + "severity": "INFO", "_notification_language": "sk", + } + app = notification_templates.render_template( + "app_update_available", app_data, language="sk", + ) + _title, app_body = notification_templates.enrich_with_emojis( + "app_update_available", app["title"], app["body"], app_data, + ) + self.assertIn("📦 Aplikácia Uptime Kuma na CT 108 (uptime-kuma) má novú verziu:", app_body) + self.assertIn("🔄 2.5.4 → 2.5.5", app_body) + + pve_data = { + "hostname": "HomeLAB_1", "current_version": "9.2.18", + "new_version": "9.2.20", "details": "pve-manager 9.2.18 → 9.2.20", + "severity": "INFO", "_notification_language": "sk", + } + pve = notification_templates.render_template("pve_update", pve_data, language="sk") + _title, pve_body = notification_templates.enrich_with_emojis( + "pve_update", pve["title"], pve["body"], pve_data, + ) + self.assertIn("📦 Aktuálna: 9.2.18", pve_body) + self.assertIn("🆕 Nová: 9.2.20", pve_body) + self.assertIn("🔧 pve-manager 9.2.18 → 9.2.20", pve_body) + + for language in self.RUNTIME_LANGUAGES: + locale_data = {**pve_data, "_notification_language": language} + locale = notification_templates.render_template( + "pve_update", locale_data, language=language, + ) + _title, locale_body = notification_templates.enrich_with_emojis( + "pve_update", locale["title"], locale["body"], locale_data, + ) + label = notification_templates._localized_template_labels( + "pve_update", language, + )["new_version"][0] + self.assertIn(f"🆕 {label}: 9.2.20", locale_body, language) + def test_missing_slovak_key_falls_back_to_english(self): with tempfile.TemporaryDirectory() as directory: root = Path(directory)