docs(postbox): complete German reference coverage

This commit is contained in:
2026-08-22 06:50:34 +02:00
parent e5da713d5f
commit 54e84d484d
7 changed files with 65 additions and 6 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "govoplan-postbox" name = "govoplan-postbox"
version = "0.1.18" version = "0.1.19"
description = "Function-bound institutional postboxes for GovOPlaN." description = "Function-bound institutional postboxes for GovOPlaN."
readme = "README.md" readme = "README.md"
requires-python = ">=3.12" requires-python = ">=3.12"
+1 -1
View File
@@ -1,3 +1,3 @@
"""GovOPlaN Postbox module.""" """GovOPlaN Postbox module."""
__version__ = "0.1.18" __version__ = "0.1.19"
+49 -1
View File
@@ -72,7 +72,7 @@ from govoplan_postbox.backend.permissions import (
MODULE_ID = "postbox" MODULE_ID = "postbox"
MODULE_NAME = "Postbox" MODULE_NAME = "Postbox"
MODULE_VERSION = "0.1.18" MODULE_VERSION = "0.1.19"
def _permission(scope: str, label: str, description: str) -> PermissionDefinition: def _permission(scope: str, label: str, description: str) -> PermissionDefinition:
@@ -665,6 +665,19 @@ manifest = ModuleManifest(
documentation_types=("admin", "user"), documentation_types=("admin", "user"),
audience=("administrator", "user", "campaign_manager"), audience=("administrator", "user", "campaign_manager"),
related_modules=("search", "idm", "encryption"), related_modules=("search", "idm", "encryption"),
translations={
"de": {
"title": "Berechtigte Postfachnachrichten durchsuchen",
"summary": "Betreffzeilen und zulässige Klartextinhalte aus Postbox für die berechtigungsgeprüfte Plattform-Suche bereitstellen.",
"body": (
"Ist Search installiert, stellt Postbox ausschließlich Betreffzeilen, Absenderbezeichnungen und Klartextinhalte "
"von Nachrichten bereit. Chiffrat und Schlüsselmaterial werden niemals indiziert. Jedes Ergebnis ist auf den "
"Mandanten begrenzt und prüft aktuelle Funktionszuweisung, Postfachbindung, Klassifikation, Handlungskontext "
"und allgemeine Leseberechtigung erneut, ohne die Nachricht als gelesen zu markieren. Abgeschlossene Zustellungen "
"und Nachrichtenänderungen aktualisieren den abgeleiteten Index über den dauerhaften Plattform-Ereignispfad."
),
}
},
order=34, order=34,
), ),
DocumentationTopic( DocumentationTopic(
@@ -876,6 +889,22 @@ manifest = ModuleManifest(
kind="api", kind="api",
), ),
), ),
translations={
"de": {
"title": "Funktionsgebundene Postfächer",
"summary": "Dauerhafte institutionelle Nachrichtencontainer, deren Zugriff den wirksamen Zuweisungen zu Organisationsfunktionen folgt.",
"body": (
"Postfächer gehören zu Verantwortlichkeiten und nicht zu einzelnen Konten. Ein stabiles Postfach bleibt während "
"einer Vakanz und Neubesetzung adressierbar. Der aktuelle Zugriff verbindet eine allgemeine Postfachberechtigung "
"mit dem wirksamen IDM-Zuweisungskontext. Vorlagen können einheitsspezifische Adressen bei Bedarf erzeugen; exakte "
"Postfächer bilden besondere Verantwortlichkeiten ab. Die Administration wählt Klartext, die empfohlene institutionell "
"verwaltete Encryption-Umschlagverschlüsselung oder einen strikten, extern erzeugten E2EE-Vertrag. Verwaltete Umschläge "
"bleiben für berechtigte institutionelle Schlüsselverantwortliche entschlüsselbar; E2EE weist Klartext zurück und "
"GovOPlaN besitzt keinen privaten Entschlüsselungsschlüssel. Ist Tasks aktiviert, erscheinen aktuell lesbare ungelesene "
"Nachrichten auch im gemeinsamen Arbeitsvorrat und verschwinden dort, sobald der persönliche Lesestatus gespeichert ist."
),
}
},
metadata={ metadata={
"kind": "guide", "kind": "guide",
"help_contexts": [ "help_contexts": [
@@ -940,6 +969,25 @@ manifest = ModuleManifest(
kind="source", kind="source",
), ),
), ),
translations={
"de": {
"title": "Postfachfelder und ihre Auswirkungen",
"summary": "Referenz für Adresse, Vorlage, Routing, Nachricht, Gruppierung, Klassifikation, Aufbewahrung und Lebenszyklus.",
"body": (
"Eine Postfachadresse ist dauerhaft und an eine Organisationsfunktion gebunden. Vorlagenrevisionen sind nach der "
"Veröffentlichung unveränderlich; die Stilllegung einer Vorlage entfernt keine bereits erzeugten Adressen. Die "
"Archivierung einer Adresse stoppt neue Zustellungen und bewahrt Nachrichten und Nachweise. Zusammengefasste "
"Posteingänge sind ausschließlich persönliche Projektionen und verschieben oder löschen niemals Quellnachrichten. "
"Die Klassifikation begrenzt zulässige Zustellungs- und Hierarchiekopieziele. Hierarchiekopien sind eigenständige "
"Zustellungen mit eigenen Nachweisen; die Vakanzeskalation erfolgt verzögert und getrennt prüfbar. Ablauf oder Rücknahme "
"einer Nachricht sperrt den künftigen Inhaltszugriff, kann aber bereits kopierten, exportierten oder gedruckten Klartext "
"nicht zurückrufen. Teilbaumvorlagen wählen genau eine Organisationsstruktur und optional Beziehungstypen. Ihre "
"schreibgeschützte Auswirkungsvorschau meldet erzeugte Adressen, aktuelle Stelleninhaber, Vakanzen, Kollisionen, Zyklen, "
"Tiefengrenzen und mehrdeutige Pfade, ohne Vorlagen oder Postfächer anzulegen. Gruppierungssummen umfassen nur Quellpostfächer, "
"die für das aktuelle Konto sichtbar sind."
),
}
},
metadata={ metadata={
"kind": "reference", "kind": "reference",
"help_contexts": [ "help_contexts": [
@@ -10,6 +10,17 @@ REPOSITORY_ROOT = Path(__file__).resolve().parents[1]
class PostboxInterfaceDocumentationContractTests(unittest.TestCase): class PostboxInterfaceDocumentationContractTests(unittest.TestCase):
def test_public_topics_have_complete_german_coverage(self) -> None:
topics = manifest.documentation
self.assertEqual(9, len(topics))
for topic in topics:
translation = topic.translations["de"]
self.assertEqual({"title", "summary", "body"}, set(translation))
self.assertTrue(
all(str(translation[field]).strip() for field in translation)
)
def test_route_and_contributed_surfaces_remain_declared(self) -> None: def test_route_and_contributed_surfaces_remain_declared(self) -> None:
frontend = manifest.frontend frontend = manifest.frontend
self.assertIsNotNone(frontend) self.assertIsNotNone(frontend)
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@govoplan/postbox-webui", "name": "@govoplan/postbox-webui",
"version": "0.1.18", "version": "0.1.19",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "src/index.ts", "main": "src/index.ts",
@@ -22,7 +22,7 @@ assert(page.includes("useUnsavedDraftGuard") && admin.includes("useUnsavedDraftG
assert(page.includes("delete_grouping_confirmation") && page.includes("ConfirmDialog"), "Deleting a unified view confirms that source records remain unchanged"); assert(page.includes("delete_grouping_confirmation") && page.includes("ConfirmDialog"), "Deleting a unified view confirms that source records remain unchanged");
assert(admin.includes("archive_confirmation") && admin.includes("retire_template_confirmation"), "Address and template lifecycle actions use shared destructive confirmation"); assert(admin.includes("archive_confirmation") && admin.includes("retire_template_confirmation"), "Address and template lifecycle actions use shared destructive confirmation");
assert(patterns.includes('topicId: "postbox.function-bound-containers"') && patterns.includes('topicId: "postbox.reference.fields-and-consequences"'), "Postbox uses manifest-backed help references"); assert(patterns.includes('topicId: "postbox.function-bound-containers"') && patterns.includes('topicId: "postbox.reference.fields-and-consequences"'), "Postbox uses manifest-backed help references");
assert(moduleSource.includes('version: "0.1.18"') && moduleSource.includes("generatedTranslations"), "WebUI metadata matches the module release and registers translations"); assert(moduleSource.includes('version: "0.1.19"') && moduleSource.includes("generatedTranslations"), "WebUI metadata matches the module release and registers translations");
assert(translations.includes('"i18n:govoplan-postbox.unavailable_message_reason"'), "Access-sensitive unavailable states are localized"); assert(translations.includes('"i18n:govoplan-postbox.unavailable_message_reason"'), "Access-sensitive unavailable states are localized");
assert(widget.includes("usePlatformLanguage") && widget.includes("i18nMessage"), "Widget dates and dynamic accessible labels follow the platform locale"); assert(widget.includes("usePlatformLanguage") && widget.includes("i18nMessage"), "Widget dates and dynamic accessible labels follow the platform locale");
assert(!page.includes("window.confirm") && !admin.includes("window.confirm"), "Postbox does not use browser-native consequential confirmation"); assert(!page.includes("window.confirm") && !admin.includes("window.confirm"), "Postbox does not use browser-native consequential confirmation");
+1 -1
View File
@@ -97,7 +97,7 @@ const postboxAdminSections: AdminSectionsUiCapability = {
export const postboxModule: PlatformWebModule = { export const postboxModule: PlatformWebModule = {
id: "postbox", id: "postbox",
label: "i18n:govoplan-postbox.postbox", label: "i18n:govoplan-postbox.postbox",
version: "0.1.18", version: "0.1.19",
dependencies: ["identity", "organizations", "idm"], dependencies: ["identity", "organizations", "idm"],
optionalDependencies: [ optionalDependencies: [
"access", "access",