diff --git a/pyproject.toml b/pyproject.toml index 033e569..3820add 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-templates" -version = "0.1.18" +version = "0.1.19" description = "GovOPlaN typed template library and deterministic printable rendering." readme = "README.md" requires-python = ">=3.12" diff --git a/src/govoplan_templates/__init__.py b/src/govoplan_templates/__init__.py index f218ed7..e9ce9a7 100644 --- a/src/govoplan_templates/__init__.py +++ b/src/govoplan_templates/__init__.py @@ -1,3 +1,3 @@ """GovOPlaN Templates module.""" -__version__ = "0.1.18" +__version__ = "0.1.19" diff --git a/src/govoplan_templates/backend/manifest.py b/src/govoplan_templates/backend/manifest.py index d1042e3..9a5435e 100644 --- a/src/govoplan_templates/backend/manifest.py +++ b/src/govoplan_templates/backend/manifest.py @@ -9,6 +9,7 @@ from govoplan_core.core.module_guards import ( ) from govoplan_core.core.modules import ( CapabilityDocumentation, + DocumentationCondition, DocumentationTopic, FrontendModule, FrontendRoute, @@ -39,7 +40,7 @@ from govoplan_templates.backend.dsar_provider import ( MODULE_ID = "templates" MODULE_NAME = "Templates" -MODULE_VERSION = "0.1.18" +MODULE_VERSION = "0.1.19" READ_SCOPE = "templates:template:read" WRITE_SCOPE = "templates:template:write" @@ -110,7 +111,25 @@ DOCUMENTATION = ( layer="available", documentation_types=("admin", "user"), audience=("operator", "module_admin", "product_owner"), + conditions=( + DocumentationCondition( + required_modules=("templates",), + any_scopes=(READ_SCOPE, WRITE_SCOPE, PUBLISH_SCOPE, ADMIN_SCOPE), + ), + ), + translations={ + "de": { + "title": "Vorlagenbibliothek verwalten", + "summary": "Versionierte Vorlagen mit ausdrücklichen Verwendungen und erforderlichen Datenfeldern erstellen.", + "body": ( + "Vorlagen sind wiederverwendbare, bereichsgebundene Definitionen. Jede Bearbeitung erzeugt eine unveränderliche Revision. " + "Veröffentlichen Sie die Revision, die Verbraucher für endgültige Ausgaben verwenden dürfen. Vor dem Rendern erläutert eine " + "Kompatibilitätsprüfung fehlende Felder, nicht unterstützte Verwendungen und nicht verfügbare Ausgabeformate." + ), + } + }, metadata={ + "kind": "workflow", "seed": True, "help_contexts": [ "templates.page", @@ -171,6 +190,18 @@ DOCUMENTATION = ( documentation_types=("admin", "user"), audience=("operator", "module_admin", "product_owner"), related_modules=("files", "dist_lists", "campaigns", "audit"), + translations={ + "de": { + "title": "Druckfähige Vorlagenausgabe", + "summary": "Etiketten, Umschläge, Briefe und Listenlayouts aus eingefrorenen Eingabe-Snapshots rendern.", + "body": ( + "Eine Vorschau darf eine Entwurfsrevision verwenden. Endgültige Ausgabe verlangt eine veröffentlichte Revision und einen " + "Idempotenzschlüssel. Ergebnisse legen Vorlagenhash, Eingabehash, Renderer-Version, Element-/Seitenanzahl, Diagnosen und " + "Ausgabe-Digest fest. Files speichert Artefakte, wenn die Fähigkeit verfügbar und berechtigt ist; andernfalls stellt Templates " + "einen begrenzten Download bereit. Drucken im Browser ist der unterstützte grundlegende Ausgabepfad." + ), + } + }, metadata={ "seed": True, "help_contexts": [ @@ -198,7 +229,26 @@ DOCUMENTATION = ( documentation_types=("admin", "user"), audience=("operator", "module_admin", "product_owner"), related_modules=("files", "dist_lists", "campaigns", "audit", "policy"), + translations={ + "de": { + "title": "Vorlagenfelder und Folgen des Lebenszyklus", + "summary": ( + "Semantik von Geltungsbereich, Verwendung, Datenvertrag, Veröffentlichung, Rendering und Löschung wiederverwendbarer Vorlagen." + ), + "body": ( + "Die Sichtbarkeit bestimmt, in welchem Mandanten-, Gruppen- oder Benutzerbereich eine Vorlage auffindbar ist; geerbte " + "Vorlagen können schreibgeschützt sein. Verwendungen sind Fähigkeitskontexte, die begrenzen, wo eine Vorlage ausgewählt werden " + "darf. Pflichtfelder bilden den Kompatibilitätsvertrag, der vor dem Rendern gegen bereitgestellte Daten geprüft wird. Speichern " + "erzeugt eine neue unveränderliche Revision. Veröffentlichen markiert eine Revision für endgültige Ausgabe, ohne ältere " + "Revisionen oder Nachweise umzuschreiben. Die Vorschau validiert und rendert begrenzte Beispielausgabe; endgültiges Rendering " + "verlangt die veröffentlichte Revision und zeichnet Vorlagen-, Eingabe- und Ausgabehash sowie Renderer-Nachweise auf. Files " + "darf das Artefakt aufbewahren, wenn die optionale Fähigkeit verfügbar ist. Löschen entfernt die Vorlage aus zukünftiger " + "Auswahl, schreibt aber aufbewahrte Rendering-Nachweise nicht um." + ), + } + }, metadata={ + "kind": "reference", "seed": True, "help_contexts": [ "templates.field.type", @@ -448,6 +498,20 @@ manifest = ModuleManifest( audience=("user", "operator", "module_admin", "auditor"), related_modules=("core", "files", "campaigns", "audit"), order=90, + translations={ + "de": { + "title": "Betroffenenanfragen für Vorlagen", + "summary": "Aktivität von Vorlagenautoren und Renderläufen ohne Inhalt oder bereitgestellte Daten exportieren.", + "body": ( + "Templates gleicht nur eine exakte mandantenbezogene Kontokennung ab und kann eine bereits verifizierte Suche auf eine " + "Vorlage, Revision oder einen Renderlauf begrenzen. Ausgegeben werden minimierte Lebenszyklusmetadaten für Definition, " + "Veröffentlichung und Rendering. Vorlagentext und -HTML, Pflichtfelder, Layouts, Metadaten, Eingabe-Snapshots, Dateinamen, " + "Diagnosen, Artefaktverweise, Ausgabebytes, Hashes und Idempotenzschlüssel sind ausgeschlossen. Gerenderte Fachdaten gehören " + "dem bereitstellenden Modul und werden nicht aus undurchsichtigen Vorlagennutzdaten abgeleitet. Die Zuordnung bleibt mit " + "unveränderlichen Definitions- und Rendering-Nachweisen erhalten." + ), + } + }, metadata={ "help_contexts": ["templates.page", "privacy.data-subject-requests"], "consequence_classes": { diff --git a/tests/test_interface_documentation_contract.py b/tests/test_interface_documentation_contract.py index a2c5789..4fb3d79 100644 --- a/tests/test_interface_documentation_contract.py +++ b/tests/test_interface_documentation_contract.py @@ -6,6 +6,14 @@ from govoplan_templates.backend.manifest import manifest class TemplatesInterfaceDocumentationContractTests(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) @@ -27,10 +35,12 @@ class TemplatesInterfaceDocumentationContractTests(unittest.TestCase): reference = topics["templates.reference.fields-and-consequences"] self.assertIn("templates.state.read-only", library.metadata["help_contexts"]) + self.assertEqual("workflow", library.metadata["kind"]) self.assertIn("templates.action.render-final", output.metadata["help_contexts"]) self.assertIn("templates.field.usages", reference.metadata["help_contexts"]) self.assertIn("publish_revision", reference.metadata["consequence_classes"]) self.assertIn("delete_template", reference.metadata["consequence_classes"]) + self.assertEqual("reference", reference.metadata["kind"]) if __name__ == "__main__": diff --git a/webui/package.json b/webui/package.json index d6c2c37..ddba613 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/templates-webui", - "version": "0.1.18", + "version": "0.1.19", "private": true, "type": "module", "main": "src/index.ts",