From 4408a9486fd8fb548e2bbde2e1dbf236c9b76edf Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Sun, 23 Aug 2026 19:31:24 +0200 Subject: [PATCH] docs(organizations): complete German reference coverage --- package.json | 2 +- pyproject.toml | 2 +- src/govoplan_organizations/__init__.py | 2 +- .../backend/manifest.py | 93 ++++++++++++++++++- .../test_interface_documentation_contract.py | 23 +++++ webui/package.json | 2 +- 6 files changed, 118 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b34ab88..2fc0db1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/organizations-webui", - "version": "0.1.18", + "version": "0.1.19", "private": true, "type": "module", "main": "webui/src/index.ts", diff --git a/pyproject.toml b/pyproject.toml index da3eb84..eb518e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-organizations" -version = "0.1.18" +version = "0.1.19" description = "GovOPlaN organizational model module." readme = "README.md" requires-python = ">=3.12" diff --git a/src/govoplan_organizations/__init__.py b/src/govoplan_organizations/__init__.py index 85f0e6e..93a6af0 100644 --- a/src/govoplan_organizations/__init__.py +++ b/src/govoplan_organizations/__init__.py @@ -1,3 +1,3 @@ """GovOPlaN organizations module.""" -__version__ = "0.1.18" +__version__ = "0.1.19" diff --git a/src/govoplan_organizations/backend/manifest.py b/src/govoplan_organizations/backend/manifest.py index 9467475..88290a3 100644 --- a/src/govoplan_organizations/backend/manifest.py +++ b/src/govoplan_organizations/backend/manifest.py @@ -9,6 +9,7 @@ from govoplan_core.core.access import ( from govoplan_core.core.module_guards import persistent_table_uninstall_guard from govoplan_core.core.modules import ( CapabilityDocumentation, + DocumentationCondition, DocumentationLink, DocumentationTopic, FrontendModule, @@ -143,7 +144,7 @@ def _organizations_dsar_provider(context: ModuleContext) -> object: manifest = ModuleManifest( id="organizations", name="Organizations", - version="0.1.18", + version="0.1.19", required_capabilities=( CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PERMISSION_EVALUATOR, @@ -314,6 +315,25 @@ manifest = ModuleManifest( ], }, order=24, + translations={ + "de": { + "title": "Organizations-Daten in einer Datenschutzanfrage prüfen", + "summary": ( + "Mandantenbezogene Zuordnungen von Änderungen am Organisationsmodell sammeln und institutionelle Governance-Nachweise bewahren." + ), + "body": ( + "Organizations speichert institutionelle Einheiten, Strukturen, Beziehungen und Funktionen statt persönlicher " + "Funktionsbesetzungen. IDM führt die Verknüpfungen zwischen Identitäten und Funktionen und beantwortet Anfragen " + "zu diesen Zuordnungen. Der DSAR-Anbieter von Organizations sucht deshalb nur bestätigte Kontozuordnungen an " + "Mandantenmodellinstanzen sowie Anträgen, Ausführungen oder Abbrüchen von Upgrades. Er gibt betroffene Vorlagen- " + "und Versionsverweise, Status, Revision, Zeitangaben und Integritätsprüfsummen aus. Globale Vorlagenurheberschaft, " + "fremde institutionelle Modellobjekte, Vorlagendefinitionen, Upgrade-Vorschauen und -Entscheidungen, Provenienz, " + "Idempotenzschlüssel, Anfrageprüfsummen, undurchsichtige Einstellungen und andere Mandanten bleiben ausgeschlossen. " + "Die Zuordnung bleibt als institutioneller Nachweis einer Modelländerung erhalten; der Anbieter veröffentlicht " + "keine automatische Löschaktion." + ), + } + }, ), DocumentationTopic( id="organizations.template-upgrades", @@ -361,6 +381,24 @@ manifest = ModuleManifest( ], }, order=27, + translations={ + "de": { + "title": "Organisationsmodell eines Mandanten aktualisieren", + "summary": ( + "Eine unveränderliche Systemvorlagenversion mit dem aktuellen mandanteneigenen Modell vergleichen, bevor ein Upgrade ausdrücklich angewendet wird." + ), + "body": ( + "In der Organizations-Administration wird eine Vorschau für eine neuere veröffentlichte Version der vom " + "Mandanten verwendeten Vorlage erstellt. Der gespeicherte Drei-Wege-Vergleich trennt kompatible Ergänzungen, " + "kompatible Änderungen, reine Mandantenabweichungen, destruktive Neuzuordnungen und ungültige Verweise. Reine " + "Mandantenänderungen bleiben erhalten. Konfliktbehaftete oder destruktive Einträge erfordern eine ausdrückliche " + "Entscheidung zum Behalten, Ersetzen oder zu einer begrenzten Zuordnung. Das Anwenden der geprüften Vorschau " + "erzeugt eine neue mandanteneigene Instanz und ersetzt die frühere Provenienz; eine laufende Vererbung entsteht " + "nie. Eine veraltete Vorschau wird abgewiesen, wenn sich Mandantenmodell oder eine der Vorlagenversionen geändert " + "hat. Ein Abbruch bewahrt den Prüfdatensatz, ohne Organisationsdaten zu verändern." + ), + } + }, ), DocumentationTopic( id="organizations.model", @@ -375,6 +413,9 @@ manifest = ModuleManifest( layer="configured", documentation_types=("admin", "user"), audience=("tenant_admin", "access_admin", "operator"), + conditions=( + DocumentationCondition(any_scopes=ORGANIZATIONS_READ_SCOPES), + ), related_modules=("tenancy", "access", "idm", "policy", "audit"), links=( DocumentationLink( @@ -389,7 +430,7 @@ manifest = ModuleManifest( ), ), metadata={ - "kind": "guide", + "kind": "workflow", "help_contexts": [ "organizations.workspace", "organizations.model", @@ -401,6 +442,22 @@ manifest = ModuleManifest( ], }, order=25, + translations={ + "de": { + "title": "Organisationsmodell", + "summary": ( + "Organizations führt Einheiten, Hierarchie und Funktionen. IDM verknüpft Identitäten mit Funktionen; Access bildet angenommene Fakten auf Rollen und Rechte ab." + ), + "body": ( + "Organisationseinheitsarten, Strukturen und Beziehungsarten modellieren die Selbstbeschreibung der Institution. " + "Eine konkrete Organisationseinheit kann gleichzeitig an mehreren Strukturen teilnehmen, etwa einer " + "Arbeitgeberhierarchie und einer akademischen Struktur. Funktionen beschreiben Verantwortlichkeiten in " + "Organisationseinheiten. IDM verknüpft Identitäten mit diesen Funktionen; Access bildet angenommene Fakten auf " + "Rollen und Rechte ab. Eine Funktion beweist für sich weder Mandat, Zuständigkeit, Entscheidungsbefugnis noch " + "Unterschriftsbefugnis; diese wirksamen institutionellen Fakten gehören in einen getrennten Anbietervertrag." + ), + } + }, ), DocumentationTopic( id="organizations.reference.fields-and-consequences", @@ -461,6 +518,38 @@ manifest = ModuleManifest( }, }, order=26, + translations={ + "de": { + "title": "Felder und Folgen des Organisationsmodells", + "summary": ( + "Mandanteneigene Modelldefinitionen, konkrete Einheiten, Beziehungen, Funktionen, Governance-Verweise und Lebenszykluszustände unterscheiden." + ), + "body": ( + "Einheitsarten, Strukturen, Beziehungsarten und Funktionsarten definieren das mandanteneigene Modell. Einheiten, " + "Beziehungen und Funktionen sind konkrete institutionelle Fakten darin. Slugs sind stabile Integrationsverweise; " + "Änderungen an Eltern und Beziehungen wirken auf Hierarchietraversierung und nachgelagerte Weiterleitung. " + "Deaktivierung bewahrt Datensatz und Nachweise, entfernt ihn aber aus der aktiven Auswahl. Kennzeichen für " + "Delegation und Handeln-an-Stelle beschreiben nur zulässige Organisationssemantik; Access und gesteuerte Workflows " + "entscheiden weiterhin über wirksame Befugnis. Eine delegierbare Funktion erlaubt einer begrenzten Vertretung, als " + "sie selbst zu handeln; Handeln-an-Stelle erlaubt einen ausdrücklich gewählten Vertretungskontext, der reales und " + "vertretenes Konto bewahrt. Beides bleibt in IDM quellverknüpft, zeitlich begrenzt und widerrufbar, statt aus " + "Gruppenmitgliedschaft abgeleitet zu werden. Wenn konfiguriert, ist vor Modelländerungen eine erfasste " + "Änderungsantragskennung erforderlich. Organisationseinstellungen gehören dem Mandanten und erben keine laufende " + "globale Hierarchie." + ), + } + }, + structured_translation_version="1", + structured_translations={ + "de": { + "consequence_classes": { + "model_change": "Ändert zulässiges Vokabular und Einschränkungen mandanteneigener Organisationsfakten.", + "hierarchy_change": "Ändert Traversierung, Weiterleitung und geerbten institutionellen Kontext nachgelagerter Module.", + "deactivate": "Bewahrt Fakt und Nachweis und entfernt sie aus der aktiven Auswahl.", + "settings": "Ändert mandanteneigene Governance, Prüftiefe und Aufbewahrungsverhalten.", + } + } + }, ), ), architecture=declared_module_architecture( diff --git a/tests/test_interface_documentation_contract.py b/tests/test_interface_documentation_contract.py index 8aa0f04..35949ff 100644 --- a/tests/test_interface_documentation_contract.py +++ b/tests/test_interface_documentation_contract.py @@ -2,6 +2,10 @@ from __future__ import annotations import unittest +from govoplan_core.core.modules import ( + documentation_structured_translation_issues, + localizable_documentation_metadata_keys, +) from govoplan_organizations.backend.manifest import manifest @@ -39,6 +43,25 @@ class OrganizationsInterfaceDocumentationContractTests(unittest.TestCase): ) self.assertIn("hierarchy_change", reference.metadata["consequence_classes"]) + def test_german_reference_documentation_is_complete(self) -> None: + topics = manifest.documentation + self.assertEqual(4, 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)) + + kinds = {topic.metadata.get("kind") for topic in topics} + self.assertIn("workflow", kinds) + self.assertIn("reference", kinds) + workflow = next(topic for topic in topics if topic.metadata.get("kind") == "workflow") + self.assertTrue(workflow.conditions) + if __name__ == "__main__": unittest.main() diff --git a/webui/package.json b/webui/package.json index d5f37e9..1663faa 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/organizations-webui", - "version": "0.1.18", + "version": "0.1.19", "private": true, "type": "module", "main": "src/index.ts",