From 06afa79795fd7e4fab1199dd44eeb7d814031f18 Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Sun, 23 Aug 2026 20:27:25 +0200 Subject: [PATCH] docs(forms): complete German reference coverage --- pyproject.toml | 2 +- src/govoplan_forms/__init__.py | 2 +- src/govoplan_forms/backend/manifest.py | 63 ++++++++++++++++++- .../test_interface_documentation_contract.py | 13 +++- webui/package.json | 2 +- webui/src/module.ts | 2 +- 6 files changed, 77 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6957d8f..f7d7e75 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-forms" -version = "0.1.20" +version = "0.1.21" description = "Immutable reusable form definitions for GovOPlaN." readme = "README.md" requires-python = ">=3.12" diff --git a/src/govoplan_forms/__init__.py b/src/govoplan_forms/__init__.py index 03aab85..d19d77b 100644 --- a/src/govoplan_forms/__init__.py +++ b/src/govoplan_forms/__init__.py @@ -1,3 +1,3 @@ """GovOPlaN Forms module.""" -__version__ = "0.1.20" +__version__ = "0.1.21" diff --git a/src/govoplan_forms/backend/manifest.py b/src/govoplan_forms/backend/manifest.py index 907d134..737f9ec 100644 --- a/src/govoplan_forms/backend/manifest.py +++ b/src/govoplan_forms/backend/manifest.py @@ -13,6 +13,7 @@ from govoplan_core.core.module_guards import ( ) from govoplan_core.core.modules import ( CapabilityDocumentation, + DocumentationCondition, DocumentationLink, DocumentationTopic, FrontendModule, @@ -47,7 +48,7 @@ from govoplan_forms.backend.semantic_subjects import ( MODULE_ID = "forms" MODULE_NAME = "Forms" -MODULE_VERSION = "0.1.20" +MODULE_VERSION = "0.1.21" READ_SCOPE = "forms:definition:read" WRITE_SCOPE = "forms:definition:write" ADMIN_SCOPE = "forms:definition:admin" @@ -97,7 +98,9 @@ def _semantic_subjects( def _configuration_provider(_context: ModuleContext): - from govoplan_forms.backend.configuration_provider import SqlFormsConfigurationProvider + from govoplan_forms.backend.configuration_provider import ( + SqlFormsConfigurationProvider, + ) return SqlFormsConfigurationProvider() @@ -292,6 +295,27 @@ manifest = ModuleManifest( kind="repository", ), ), + translations={ + "de": { + "title": "Konfigurierte Bedeutung von Formularen und Feldern dokumentieren", + "summary": ( + "Mandanteneigene semantische Erläuterungen an ein berechtigtes Formular, Feld oder einen Abschnitt anfügen, ohne das " + "Schema zu verändern." + ), + "body": ( + "Ist Docs installiert, liefert Forms dokumentationssichere Subjekte für jede zugängliche aktuelle Definition sowie ihre " + "stabilen Felder und Abschnitte. Die Subjektidentität übersteht Änderungen an Bezeichnung und Reihenfolge. Ein gelöschter " + "und später neu angelegter Schlüssel erhält eine neue Abstammungsidentität; ältere Dokumentation bleibt ausdrücklich " + "verwaist, statt stillschweigend neu angefügt zu werden. Fingerabdrücke ändern sich nur, wenn sich relevante Formular-, " + "Feld-, Lokalisierungs-, Hierarchie-, Validierungs- oder Sichtbarkeitssemantik ändert, und fordern dann eine redaktionelle " + "Prüfung an; Docs-Inhalte werden niemals automatisch veröffentlicht oder entwertet. Semantischer Text darf Bedeutung, " + "Erhebungszweck, Interpretation, beabsichtigte und nicht beabsichtigte Verwendung sowie Beispiele erläutern, aber weder " + "Feldtyp, Pflichtstatus, Einschränkungen, Validierung, Optionen, Richtlinie noch übermittelte Werte überstimmen. Forms prüft " + "Mandant und Leseberechtigung für Ermittlung, direkte Auflösung, Kontexthilfe, Suche und Docs-Projektion erneut. Fehlt Docs, " + "funktionieren Formularerstellung und statische Hilfe unverändert weiter." + ), + } + }, metadata={ "kind": "reference", "help_contexts": ["forms.semantic-documentation"], @@ -317,6 +341,20 @@ manifest = ModuleManifest( documentation_types=("admin", "user"), audience=("user", "operator", "module_admin", "auditor"), related_modules=("core", "forms_runtime", "docs", "audit"), + translations={ + "de": { + "title": "Betroffenenanfragen für Formulardefinitionen", + "summary": "Aktivität der Definitionsautoren exportieren, ohne Schemata als übermittelte Werte zu behandeln.", + "body": ( + "Forms gleicht nur eine exakte mandantenbezogene Kontokennung ab und kann eine bereits verifizierte Suche auf ein " + "Formular oder eine Definitionsrevision begrenzen. Ausgegeben werden unveränderliche Revisionskennung, " + "Lebenszykluszustand und Zeitpunkte der Definitionsarbeit der betroffenen Person. Titel, Suchtext, Schemanutzdaten, " + "Feldsemantik, Richtlinienverweise und Inhalte von Änderungsgründen sind nicht enthalten. Forms speichert keine " + "übermittelten Werte; Forms Runtime und der zuständige Service exportieren diese Datensätze getrennt. Die Zuordnung der " + "Definitionsarbeit bleibt mit der unveränderlichen Schemahistorie erhalten." + ), + } + }, metadata={ "help_contexts": ["forms.catalogue", "privacy.data-subject-requests"], "consequence_classes": { @@ -338,6 +376,11 @@ manifest = ModuleManifest( layer="configured", documentation_types=("admin", "user"), audience=("user", "operator", "module_admin", "product_owner"), + conditions=( + DocumentationCondition( + any_scopes=(READ_SCOPE, WRITE_SCOPE, ADMIN_SCOPE) + ), + ), links=( DocumentationLink( label="Forms boundary and recovery", @@ -345,7 +388,23 @@ manifest = ModuleManifest( kind="repository", ), ), + translations={ + "de": { + "title": "Wiederverwendbare Formulardefinitionen erstellen", + "summary": ( + "Unveränderliche versionierte Schemata erstellen, die Forms Runtime und institutionelle Services verwenden." + ), + "body": ( + "Jede Revision legt Feldtypen, Optionen, Einschränkungen sowie Anforderungen an Entwurf, Anlagen, Signaturen, " + "Richtlinien und Übergaben fest. Die Veröffentlichung erfolgt ausdrücklich; vorhandene Einreichungen behalten ihre " + "exakte Revision. Katalog, Filter, Leerzustände, Abschnittsüberschriften und Feldgruppen der Definition verwenden die " + "gemeinsame responsive Layoutsprache und ordnen sich bei geringer Breite neu an, ohne Filterumfang, Berechtigungen oder " + "Lebenszykluswirkungen zu verändern." + ), + } + }, metadata={ + "kind": "workflow", "seed": True, "help_contexts": [ "forms.navigation", diff --git a/tests/test_interface_documentation_contract.py b/tests/test_interface_documentation_contract.py index 9f692fd..3d59bc4 100644 --- a/tests/test_interface_documentation_contract.py +++ b/tests/test_interface_documentation_contract.py @@ -11,6 +11,14 @@ from govoplan_core.core.semantic_documentation import ( class FormsInterfaceDocumentationContractTests(unittest.TestCase): + def test_all_static_topics_have_complete_german_content(self) -> None: + for topic in manifest.documentation: + german = (topic.translations or {}).get("de", {}) + self.assertEqual({"title", "summary", "body"}, set(german), topic.id) + self.assertTrue( + all(str(value).strip() for value in german.values()), topic.id + ) + def test_route_and_surfaces_remain_declared(self) -> None: frontend = manifest.frontend self.assertIsNotNone(frontend) @@ -26,7 +34,10 @@ class FormsInterfaceDocumentationContractTests(unittest.TestCase): reference = topics["forms.reference.fields-and-consequences"] self.assertIn("forms.catalogue", guide.metadata["help_contexts"]) self.assertGreaterEqual(len(guide.metadata["privacy_notes"]), 3) - self.assertIn("forms.field.publication-state", reference.metadata["help_contexts"]) + self.assertEqual("workflow", guide.metadata["kind"]) + self.assertIn( + "forms.field.publication-state", reference.metadata["help_contexts"] + ) self.assertIn("publish", reference.metadata["consequence_classes"]) self.assertIn("import_package", reference.metadata["consequence_classes"]) diff --git a/webui/package.json b/webui/package.json index 34acce2..bfbe72e 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/forms-webui", - "version": "0.1.20", + "version": "0.1.21", "private": true, "type": "module", "main": "src/index.ts", diff --git a/webui/src/module.ts b/webui/src/module.ts index c694a00..3a61479 100644 --- a/webui/src/module.ts +++ b/webui/src/module.ts @@ -9,7 +9,7 @@ const FormsPage = lazy(() => import("./features/forms/FormsPage")); export const formsModule: PlatformWebModule = { id: "forms", label: "i18n:govoplan-forms.form_definitions", - version: "0.1.20", + version: "0.1.21", dependencies: ["access"], optionalDependencies: ["forms_runtime", "portal", "workflow_engine", "cases", "policy", "docs"], translations: generatedTranslations,