Consume governed recipients and add operational checks

This commit is contained in:
2026-07-31 22:48:07 +02:00
parent fa4eb39e0b
commit 82ddc0c34c
15 changed files with 354 additions and 14 deletions
@@ -19,6 +19,7 @@ from govoplan_campaign.backend.schemas import (
CampaignRecipientAddressSourcesResponse,
CampaignRecipientAddressSourceSnapshotRequest,
CampaignRecipientAddressSourceSnapshotResponse,
CampaignRecipientSnapshotExcludedItem,
CampaignRecipientSnapshotItem,
RecipientImportMappingProfileListResponse,
RecipientImportMappingProfilePayload,
@@ -764,7 +765,11 @@ def snapshot_campaign_recipient_address_source(
)
try:
snapshot = getattr(capability, "snapshot")(
session, principal, source_id=payload.source_id
session,
principal,
source_id=payload.source_id,
purpose=payload.purpose,
requested_channels=("email",),
)
except ValueError as exc:
raise HTTPException(
@@ -775,6 +780,15 @@ def snapshot_campaign_recipient_address_source(
CampaignRecipientSnapshotItem.model_validate(_capability_payload(item))
for item in snapshot_payload.get("recipients", [])
]
excluded = [
CampaignRecipientSnapshotExcludedItem.model_validate(_capability_payload(item))
for item in snapshot_payload.get("excluded", [])
]
provenance = (
snapshot_payload.get("provenance")
if isinstance(snapshot_payload.get("provenance"), dict)
else {}
)
return CampaignRecipientAddressSourceSnapshotResponse(
source_id=str(snapshot_payload.get("source_id") or ""),
source_label=str(snapshot_payload.get("source_label") or ""),
@@ -782,9 +796,16 @@ def snapshot_campaign_recipient_address_source(
source_revision=str(snapshot_payload.get("source_revision") or ""),
generated_at=str(snapshot_payload.get("generated_at") or ""),
recipients=recipients,
provenance=snapshot_payload.get("provenance")
if isinstance(snapshot_payload.get("provenance"), dict)
else {},
excluded=excluded,
included_count=len(recipients),
excluded_count=len(excluded),
purpose=str(snapshot_payload.get("purpose") or payload.purpose),
provenance={
**provenance,
"campaign_id": campaign_id,
"purpose": payload.purpose,
"requested_channels": ["email"],
},
)