From 713f2d3c63e90f2194482608a4a91c1ccbcc4ff5 Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Sun, 23 Aug 2026 19:31:22 +0200 Subject: [PATCH] docs(notifications): complete German reference coverage --- pyproject.toml | 2 +- .../backend/manifest.py | 110 +++++++++++++++++- .../test_interface_documentation_contract.py | 23 ++++ webui/package.json | 2 +- 4 files changed, 133 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8af6079..d720bff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-notifications" -version = "0.1.18" +version = "0.1.19" description = "GovOPlaN notification inbox and delivery module." readme = "README.md" requires-python = ">=3.12" diff --git a/src/govoplan_notifications/backend/manifest.py b/src/govoplan_notifications/backend/manifest.py index 8f07525..c0a6fc0 100644 --- a/src/govoplan_notifications/backend/manifest.py +++ b/src/govoplan_notifications/backend/manifest.py @@ -12,6 +12,7 @@ from govoplan_core.core.module_guards import ( ) from govoplan_core.core.modules import ( CapabilityDocumentation, + DocumentationCondition, DocumentationTopic, FrontendModule, FrontendRoute, @@ -36,7 +37,7 @@ from govoplan_notifications.backend.dsar_provider import ( MODULE_ID = "notifications" MODULE_NAME = "Notifications" -MODULE_VERSION = "0.1.18" +MODULE_VERSION = "0.1.19" READ_SCOPE = "notifications:notification:read" WRITE_SCOPE = "notifications:notification:write" DISPATCH_SCOPE = "notifications:delivery:dispatch" @@ -204,6 +205,46 @@ manifest = ModuleManifest( ), }, }, + translations={ + "de": { + "title": "Datenschutzanfragen zu Benachrichtigungen", + "summary": ( + "An eine betroffene Person adressierte Benachrichtigungen und Einstellungen ausgeben, " + "persönliche Posteingangskopien löschen und externe Zustellnachweise prüfen." + ), + "body": ( + "Notifications gleicht verifizierte Konto-, Mitgliedschafts-, Identitäts-, Benutzer- und " + "E-Mail-Selektoren ausschließlich innerhalb des aktiven Mandanten ab. Das Auskunftspaket " + "enthält begrenzte Nachrichteninhalte, Empfängerfelder, Lebenszykluszeitpunkte, Quellverweise, " + "Nutzdaten und Metadaten sowie bereinigte Zustellversuche. Persönliche Einstellungen für " + "Kennzeichen, E-Mail, Zusammenfassungen und stummgeschaltete Quellmodule werden ebenfalls " + "einbezogen. Ausdrückliche Benachrichtigungs- oder Einstellungsverweise dürfen eine Anfrage nur " + "einschränken und müssen weiterhin zur betroffenen Person gehören. Nachrichten im internen " + "Posteingang sind abgeleitete Kopien und können deshalb nach Empfänger- und Änderungsprüfung " + "gelöscht werden, ohne dem Quellverweis in das Eigentümermodul zu folgen. Persönliche " + "Einstellungen können ebenfalls gelöscht werden; anschließend gelten wieder die Standardwerte. " + "Mail- und andere externe Kanalnachweise erfordern eine manuelle Aufbewahrungsprüfung, weil beim " + "Anbieter Annahme- und Zustellnachweise verbleiben können. Eine wiederholte Ausführung bleibt " + "unverändert; fremde Mandanten und Empfänger werden nie einbezogen." + ), + } + }, + structured_translation_version="1", + structured_translations={ + "de": { + "consequence_classes": { + "delete_inbox_copy": ( + "Entfernt die abgeleitete interne Benachrichtigung und ihre Versuche, nicht den Datensatz des Quellmoduls." + ), + "delete_preferences": ( + "Entfernt persönliche Abweichungen; anschließend gelten wieder die Benachrichtigungsstandardwerte." + ), + "review_external_delivery": ( + "Erfordert eine autorisierte Aufbewahrungsprüfung, bevor externe Zustellnachweise verändert werden." + ), + } + } + }, ), DocumentationTopic( id="notifications.center-and-preferences", @@ -212,9 +253,10 @@ manifest = ModuleManifest( body="Open the notification center to read, acknowledge, or follow notifications from enabled modules. Personal source-muting preferences remove matching entries from the personal list and badge counts even when a producer addressed the actor through an account, membership, or identity identifier; tenant-administrator evidence views remain complete. Preferences also control eligible delivery channels and categories. Disabling an optional external channel does not remove an unmuted in-product notification unless the originating module's retention policy does so.", documentation_types=("user",), audience=("user",), + conditions=(DocumentationCondition(required_scopes=(READ_SCOPE,)),), related_modules=("mail", "calendar", "scheduling", "workflow_engine"), metadata={ - "kind": "reference", + "kind": "workflow", "help_contexts": [ "notifications.route.notifications", "notifications.page.inbox", @@ -230,6 +272,39 @@ manifest = ModuleManifest( "update_preferences": "replace the current user's badge, channel, digest, and source-muting preferences", }, }, + translations={ + "de": { + "title": "Benachrichtigungszentrale verwenden", + "summary": ( + "Das Kennzeichen in der Titelleiste und die Benachrichtigungszentrale bündeln dauerhafte Hinweise, " + "die außerhalb einer unmittelbaren Anfrage Aufmerksamkeit erfordern." + ), + "body": ( + "Die Benachrichtigungszentrale zeigt Hinweise aktivierter Module zum Lesen, Bestätigen oder " + "Weiterverfolgen. Persönlich stummgeschaltete Quellmodule entfernen passende Einträge aus der " + "persönlichen Liste und der Kennzahl, auch wenn ein Erzeugermodul die Person über Konto, " + "Mitgliedschaft oder Identität adressiert hat; Nachweisansichten für Mandantenadministratoren " + "bleiben vollständig. Die Einstellungen steuern außerdem zulässige Zustellkanäle und Kategorien. " + "Das Abschalten eines optionalen externen Kanals entfernt keine nicht stummgeschaltete interne " + "Benachrichtigung, sofern dies nicht die Aufbewahrungsregel des Ursprungsmoduls vorsieht." + ), + } + }, + structured_translation_version="1", + structured_translations={ + "de": { + "consequence_classes": { + "mark_read": "Markiert die Benachrichtigung für den aktuellen Empfänger als gelesen.", + "acknowledge": "Hält zusätzlich zum Lesestatus eine ausdrückliche Bestätigung des Empfängers fest.", + "cancel": ( + "Stoppt eine geeignete Benachrichtigung vor der Anbieterannahme, ohne einen Fernrückruf zu behaupten." + ), + "update_preferences": ( + "Ersetzt die Einstellungen des aktuellen Benutzers für Kennzeichen, Kanäle, Zusammenfassungen und stummgeschaltete Quellen." + ), + } + } + }, ), DocumentationTopic( id="notifications.delivery-operations", @@ -251,6 +326,37 @@ manifest = ModuleManifest( "inspect_attempts": "read sanitized provider, status, timing, and error evidence for the selected notification", }, }, + translations={ + "de": { + "title": "Benachrichtigungszustellung betreiben", + "summary": ( + "Notifications speichert Nachrichtenabsicht und begrenzte kanalbezogene Versuche, bevor Worker optionale Zustellkanäle ausführen." + ), + "body": ( + "Erzeugende Module übergeben Benachrichtigungen über die Dispatch-Fähigkeit und verwalten keine " + "Zugangsdaten für die Zustellung. Die interne Zustellung ist die Grundlage. Produktive " + "E-Mail-Zustellung steht nur über eine aktivierte Mail-Fähigkeit bereit; Dateizustellung bleibt auf " + "Entwicklung beschränkt. Betreiber können ausstehende und fehlgeschlagene Versuche prüfen und nur " + "Ergebnisse erneut versuchen, deren Wiederholung sicher ist. Die Modulberechtigung des Mandanten " + "wird vor dem Einreihen und erneut vor der Worker-Zustellung geprüft. Das Deaktivieren von " + "Notifications bewahrt angenommene Nachrichten und bietet eine Betreiberaktion an, statt sie " + "unbemerkt zu verarbeiten." + ), + } + }, + structured_translation_version="1", + structured_translations={ + "de": { + "consequence_classes": { + "dispatch_pending": ( + "Versucht die Zustellung für höchstens die angeforderte Anzahl geeigneter Mandantenbenachrichtigungen." + ), + "inspect_attempts": ( + "Liest bereinigte Anbieter-, Status-, Zeit- und Fehlernachweise der ausgewählten Benachrichtigung." + ), + } + } + }, ), ), frontend=FrontendModule( diff --git a/tests/test_interface_documentation_contract.py b/tests/test_interface_documentation_contract.py index 1694f75..791e17e 100644 --- a/tests/test_interface_documentation_contract.py +++ b/tests/test_interface_documentation_contract.py @@ -3,6 +3,10 @@ from __future__ import annotations from pathlib import Path import unittest +from govoplan_core.core.modules import ( + documentation_structured_translation_issues, + localizable_documentation_metadata_keys, +) from govoplan_notifications.backend.manifest import get_manifest @@ -59,6 +63,25 @@ class NotificationsInterfaceDocumentationContractTests(unittest.TestCase): self.assertIn("notifications.action.dispatch", delivery.metadata["help_contexts"]) self.assertIn("dispatch_pending", delivery.metadata["consequence_classes"]) + def test_german_reference_documentation_is_complete(self) -> None: + topics = get_manifest().documentation + self.assertEqual(3, len(topics)) + for topic in topics: + translation = topic.translations.get("de", {}) + self.assertTrue(translation.get("title"), topic.id) + self.assertTrue(translation.get("summary"), topic.id) + self.assertTrue(translation.get("body"), topic.id) + if localizable_documentation_metadata_keys(topic): + self.assertEqual("1", topic.structured_translation_version, topic.id) + self.assertIn("de", topic.structured_translations, topic.id) + self.assertEqual((), documentation_structured_translation_issues(topic)) + + center = next(topic for topic in topics if topic.id == "notifications.center-and-preferences") + delivery = next(topic for topic in topics if topic.id == "notifications.delivery-operations") + self.assertEqual("workflow", center.metadata["kind"]) + self.assertTrue(center.conditions) + self.assertEqual("reference", delivery.metadata["kind"]) + def test_webui_uses_shared_consequence_and_draft_patterns(self) -> None: center = (REPO_ROOT / "webui/src/features/notifications/NotificationCenterPage.tsx").read_text(encoding="utf-8") settings = (REPO_ROOT / "webui/src/features/notifications/NotificationSettingsPanel.tsx").read_text(encoding="utf-8") diff --git a/webui/package.json b/webui/package.json index bbcb1c4..3e257e6 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/notifications-webui", - "version": "0.1.18", + "version": "0.1.19", "private": true, "type": "module", "main": "src/index.ts",