feat: integrate operator queue into Campaign
This commit is contained in:
@@ -292,7 +292,7 @@ CAMPAIGN_USER_DOCUMENTATION = (
|
||||
related_topic_ids=("campaigns.workflow.complete-review", "campaigns.workflow.retry-and-reconcile"),
|
||||
links=(
|
||||
DocumentationLink(label="Campaigns", href="/campaigns", kind="runtime"),
|
||||
DocumentationLink(label="Campaign operator queue", href="/operator", kind="runtime"),
|
||||
DocumentationLink(label="Campaign operator queue", href="/campaigns/queue", kind="runtime"),
|
||||
),
|
||||
related_modules=("mail", "notifications"),
|
||||
),
|
||||
|
||||
@@ -80,6 +80,15 @@ PERMISSIONS = (
|
||||
_permission("campaigns:report:send", "Send reports", "Email campaign reports to configured recipients.", "Reports"),
|
||||
)
|
||||
|
||||
OPERATOR_QUEUE_REQUIRED_ANY = (
|
||||
"campaigns:campaign:queue",
|
||||
"campaigns:campaign:retry",
|
||||
"campaigns:campaign:reconcile",
|
||||
"campaigns:campaign:control",
|
||||
)
|
||||
# Preserve the former /operator route identity for saved View projections.
|
||||
OPERATOR_QUEUE_SURFACE_ID = "campaigns.route.operator"
|
||||
|
||||
ROLE_TEMPLATES = (
|
||||
RoleTemplate(
|
||||
slug="campaign_aggregate_reader",
|
||||
@@ -222,19 +231,6 @@ manifest = ModuleManifest(
|
||||
tenant_summary_providers=(_tenant_summary,),
|
||||
nav_items=(
|
||||
NavItem(path="/campaigns", label="Campaigns", icon="campaign", required_any=("campaigns:campaign:read",), order=20),
|
||||
NavItem(
|
||||
path="/operator",
|
||||
label="Operator Queue",
|
||||
icon="radio-tower",
|
||||
required_all=("campaigns:campaign:read",),
|
||||
required_any=(
|
||||
"campaigns:campaign:queue",
|
||||
"campaigns:campaign:retry",
|
||||
"campaigns:campaign:reconcile",
|
||||
"campaigns:campaign:control",
|
||||
),
|
||||
order=30,
|
||||
),
|
||||
NavItem(path="/reports", label="Reports", icon="clipboard-pen-line", required_any=("campaigns:report:read",), order=70),
|
||||
),
|
||||
frontend=FrontendModule(
|
||||
@@ -247,23 +243,19 @@ manifest = ModuleManifest(
|
||||
required_any=("campaigns:campaign:read",),
|
||||
order=20,
|
||||
),
|
||||
FrontendRoute(
|
||||
path="/campaigns/queue",
|
||||
component="OperatorQueuePage",
|
||||
required_all=("campaigns:campaign:read",),
|
||||
required_any=OPERATOR_QUEUE_REQUIRED_ANY,
|
||||
order=21,
|
||||
surface_id=OPERATOR_QUEUE_SURFACE_ID,
|
||||
),
|
||||
FrontendRoute(
|
||||
path="/campaigns/:campaignId/*",
|
||||
component="CampaignWorkspace",
|
||||
required_any=("campaigns:campaign:read",),
|
||||
order=21,
|
||||
),
|
||||
FrontendRoute(
|
||||
path="/operator",
|
||||
component="OperatorQueuePage",
|
||||
required_all=("campaigns:campaign:read",),
|
||||
required_any=(
|
||||
"campaigns:campaign:queue",
|
||||
"campaigns:campaign:retry",
|
||||
"campaigns:campaign:reconcile",
|
||||
"campaigns:campaign:control",
|
||||
),
|
||||
order=30,
|
||||
order=22,
|
||||
),
|
||||
FrontendRoute(
|
||||
path="/reports",
|
||||
@@ -275,19 +267,6 @@ manifest = ModuleManifest(
|
||||
),
|
||||
nav_items=(
|
||||
NavItem(path="/campaigns", label="Campaigns", icon="campaign", required_any=("campaigns:campaign:read",), order=20),
|
||||
NavItem(
|
||||
path="/operator",
|
||||
label="Operator Queue",
|
||||
icon="radio-tower",
|
||||
required_all=("campaigns:campaign:read",),
|
||||
required_any=(
|
||||
"campaigns:campaign:queue",
|
||||
"campaigns:campaign:retry",
|
||||
"campaigns:campaign:reconcile",
|
||||
"campaigns:campaign:control",
|
||||
),
|
||||
order=30,
|
||||
),
|
||||
NavItem(path="/reports", label="Reports", icon="clipboard-pen-line", required_any=("campaigns:report:read",), order=70),
|
||||
NavItem(path="/templates", label="Templates", icon="layout-template", order=90),
|
||||
),
|
||||
@@ -481,7 +460,7 @@ manifest = ModuleManifest(
|
||||
),
|
||||
),
|
||||
links=(
|
||||
DocumentationLink(label="Campaign operator queue", href="/operator", kind="runtime"),
|
||||
DocumentationLink(label="Campaign operator queue", href="/campaigns/queue", kind="runtime"),
|
||||
DocumentationLink(label="Campaign reports", href="/reports", kind="runtime"),
|
||||
DocumentationLink(label="Campaign delivery runbook", href="govoplan-campaign/docs/CAMPAIGN_DELIVERY_RUNBOOK.md", kind="repository"),
|
||||
),
|
||||
@@ -489,7 +468,7 @@ manifest = ModuleManifest(
|
||||
unlocks=("Fail-closed recovery without exposing Mail credentials.",),
|
||||
metadata={
|
||||
"kind": "reference",
|
||||
"route": "/operator",
|
||||
"route": "/campaigns/queue",
|
||||
"screen": "Campaign operator queue",
|
||||
"section": "Profile-backed delivery recovery",
|
||||
"related_topic_ids": [
|
||||
@@ -619,14 +598,14 @@ manifest = ModuleManifest(
|
||||
),
|
||||
),
|
||||
links=(
|
||||
DocumentationLink(label="Campaign operator queue", href="/operator", kind="runtime"),
|
||||
DocumentationLink(label="Campaign operator queue", href="/campaigns/queue", kind="runtime"),
|
||||
DocumentationLink(label="Campaign delivery runbook", href="govoplan-campaign/docs/CAMPAIGN_DELIVERY_RUNBOOK.md", kind="repository"),
|
||||
),
|
||||
related_modules=("mail", "audit"),
|
||||
unlocks=("Evidence-backed recovery without accidental duplicate external effects.",),
|
||||
metadata={
|
||||
"kind": "workflow",
|
||||
"route": "/operator",
|
||||
"route": "/campaigns/queue",
|
||||
"screen": "Campaign operator queue",
|
||||
"help_contexts": ["campaign.review-send", "campaign.report", "campaign.audit"],
|
||||
"prerequisites": [
|
||||
|
||||
Reference in New Issue
Block a user