From a889071b71104e1c0c3312d072060dfb635f49b2 Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Mon, 24 Aug 2026 01:15:30 +0200 Subject: [PATCH] docs: complete German structured documentation --- package.json | 2 +- pyproject.toml | 2 +- src/govoplan_access/__init__.py | 2 +- .../german_structured_documentation.py | 326 ++++++++++++++++++ src/govoplan_access/backend/manifest.py | 10 +- webui/package.json | 2 +- 6 files changed, 339 insertions(+), 5 deletions(-) create mode 100644 src/govoplan_access/backend/german_structured_documentation.py diff --git a/package.json b/package.json index 289ca1f..5d825e4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/access-webui", - "version": "0.1.21", + "version": "0.1.22", "private": true, "type": "module", "main": "webui/src/index.ts", diff --git a/pyproject.toml b/pyproject.toml index 46b4e4e..6619622 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-access" -version = "0.1.21" +version = "0.1.22" description = "GovOPlaN access platform module with identity, auth, RBAC, and scope primitives." readme = "README.md" requires-python = ">=3.12" diff --git a/src/govoplan_access/__init__.py b/src/govoplan_access/__init__.py index b7eabf5..77af7b4 100644 --- a/src/govoplan_access/__init__.py +++ b/src/govoplan_access/__init__.py @@ -1,3 +1,3 @@ """GovOPlaN access platform module.""" -__version__ = "0.1.21" +__version__ = "0.1.22" diff --git a/src/govoplan_access/backend/german_structured_documentation.py b/src/govoplan_access/backend/german_structured_documentation.py new file mode 100644 index 0000000..6dc6198 --- /dev/null +++ b/src/govoplan_access/backend/german_structured_documentation.py @@ -0,0 +1,326 @@ +"""German translations for public structured documentation metadata.""" + +from __future__ import annotations + +from typing import Any + + +GERMAN_STRUCTURED_TRANSLATIONS: dict[str, dict[str, Any]] = {'access.reference.admin-access-fields': {'fields': [{'admin_description': 'Auf dem Konto und den ' + 'Mitglieder-Payloads ' + 'gespeichert. Es muss ' + 'normalisiert und ' + 'eindeutig für das ' + 'entsprechende ' + 'Login-Konto sein.', + 'api_field': 'email', + 'api_path': '/api/v1/admin/users', + 'field_id': 'access.user.email', + 'label': 'E-Mail', + 'permission_scope': 'access:membership:create', + 'provenance': 'Mandantenmitgliedschaft oder ' + 'Kontosuche.', + 'user_description': 'Die Adresse, die ' + 'verwendet wird, um die ' + 'Person zu ' + 'identifizieren, wenn ' + 'sie sich anmelden.', + 'validation': 'Muss eine gültige ' + 'E-Mail-Adresse sein.'}, + {'admin_description': 'Wird, sofern verfügbar, ' + 'in Benutzer- und ' + 'Kontoantworten als ' + 'display_name ausgegeben.', + 'api_field': 'display_name', + 'api_path': '/api/v1/admin/users', + 'field_id': 'access.user.display_name', + 'label': 'Anzeigename', + 'permission_scope': 'access:membership:update', + 'provenance': 'Profil der ' + 'Mandantenmitgliedschaft.', + 'user_description': 'Der lesbare Name, der ' + 'in Benutzerlisten und ' + 'Bewertungsbildschirmen ' + 'angezeigt wird.', + 'validation': 'Menschenlesbarer Text; Halten ' + 'Sie ihn für Administratoren ' + 'erkennbar.'}, + {'admin_description': 'Wird beim Aktualisieren ' + 'einer Benutzer- oder ' + 'Gruppenmitgliedschaft ' + 'als group_ids übertragen.', + 'api_field': 'group_ids', + 'api_path': '/api/v1/admin/users/{user_id}', + 'field_id': 'access.user.groups', + 'label': 'Gruppen', + 'permission_scope': 'access:group:manage_members', + 'provenance': 'Benutzergruppenmitgliedschaftszeilen.', + 'user_description': 'Gemeinsame Zugriffsbündel, ' + 'die Rollen für viele ' + 'Personen gleichzeitig ' + 'hinzufügen können.', + 'validation': 'Gruppen müssen zum gleichen ' + 'Mandant gehören.'}, + {'admin_description': 'Wird bei ' + 'Aktualisierungsanforderungen ' + 'für Benutzer- und ' + 'Gruppenrollen als role_ids ' + 'übertragen.', + 'api_field': 'role_ids', + 'api_path': '/api/v1/admin/users/{user_id}', + 'field_id': 'access.user.roles', + 'label': 'Rollen', + 'permission_scope': 'access:role:assign', + 'provenance': 'Direkte Benutzerrollen plus ' + 'Gruppenrollenvererbung.', + 'user_description': 'Direktzugangszuschüsse, ' + 'die einer Person ' + 'zugewiesen oder von ' + 'Gruppen geerbt wurden.', + 'validation': 'Rollen müssen zuordenbar sein ' + 'und dürfen das ' + 'Delegationslimit der ' + 'handelnden Person nicht ' + 'überschreiten.'}, + {'admin_description': 'Bildet Scopes beim ' + 'Erstellen eines ' + 'API-Schlüssel zu und ' + 'wird mit den aktuellen ' + 'Berechtigungen des ' + 'Besitzers geschnitten.', + 'api_field': 'scopes', + 'api_path': '/api/v1/admin/api-keys', + 'field_id': 'access.api_key.scopes', + 'label': 'Anwendungsbereiche', + 'permission_scope': 'access:api_key:create', + 'provenance': 'API-Schlüssel Grant plus ' + 'Eigentümerdelegation.', + 'user_description': 'Die Aktionen, die ein ' + 'API-Schlüssel ausführen ' + 'kann.', + 'validation': 'Verwenden Sie möglichst enge ' + 'Berechtigungsbereiche.'}]}, + 'access.reference.personal-navigation': {'outcome': 'Die Seitenschiene des Benutzers spiegelt die ' + 'persönlichen Präferenzen wider, während ' + 'verschlossene und unzugängliche Einträge ' + 'durch übergeordnete Richtlinien geregelt ' + 'bleiben.'}, + 'access.workflow.configuration-packages': {'limitations': ['Die Paketübernahme installiert keine ' + 'fehlenden Module.', + 'Die anbieterübergreifende Übernahme ist keine atomar ' + 'verteilte Transaktion.', + 'Generisches Rollback hängt von einem ' + 'beibehaltenen ' + 'vor der Übernahme erstellten Datenbank-Snapshot ab.'], + 'operational_consequences': ['Ein abgestandener oder ' + 'blockierter Preflight ' + 'muss vor der Anwendung ' + 'erneut durchgeführt ' + 'werden.', + 'Eine teilweise Anwendung ' + 'erfordert eine ' + 'Wiederherstellung, bevor ' + 'das Paket erneut ' + 'getestet wird.', + 'Geheimwerte bleiben ' + 'außerhalb tragbarer ' + 'Fragmente und ' + 'Herkunft.']}, + 'access.workflow.data-subject-request': {'limitations': ['Module ohne DSAR-Anbieter werden als ' + 'Deckungslücken gemeldet.', + 'Globale Konten und Identitäten werden ' + 'nicht automatisch gelöscht.']}, + 'access.workflow.grant-user-access': {'outcome': 'Eine Person kann sich beim Mandant anmelden und ' + 'erhält den beabsichtigten Zugang durch Gruppen ' + 'und Rollen.', + 'prerequisites': ['Sie können Admin öffnen.', + 'Sie können Benutzer, Gruppen und Rollen ' + 'lesen.', + 'Schreib- oder Zuweisungsaktionen ' + 'erfordern übereinstimmende ' + 'Verwaltungsberechtigungen.'], + 'result': 'Die Mitgliedschaft hat die beabsichtigten ' + 'effektiven Berechtigungen und keine breiteren ' + 'Rollen als nötig.', + 'steps': ['Öffnen Sie Admin und gehen Sie zu Benutzern.', + 'Finden Sie die bestehende Person oder erstellen ' + 'Sie eine Mitgliedschaft mit ihrer E-Mail-Adresse ' + 'und dem Anzeigenamen.', + 'Überprüfen Sie aktuelle Gruppen und direkte ' + 'Rollen, bevor Sie etwas ändern.', + 'Fügen Sie die Person der kleinsten Gruppe hinzu, ' + 'die den erforderlichen gemeinsamen Zugriff ' + 'gewährt.', + 'Weisen Sie direkte Rollen nur zu, wenn eine ' + 'Gruppe nicht mit dem Fall übereinstimmt.', + 'Speichern und überprüfen Sie eine ' + 'Blockernachricht, bevor Sie einen System- oder ' + 'Mandantbesitzer um Hilfe bitten.'], + 'verification': 'Öffnen Sie den Benutzer erneut und ' + 'vergleichen Sie Gruppen, direkte Rollen ' + 'und effektive Berechtigungen mit der ' + 'Anforderung.'}, + 'access.workflow.manage-api-keys': {'consequences': ['Der Widerruf lehnt nachfolgende Anfragen, ' + 'die mit dem Schlüssel gestellt wurden, ' + 'sofort ab.', + 'Durch das Entfernen von Berechtigungen vom ' + 'Besitzer wird der effektive ' + 'Schlüsselzugriff sofort eingeschränkt.'], + 'limitations': ['Ein einmaliges Geheimnis kann nach dem ' + 'Schließen des Erstellungsdialogs nicht ' + 'angezeigt oder wiederhergestellt werden.', + 'Ändern des Besitzers, Ablauf oder Scopes ' + 'erfordert einen Ersatzschlüssel.', + 'Der Widerruf aktualisiert keine externen ' + 'Clients; die Betreiber müssen bei Bedarf ' + 'einen Ersatz installieren.'], + 'outcome': 'Der Automatisierungsclient verfügt über einen ' + 'zeitlich begrenzten Berechtigungsnachweis, dessen ' + 'effektiver Zugriff weder seine gespeicherten ' + 'Berechtigungsbereiche noch die aktuellen ' + 'Berechtigungen seines Besitzers überschreiten ' + 'kann.', + 'prerequisites': ['Der Mandant erlaubt ' + 'API-Anmeldeinformationen.', + 'Die handelnde Person kann API-Schlüssel ' + 'erstellen oder widerrufen und jeden ' + 'ausgewählten Bereich delegieren.', + 'Ein zugelassener externer Geheimmanager ' + 'und rechenschaftspflichtiger Eigentümer ' + 'sind bekannt.'], + 'steps': ['Wählen Sie den verantwortlichen Eigentümer und die ' + 'engsten erforderlichen Berechtigungsbereiche.', + 'Legen Sie den kürzesten praktischen Ablauf fest, ' + 'bevor Sie den Schlüssel erstellen.', + 'Übertragen Sie das einmalige Geheimnis direkt in ' + 'den genehmigten Geheimmanager.', + 'Widerrufen Sie den Schlüssel, wenn sein Client, ' + 'Eigentümer oder Zweck nicht mehr gültig ist.'], + 'verification': 'Laden Sie das Schlüsselverzeichnis neu, ' + 'überprüfen Sie Eigentümer, Präfix, ' + 'Berechtigungsumfang, Ablauf und Status und ' + 'testen Sie dann den beabsichtigten Client, ' + 'ohne geheimes Material in Nachweise zu ' + 'kopieren.'}, + 'access.workflow.manage-reusable-credentials': {'limitations': ['GovOPlaN kann ein konfiguriertes ' + 'Geheimnis nicht anzeigen oder ' + 'wiederherstellen.', + 'Eine leere Modul- oder ' + 'Serverbeschränkung bedeutet ' + 'jeden Wert, der nach ' + 'Berechtigungsumfang zulässig ' + 'ist.', + 'Das Löschen oder Leeren eines ' + 'Geheimnisses schreibt keine ' + 'abhängigen Verbindungsreferenzen ' + 'neu.'], + 'outcome': 'Die Zugangsdaten bleiben ' + 'schreibgeschützt und sind nur ' + 'innerhalb seines aktiven ' + 'Berechtigungsumfangs, Moduls, Servers ' + 'und Autorisierungsgrenzen verwendbar.', + 'prerequisites': ['Der beabsichtigte ' + 'Berechtigungsinhaber wird ' + 'ausgewählt.', + 'Die handelnde Person kann ' + 'Anmeldeinformationen lesen und ' + 'hat Schreibautorität für ' + 'Mutationen.', + 'Der externe ' + 'Secret-Manager-Eigentümer und ' + 'abhängige Verbindungen sind ' + 'bekannt.'], + 'steps': ['Wählen Sie den engsten Besitzumfang ' + 'und Anmeldetyp.', + 'Beschränken Sie Module und Server ' + 'explizit, wenn eine breite Nutzung ' + 'nicht beabsichtigt ist.', + 'Speichern Sie ein neues oder ' + 'Ersatzgeheimnis, ohne zu erwarten, ' + 'dass es erneut angezeigt wird.', + 'Überprüfen Sie abhängige Verbindungen ' + 'vor der Deaktivierung, geheimen ' + 'Löschung oder Löschung.'], + 'verification': 'Laden Sie die Liste der ' + 'Zugangsdaten neu, bestätigen Sie ' + 'deren Berechtigungsumfang und ' + 'Verfügbarkeit und testen Sie ' + 'dann jede beabsichtigte ' + 'abhängige Verbindung, ohne das ' + 'Geheimnis zu enthüllen.'}, + 'access.workflow.manage-service-account-credentials': {'consequences': ['Rotation widerruft den ' + 'vorherigen Nachweis in ' + 'der gleichen ' + 'Transaktion, die seinen ' + 'Ersatz schafft.', + 'Der Widerruf, die ' + 'Deaktivierung des Kontos ' + 'und der Ruhestand lehnen ' + 'betroffene ' + 'Kundenanfragen sofort ' + 'ab.', + 'Eine veraltete Revision ' + 'wird abgelehnt, so dass ' + 'ein gleichzeitiger ' + 'Verwaltungswechsel nicht ' + 'überschrieben wird.'], + 'limitations': ['Einmalige ' + 'Anmeldegeheimnisse können ' + 'nach dem Schließen des ' + 'Erstellungsdialogs nicht ' + 'angezeigt oder ' + 'wiederhergestellt werden.', + 'Deaktivierung und eine ' + 'reduzierte ' + 'Berechtigungsumfangsobergrenze ' + 'betreffen Clients sofort, ' + 'schreiben ihre externe ' + 'Konfiguration jedoch ' + 'nicht neu.', + 'Der Ruhestand widerruft ' + 'alle aktiven ' + 'Anmeldeinformationen und ' + 'erfordert ein neues ' + 'Servicekonto für die ' + 'spätere ' + 'Wiederverwendung.'], + 'outcome': 'Der Automatisierungsprinzipal ' + 'bleibt nicht interaktiv und ' + 'kann sich nur durch einen ' + 'aktiven Berechtigungsnachweis ' + 'authentifizieren, dessen ' + 'Gewährung innerhalb der ' + 'aktuellen ' + 'Berechtigungsumfangsobergrenze ' + 'des Kontos liegt.', + 'prerequisites': ['Der Mandant erlaubt ' + 'API-Anmeldeinformationen.', + 'Sie haben eine ' + 'Service-Account-Schreibberechtigung ' + 'und können jeden ' + 'ausgewählten Bereich ' + 'delegieren.'], + 'steps': ['Erstellen Sie ein Servicekonto ' + 'und definieren Sie die engste ' + 'Nutzumfangsobergrenze.', + 'Öffnen Sie das Konto und ' + 'erstellen Sie einen ' + 'Berechtigungsnachweis mit einem ' + 'gleichen oder engeren ' + 'Berechtigungsumfang.', + 'Notieren Sie das einmalige ' + 'Geheimnis in einem externen ' + 'Geheimmanager.', + 'Anmeldeinformationen vor Ablauf ' + 'drehen und Anmeldeinformationen ' + 'widerrufen, die nicht mehr ' + 'verwendet werden.'], + 'verification': 'Die Verwaltungstabelle ' + 'zeigt die erwartete ' + 'Anzahl der aktiven ' + 'Anmeldeinformationen, den ' + 'Zeitstempel für die ' + 'letzte Verwendung, die ' + 'Revision und die ' + 'Audit-Ereignisse, ohne ' + 'geheimes Material ' + 'preiszugeben.'}} diff --git a/src/govoplan_access/backend/manifest.py b/src/govoplan_access/backend/manifest.py index 3a9a198..970c224 100644 --- a/src/govoplan_access/backend/manifest.py +++ b/src/govoplan_access/backend/manifest.py @@ -1,5 +1,8 @@ from __future__ import annotations +from govoplan_core.core.modules import with_documentation_structured_translations +from govoplan_access.backend.german_structured_documentation import GERMAN_STRUCTURED_TRANSLATIONS + from pathlib import Path from govoplan_access.backend.configuration_provider import ( @@ -1918,7 +1921,7 @@ def _people_search(context: ModuleContext) -> object: manifest = ModuleManifest( id="access", name="Access", - version="0.1.21", + version="0.1.22", optional_dependencies=("identity", "organizations", "tenancy", "idm"), provides_interfaces=( ModuleInterfaceProvider(name=CAPABILITY_ACCESS_PEOPLE_SEARCH, version="0.1.0"), @@ -2153,5 +2156,10 @@ manifest = ModuleManifest( ) +manifest = with_documentation_structured_translations( + manifest, locale="de", translations=GERMAN_STRUCTURED_TRANSLATIONS +) + + def get_manifest() -> ModuleManifest: return manifest diff --git a/webui/package.json b/webui/package.json index 616e929..42dba89 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/access-webui", - "version": "0.1.21", + "version": "0.1.22", "private": true, "type": "module", "scripts": {