From d6560b343a9da9e5db3fdc5f2d9e39e852b024a6 Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Sat, 22 Aug 2026 06:12:27 +0200 Subject: [PATCH] docs(docs): complete German reference coverage --- package.json | 2 +- pyproject.toml | 2 +- src/govoplan_docs/backend/manifest.py | 87 +++++++++++++++++++++++++-- tests/test_public_export.py | 11 ++++ webui/package.json | 2 +- 5 files changed, 97 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 0fe178b..f741975 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/docs-webui", - "version": "0.1.18", + "version": "0.1.20", "private": true, "type": "module", "main": "webui/src/index.ts", diff --git a/pyproject.toml b/pyproject.toml index 4feddd1..4245528 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-docs" -version = "0.1.19" +version = "0.1.20" description = "GovOPlaN documentation module for configured-system, available, and evidence documentation." readme = "README.md" requires-python = ">=3.12" diff --git a/src/govoplan_docs/backend/manifest.py b/src/govoplan_docs/backend/manifest.py index fdee366..de0b925 100644 --- a/src/govoplan_docs/backend/manifest.py +++ b/src/govoplan_docs/backend/manifest.py @@ -131,7 +131,7 @@ def _dsar_provider(_context: ModuleContext) -> DocsDsarProvider: manifest = ModuleManifest( id="docs", name="Docs", - version="0.1.19", + version="0.1.20", required_capabilities=( CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PERMISSION_EVALUATOR, @@ -339,6 +339,22 @@ manifest = ModuleManifest( kind="repository", ), ), + translations={ + "de": { + "title": "Semantische Dokumentation des Mandanten", + "summary": "Erläutern, was konfigurierte Formulare, Felder, Workflows, Schritte und andere stabile Fachobjekte in diesem Mandanten bedeuten.", + "body": ( + "Autorinnen und Autoren wählen ein berechtigtes Fachobjekt aus, das sein besitzendes Modul bereitstellt, " + "und verfassen sprachspezifische Hinweise als Klartext. Jeder Speichervorgang erzeugt eine unveränderliche Revision. " + "Die Mandantenrichtlinie legt direkte Veröffentlichung oder eine unabhängige Prüfung fest. Veröffentlichte Inhalte " + "unterliegen weiterhin der aktuellen Berechtigung für das Fachobjekt, der Zielgruppe und Klassifizierung der Dokumentation, " + "der Mandantentrennung und der Sprachauswahl. Geänderte, fehlende, abgelöste oder vorübergehend nicht verfügbare Fachobjekte " + "werden ausdrücklich gekennzeichnet; Direktlinks, Kontexthilfe, Suche, Zwischenspeicher und Mandantenexporte wenden dieselbe " + "Berechtigungsprüfung beim Lesen an. Stilllegung und Ablösung bewahren die Historie. Allgemeine öffentliche Dokumentationsexporte " + "enthalten niemals semantische Mandanteneinträge; für diese steht der getrennt berechtigte Mandantenexport bereit." + ), + } + }, metadata={"kind": "workflow"}, ), DocumentationTopic( @@ -378,6 +394,20 @@ manifest = ModuleManifest( ), ), related_modules=("access", "audit", "policy"), + translations={ + "de": { + "title": "Semantische Docs-Zuordnungen in einer Betroffenenanfrage prüfen", + "summary": "Minimierte Verweise auf Autorenschaft, Prüfung, Eigentümerschaft und fachliche Zuständigkeit exportieren, ohne unbeteiligte mandanteneigene Hinweise offenzulegen.", + "body": ( + "Docs gleicht exakte Konto- und namensraumgebundene Verweise auf semantische Einträge innerhalb des aktiven Mandanten ab. " + "Die Projektion nennt Eintrag, Revision, Fachobjekt, Sprache, Lebenszyklusstatus und die übereinstimmenden Felder, schließt den " + "verfassten Inhalt jedoch aus. Zuordnungen veröffentlichter, abgelöster und stillgelegter Inhalte sind unveränderliche Nachweise " + "der Konfigurationssteuerung und werden mit Begründung aufbewahrt. Zuordnungen aus Entwürfen erfordern eine manuelle fachliche " + "Prüfung, damit Eigentümerschaft oder Zuständigkeit vor einer möglichen Anonymisierung neu zugewiesen werden können; Docs führt " + "keine automatische Löschung aus." + ), + } + }, metadata={ "kind": "workflow", "route": "/admin?section=tenant-data-subject-requests", @@ -397,8 +427,8 @@ manifest = ModuleManifest( translations={ "de": { "title": "Dokumentation dieses Systems", - "summary": "Diese Dokumentation beginnt mit den installierten Modulen, der aktiven Konfiguration und den Funktionen, die fuer diese Rolle sichtbar sind.", - "body": "Module koennen feste Dokumentationsabschnitte beitragen. Wenn Inhalte von Tenant-Regeln, installierten Integrationen oder Betriebsoptionen abhaengen, kann ein Modul laufzeitbasierte Dokumentation registrieren.", + "summary": "Diese Dokumentation beginnt mit den installierten Modulen, der aktiven Konfiguration und den Funktionen, die für diese Rolle sichtbar sind.", + "body": "Module können feste Dokumentationsabschnitte beitragen. Wenn Inhalte von Mandantenregeln, installierten Integrationen oder Betriebsoptionen abhängen, kann ein Modul laufzeitbasierte Dokumentation registrieren.", }, }, links=( @@ -472,7 +502,7 @@ manifest = ModuleManifest( "de": { "title": "Architektur der institutionellen Steuerung", "summary": "GovOPlaN modelliert institutionelle Verantwortung, gesteuerte Arbeit, formale Ergebnisse, Nachweise und die Datenhoheit externer Systeme, ohne alle Begriffe in den Kern oder eine monolithische Anwendung zu ziehen.", - "body": "Organisationen, Identitaeten, IDM, Zugriff und Richtlinien beantworten unterschiedliche Teile der Frage, wer handeln darf. Mandate, Leistungen, Verfahrensbeteiligte und formale Entscheidungen beginnen als gemeinsame Vertraege und werden erst bei nachgewiesenem eigenstaendigem Lebenszyklus zu Modulen. Integrationen erklaeren technische Reife und Datenhoheit getrennt.", + "body": "Organisationen, Identitäten, IDM, Zugriff und Richtlinien beantworten unterschiedliche Teile der Frage, wer handeln darf. Mandate, Leistungen, Verfahrensbeteiligte und formale Entscheidungen beginnen als gemeinsame Verträge und werden erst bei nachgewiesenem eigenständigem Lebenszyklus zu Modulen. Integrationen erklären technische Reife und Datenhoheit getrennt.", }, }, links=( @@ -508,6 +538,17 @@ manifest = ModuleManifest( audience=("user", "tenant_admin", "operator", "module_admin"), order=20, i18n_key="docs.topic.pattern.field_help", + translations={ + "de": { + "title": "Hinweis am Feld", + "summary": "Eine kleine Hilfemarkierung neben einer Beschriftung gibt lokalen Kontext, ohne dichte Formulare in Handbücher zu verwandeln.", + "body": ( + "Verwenden Sie die Markierung für kurze Erläuterungen zu einem Feld, einer Option oder einem kompakten Begriff. " + "Verweisen Sie auf ein Ablauf- oder Referenzthema, wenn Schritte, API-Zuordnung, Richtlinienherkunft oder betriebliche " + "Einzelheiten benötigt werden." + ), + } + }, links=( DocumentationLink( label="Documentation experience concept", @@ -549,6 +590,18 @@ manifest = ModuleManifest( audience=("user", "tenant_admin", "operator", "module_admin"), order=21, i18n_key="docs.topic.pattern.contextual_help", + translations={ + "de": { + "title": "Kontextsensitive Hilfe", + "summary": "Mit F1 Hilfe zum aktuellen Seiten-, Feld-, Aktions- oder Dialogkontext öffnen.", + "body": ( + "GovOPlaN löst Hilfe zuerst für das fokussierte Feld oder die fokussierte Aktion auf, danach für den Dialog oder Abschnitt, " + "die aktuelle Seite und schließlich das besitzende Modul. Ist eine genaue Dokumentation vorhanden, wird sie angezeigt; andernfalls " + "dient die Seiten- oder Moduldokumentation als Rückfall. Die Hilfe-Schaltfläche in der Titelleiste öffnet den aktuellen Seitenkontext. " + "Die Dokumentation bleibt nach Zielgruppe, Berechtigungen und konfigurierten Modulen des aktuellen Kontos gefiltert." + ), + } + }, links=( DocumentationLink( label="Contextual help contract", @@ -584,6 +637,19 @@ manifest = ModuleManifest( audience=("user", "tenant_admin", "operator", "module_admin"), order=22, i18n_key="docs.topic.reference.temporal_data_context", + translations={ + "de": { + "title": "Zeitlicher Datenkontext", + "summary": "Festlegen, ob Seiten aktuell gültige Datensätze, zu einem gewählten Zeitpunkt gültige Datensätze oder alle Gültigkeitszustände zeigen.", + "body": ( + "Die Kalendersteuerung in der Titelleiste setzt die Gültigkeitszeit für beteiligte Module. Aktuell ist die neutrale " + "Voreinstellung. Zeitpunkt zeigt Datensätze, die zum gewählten Moment gültig sind; Alle umfasst historische und zukünftige " + "Gültigkeitszustände. Die Aufzeichnungszeit bleibt davon getrennt und beschreibt, wann die Plattform eine Tatsache erfahren " + "oder gespeichert hat. Berechtigungen werden stets gegenwärtig ausgewertet; eine Zeitauswahl stellt daher niemals frühere " + "Zugriffsrechte wieder her." + ), + } + }, links=( DocumentationLink( label="Temporal data read contract", @@ -617,6 +683,19 @@ manifest = ModuleManifest( required_modules=("organizations", "identity", "idm", "access"), ), ), + translations={ + "de": { + "title": "Abgrenzung von Organisationen, Identität, IDM und Zugriff", + "summary": "Organizations definiert Strukturen und Funktionen, Identity Personen und Konten, IDM die Zuordnung von Identitäten zu Funktionen und Access die daraus entstehenden Rollen und Rechte.", + "body": ( + "Verwenden Sie Organizations für Einheitstypen, Strukturen, Beziehungen, Organisationseinheiten und Funktionsdefinitionen. " + "Identity verwaltet normalisierte Identitäten und Kontoverknüpfungen. IDM ordnet eine Identität oder ein Konto einer Funktion " + "in einer Organisationseinheit zu und bildet dabei auch Delegation oder Handeln für andere ab. Access überführt anerkannte " + "Funktionsmerkmale in Rollen und Berechtigungen. Diese Aufteilung trennt das Organisationsmodell vom Identitätslebenszyklus " + "und hält Autorisierungsentscheidungen ausdrücklich nachvollziehbar." + ), + } + }, links=( DocumentationLink( label="Organizations", href="/organizations", kind="runtime" diff --git a/tests/test_public_export.py b/tests/test_public_export.py index b0b914e..d13fbb3 100644 --- a/tests/test_public_export.py +++ b/tests/test_public_export.py @@ -6,6 +6,7 @@ import unittest from pathlib import Path from govoplan_core.core.modules import DocumentationTopic, ModuleManifest +from govoplan_docs.backend.manifest import get_manifest as get_docs_manifest from govoplan_docs.public_export import ( ManifestSource, build_public_catalog, @@ -16,6 +17,16 @@ from govoplan_docs.public_export import ( class PublicDocumentationExportTests(unittest.TestCase): + def test_docs_manifest_has_complete_german_public_coverage(self) -> None: + module = build_public_catalog( + (ManifestSource(get_docs_manifest()),) + )["modules"][0] + + self.assertEqual(9, module["coverage"]["topic_count"]) + self.assertEqual(0, module["coverage"]["missing_german_topic_count"]) + self.assertEqual([], module["coverage"]["missing_german_topic_ids"]) + self.assertEqual([], module["coverage"]["missing"]) + def test_catalog_projects_localized_manifest_topics_and_gaps(self) -> None: manifest = ModuleManifest( id="example", diff --git a/webui/package.json b/webui/package.json index 4100af3..109b39d 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/docs-webui", - "version": "0.1.19", + "version": "0.1.20", "private": true, "type": "module", "main": "src/index.ts",