diff --git a/pyproject.toml b/pyproject.toml index e4d5d4f..7c529ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-poll" -version = "0.1.18" +version = "0.1.19" description = "GovOPlaN lightweight poll and availability decision module seed." readme = "README.md" requires-python = ">=3.12" diff --git a/src/govoplan_poll/__init__.py b/src/govoplan_poll/__init__.py index ec2023a..0a366de 100644 --- a/src/govoplan_poll/__init__.py +++ b/src/govoplan_poll/__init__.py @@ -2,4 +2,4 @@ __all__ = ["__version__"] -__version__ = "0.1.18" +__version__ = "0.1.19" diff --git a/src/govoplan_poll/backend/manifest.py b/src/govoplan_poll/backend/manifest.py index ca4e3ee..e8a426d 100644 --- a/src/govoplan_poll/backend/manifest.py +++ b/src/govoplan_poll/backend/manifest.py @@ -23,7 +23,7 @@ from govoplan_poll.backend.dsar_provider import POLL_DSAR_CAPABILITY, PollDsarPr MODULE_ID = "poll" MODULE_NAME = "Poll" -MODULE_VERSION = "0.1.18" +MODULE_VERSION = "0.1.19" READ_SCOPE = "poll:poll:read" WRITE_SCOPE = "poll:poll:write" ADMIN_SCOPE = "poll:poll:admin" @@ -83,6 +83,17 @@ DOCUMENTATION = ( documentation_types=("admin", "user"), audience=("user", "operator", "module_admin", "product_owner"), related_modules=("scheduling", "evaluation", "calendar", "campaigns", "portal"), + translations={ + "de": { + "title": "Abgrenzung des Poll-Moduls", + "summary": "Leichtgewichtige Entscheidungs- und Verfügbarkeitsabfragen für wiederverwendbare Modulintegrationen.", + "body": ( + "Poll verwaltet wiederverwendbare Abfragedefinitionen, Optionen, Einladungen, Antworten, Sichtbarkeitsregeln, Abschlusssemantik und Ergebnisübersichten. " + "Scheduling verwendet Poll für Verfügbarkeitsmatrizen, während Evaluation umfangreichere Befragungen, Bewertungen, Rubriken und Analysen verwaltet. " + "Access ist optional: Wenn es installiert ist, kann Poll die Auflösung von Akteuren, Berechtigungsprüfungen und Rollenvorlagen nutzen; ohne Access ist Poll auf anonyme, signierte Link- oder durch Adapter bereitgestellte Teilnahmeabläufe beschränkt." + ), + } + }, metadata={"seed": True}, ), DocumentationTopic( @@ -99,6 +110,18 @@ DOCUMENTATION = ( documentation_types=("user",), audience=("user", "participant", "organizer"), related_modules=("scheduling", "evaluation"), + translations={ + "de": { + "title": "An einer Abfrage teilnehmen", + "summary": "Abfragen können Einzel- oder Mehrfachauswahl, Ja/Nein, Ja/Nein/Vielleicht, Rangfolgen und Verfügbarkeiten erfassen.", + "body": ( + "Eine Einladung oder ein signierter Teilnahmelink bestimmt, zu welcher Abfrage und Teilnehmeridentität eine Antwort gehört. " + "Die Abfragerichtlinie steuert Anonymität, nachträgliche Änderungen, Ergebnissichtbarkeit, Öffnungs- und Schließzeiten sowie die Zulässigkeit der Antwort Vielleicht. " + "Das Absenden ist atomar: Kapazitäts- und Auswahlbedingungen werden geprüft, bevor die gespeicherte Antwort eine frühere Antwort ersetzt. " + "Ein gültiger signierter Link löst außerdem vor der Ausführung von Poll seinen Mandanten auf, sodass die Modulrichtlinie des Mandanten die öffentliche Oberfläche zurückziehen kann, ohne Zustand eines anderen Mandanten offenzulegen." + ), + } + }, metadata={"kind": "reference"}, ), ) @@ -241,6 +264,19 @@ manifest = ModuleManifest( documentation_types=("admin", "user"), audience=("user", "participant", "organizer", "auditor"), related_modules=("core", "scheduling", "notifications", "mail"), + translations={ + "de": { + "title": "Datenschutzanfragen für Poll", + "summary": "Identifizierte Antworten und Einladungen exportieren und dabei Ergebnisintegrität sowie die Grenze anonymer Teilnahme wahren.", + "body": ( + "Poll korreliert ausschließlich im aktiven Mandanten genaue Teilnehmerkennungen und normalisierte E-Mail-Adressen. " + "Eine passende Einladung kann ihre ausdrücklich verknüpfte Teilnahmeübermittlung und Antwort auflösen, ohne den signierten Token offenzulegen. " + "Eigene Antworten enthalten begrenzte Antwortwerte, Teilnehmerbezeichnungen, Poll-Kontext und Ausmusterungszustand. Einladungen enthalten Kontakt- und Lebenszyklusdaten, jedoch niemals Token-Hashes, Gateway-Konfiguration, Teilnahmebedingungen, Metadaten, Fingerabdrücke oder Idempotenzwerte. " + "Erstellungs- und Lebenszyklusaktivität wird nur als minimierte Zuordnung exportiert. Vollständig anonyme Antworten besitzen keinen stabilen Betroffenenbezug und können nicht korreliert werden. " + "Die Löschung von Teilnahmedaten erfordert eine manuelle Prüfung von Ergebnisintegrität und Aufbewahrung; keine automatische Aktion verändert unbemerkt ein Abfrageergebnis." + ), + } + }, metadata={ "help_contexts": ["privacy.data-subject-requests"], "consequence_classes": { diff --git a/tests/test_manifest.py b/tests/test_manifest.py index 180dda2..8091b9b 100644 --- a/tests/test_manifest.py +++ b/tests/test_manifest.py @@ -25,9 +25,16 @@ class PollManifestTests(unittest.TestCase): self.assertIn("poll.signed_participation", {interface.name for interface in manifest.provides_interfaces}) self.assertIn("poll.governed_participation", {interface.name for interface in manifest.provides_interfaces}) self.assertIn(CAPABILITY_POLL_PARTICIPATION_GATEWAY, manifest.capability_factories) - self.assertEqual(manifest.version, "0.1.18") + self.assertEqual(manifest.version, "0.1.19") self.assertIn("poll:response:write", {permission.scope for permission in manifest.permissions}) + for topic in manifest.documentation: + german = topic.translations.get("de", {}) + self.assertTrue( + all(german.get(field) for field in ("title", "summary", "body")), + topic.id, + ) + if __name__ == "__main__": unittest.main()