Migrate Postbox interface patterns

This commit is contained in:
2026-08-03 12:26:20 +02:00
parent 8f8d259a76
commit a97eb3bcef
12 changed files with 1209 additions and 152 deletions
+97 -2
View File
@@ -17,6 +17,7 @@ from govoplan_core.core.module_guards import (
persistent_table_uninstall_guard,
)
from govoplan_core.core.modules import (
DocumentationLink,
DocumentationTopic,
FrontendModule,
FrontendRoute,
@@ -375,8 +376,8 @@ manifest = ModuleManifest(
"reassignment. Current access combines a generic Postbox "
"permission with effective IDM assignment context. Templates "
"can lazily materialize unit-specific addresses, while exact "
"postboxes cover exceptional responsibilities. The first "
"Plaintext Postboxes remain available without Encryption. A "
"postboxes cover exceptional responsibilities. Plaintext "
"Postboxes remain available without Encryption. A "
"server-envelope profile stores message bodies as ciphertext and "
"uses the optional Encryption capability for authorized reads. "
"External ciphertext profiles retain producer-managed references "
@@ -393,8 +394,102 @@ manifest = ModuleManifest(
"files",
"notifications",
),
links=(
DocumentationLink(
label="Postbox inbox",
href="/postbox",
kind="runtime",
),
DocumentationLink(
label="Postbox directory API",
href="/api/v1/postbox/directory",
kind="api",
),
),
metadata={
"kind": "guide",
"help_contexts": [
"postbox.inbox.directory",
"postbox.inbox.messages",
"postbox.widget.inbox",
"postbox.admin.templates",
"postbox.blocker.assignment",
"postbox.state.unavailable",
],
"privacy_notes": [
"Directory access is derived from current effective function assignments.",
"Unavailable message states reveal only retained audit metadata permitted to the current actor.",
"Subjects, participants, routing facts, and attachment references remain observable metadata.",
],
},
order=35,
),
DocumentationTopic(
id="postbox.reference.fields-and-consequences",
title="Postbox fields and consequences",
summary=(
"Reference for address, template, routing, message, grouping, "
"classification, retention, and lifecycle fields."
),
body=(
"A Postbox address is durable and bound to an organization function. "
"Template revisions are immutable after publication; retiring a template "
"does not remove materialized addresses. Archiving an address stops new "
"delivery while retaining messages and evidence. Unified inbox views are "
"personal projections only and never move or delete source messages. "
"Classification limits eligible delivery and hierarchy-copy targets. "
"Hierarchy copies are independent deliveries with their own evidence; "
"vacancy escalation is delayed and separately auditable. Message expiry "
"or withdrawal blocks future content access but cannot retract plaintext "
"already copied, exported, or printed."
),
layer="configured",
documentation_types=("admin", "user"),
audience=("administrator", "user", "campaign_manager"),
related_modules=(
"organizations",
"idm",
"policy",
"audit",
"encryption",
),
links=(
DocumentationLink(
label="Postbox administration",
href="/admin?section=postbox",
kind="runtime",
),
DocumentationLink(
label="Postbox concept",
href="docs/POSTBOX_CONCEPT.md",
kind="source",
),
),
metadata={
"kind": "reference",
"help_contexts": [
"postbox.field.address",
"postbox.field.function",
"postbox.field.scope",
"postbox.field.classification",
"postbox.field.retention",
"postbox.field.hierarchy-routing",
"postbox.field.recipients",
"postbox.action.archive",
"postbox.action.retire-template",
"postbox.action.delete-grouping",
],
"consequence_classes": {
"publish_template": "Freezes an immutable address and routing revision for future materialization.",
"retire_template": "Stops new revisions and materialization while retaining existing addresses.",
"archive_postbox": "Stops new delivery while retaining messages, receipts, and evidence.",
"delete_grouping": "Deletes only the personal projection; source Postboxes and messages remain unchanged.",
"route_copy": "Creates a separately retained delivery and evidence record at each bounded target.",
"withdraw_or_expire": "Blocks future content access while retaining permitted audit metadata.",
},
},
order=36,
),
),
architecture=declared_module_architecture(
layer="communication_participation",