feat: govern attachment exceptions and ownership transfers

This commit is contained in:
2026-07-30 17:42:10 +02:00
parent cd223cbb95
commit 5f7503598c
28 changed files with 2229 additions and 180 deletions
+13
View File
@@ -11,6 +11,7 @@ from govoplan_core.core.campaigns import (
CAPABILITY_CAMPAIGNS_RETENTION,
)
from govoplan_core.core.module_guards import drop_table_retirement_provider, persistent_table_uninstall_guard
from govoplan_core.core.ownership import OwnershipProviderRegistration
from govoplan_core.core.modules import (
DocumentationCondition,
DocumentationLink,
@@ -63,6 +64,8 @@ PERMISSIONS = (
_permission("campaigns:campaign:archive", "Archive campaigns", "Archive campaigns without destroying audit evidence.", "Campaigns"),
_permission("campaigns:campaign:delete", "Delete campaigns", "Delete draft-only campaigns where retention policy allows it.", "Campaigns"),
_permission("campaigns:campaign:share", "Share campaigns", "Grant or revoke explicit campaign access.", "Campaigns"),
_permission("campaigns:ownership:accept_group", "Accept group campaign ownership", "Accept or decline campaign ownership on behalf of a group the actor belongs to.", "Campaign governance"),
_permission("campaigns:ownership:recover", "Recover campaign ownership", "Participate in delayed, quorum-backed administrative campaign ownership recovery.", "Campaign governance"),
_permission("campaigns:campaign:validate", "Validate campaigns", "Run technical validation and manage validation locks.", "Campaigns"),
_permission("campaigns:campaign:build", "Build campaigns", "Build exact messages and attachment evidence.", "Campaigns"),
_permission("campaigns:campaign:review", "Complete campaign review", "Record review completion and the exact built messages inspected.", "Campaigns"),
@@ -118,6 +121,7 @@ ROLE_TEMPLATES = (
"campaigns:campaign:copy",
"campaigns:campaign:validate",
"campaigns:campaign:build",
"campaigns:ownership:accept_group",
"campaigns:recipient:read",
"campaigns:recipient:write",
"campaigns:recipient:import",
@@ -715,6 +719,15 @@ manifest = ModuleManifest(
),
),
documentation_providers=(documentation_topics,),
ownership_providers=(
OwnershipProviderRegistration(
resource_type="campaign",
provider=__import__(
"govoplan_campaign.backend.capabilities",
fromlist=["CampaignOwnershipService"],
).CampaignOwnershipService(),
),
),
capability_factories={
CAPABILITY_CAMPAIGNS_ACCESS: lambda context: __import__(
"govoplan_campaign.backend.capabilities",