refactor(campaign): restore route docstrings

This commit is contained in:
2026-07-22 09:08:12 +02:00
parent 79b576b4bc
commit 0b4017c240

View File

@@ -1631,14 +1631,14 @@ def fork_version_for_edit(
session: Session = Depends(get_session), session: Session = Depends(get_session),
principal: ApiPrincipal = Depends(require_scope("campaigns:campaign:copy")), principal: ApiPrincipal = Depends(require_scope("campaigns:campaign:copy")),
): ):
_get_campaign_for_principal(session, campaign_id, principal, write=True)
_require_permission(principal, "campaigns:recipient:read")
"""Create the campaign's next and only editable working version. """Create the campaign's next and only editable working version.
A new working copy may be created only after the current version is A new working copy may be created only after the current version is
permanently user-locked or delivery-final. Validation and temporary user permanently user-locked or delivery-final. Validation and temporary user
locks must be removed in place instead of creating parallel drafts. locks must be removed in place instead of creating parallel drafts.
""" """
_get_campaign_for_principal(session, campaign_id, principal, write=True)
_require_permission(principal, "campaigns:recipient:read")
payload = payload or CampaignVersionUpdateRequest() payload = payload or CampaignVersionUpdateRequest()
source_version = _get_version_for_tenant(session, version_id, principal.tenant_id) source_version = _get_version_for_tenant(session, version_id, principal.tenant_id)
@@ -1713,12 +1713,12 @@ def unlock_version_validation(
session: Session = Depends(get_session), session: Session = Depends(get_session),
principal: ApiPrincipal = Depends(require_scope("campaigns:campaign:update")), principal: ApiPrincipal = Depends(require_scope("campaigns:campaign:update")),
): ):
_get_campaign_for_principal(session, campaign_id, principal, write=True)
"""Unlock a successfully validated version before delivery starts. """Unlock a successfully validated version before delivery starts.
Unlocking invalidates validation/build state and removes generated jobs for Unlocking invalidates validation/build state and removes generated jobs for
that version. Sent/final versions cannot be unlocked and must be copied. that version. Sent/final versions cannot be unlocked and must be copied.
""" """
_get_campaign_for_principal(session, campaign_id, principal, write=True)
return _campaign_version_detail_response( return _campaign_version_detail_response(
session, session,
@@ -3019,10 +3019,10 @@ def campaign_summary(
session: Session = Depends(get_session), session: Session = Depends(get_session),
principal: ApiPrincipal = Depends(require_scope("campaigns:campaign:read")), principal: ApiPrincipal = Depends(require_scope("campaigns:campaign:read")),
): ):
"""Return dashboard-friendly campaign status counters and summaries."""
_get_campaign_for_principal(session, campaign_id, principal) _get_campaign_for_principal(session, campaign_id, principal)
if include_jobs: if include_jobs:
_require_permission(principal, "campaigns:recipient:read") _require_permission(principal, "campaigns:recipient:read")
"""Return dashboard-friendly campaign status counters and summaries."""
try: try:
return generate_campaign_report( return generate_campaign_report(
@@ -3046,9 +3046,9 @@ def campaign_report(
session: Session = Depends(get_session), session: Session = Depends(get_session),
principal: ApiPrincipal = Depends(require_scope("campaigns:report:read")), principal: ApiPrincipal = Depends(require_scope("campaigns:report:read")),
): ):
"""Return the recipient-level JSON report for one campaign."""
_get_campaign_for_principal(session, campaign_id, principal) _get_campaign_for_principal(session, campaign_id, principal)
_require_permission(principal, "campaigns:recipient:read") _require_permission(principal, "campaigns:recipient:read")
"""Return the full JSON report for one campaign."""
try: try:
return generate_campaign_report( return generate_campaign_report(
@@ -3071,9 +3071,9 @@ def campaign_jobs_csv(
session: Session = Depends(get_session), session: Session = Depends(get_session),
principal: ApiPrincipal = Depends(require_scope("campaigns:report:export")), principal: ApiPrincipal = Depends(require_scope("campaigns:report:export")),
): ):
"""Export per-job campaign status as CSV."""
_get_campaign_for_principal(session, campaign_id, principal) _get_campaign_for_principal(session, campaign_id, principal)
_require_permission(principal, "campaigns:recipient:export") _require_permission(principal, "campaigns:recipient:export")
"""Export per-job campaign status as CSV."""
try: try:
csv_text = generate_jobs_csv( csv_text = generate_jobs_csv(
@@ -3101,6 +3101,7 @@ def email_campaign_report(
session: Session = Depends(get_session), session: Session = Depends(get_session),
principal: ApiPrincipal = Depends(require_scope("campaigns:report:send")), principal: ApiPrincipal = Depends(require_scope("campaigns:report:send")),
): ):
"""Generate a campaign report and send it to one or more email addresses."""
campaign = _get_campaign_for_principal(session, campaign_id, principal) campaign = _get_campaign_for_principal(session, campaign_id, principal)
_require_permission(principal, "campaigns:recipient:export") _require_permission(principal, "campaigns:recipient:export")
selected_version_id = payload.version_id or campaign.current_version_id selected_version_id = payload.version_id or campaign.current_version_id
@@ -3110,8 +3111,6 @@ def email_campaign_report(
principal, principal,
selected_version.raw_json if isinstance(selected_version.raw_json, dict) else {}, selected_version.raw_json if isinstance(selected_version.raw_json, dict) else {},
) )
"""Generate a campaign report and send it to one or more email addresses."""
try: try:
result = send_campaign_report_email( result = send_campaign_report_email(
session, session,
@@ -3498,14 +3497,14 @@ def mock_send_campaign(
session: Session = Depends(get_session), session: Session = Depends(get_session),
principal: ApiPrincipal = Depends(require_scope("campaigns:campaign:send_test")), principal: ApiPrincipal = Depends(require_scope("campaigns:campaign:send_test")),
): ):
_get_campaign_for_principal(session, campaign_id, principal, write=True)
_require_permission(principal, "campaigns:recipient:read")
"""Run a fully visible mock delivery flow without mutating campaign state. """Run a fully visible mock delivery flow without mutating campaign state.
The route validates and builds the selected version, then optionally records The route validates and builds the selected version, then optionally records
mock SMTP deliveries and mock IMAP appends. It never talks to the configured mock SMTP deliveries and mock IMAP appends. It never talks to the configured
real SMTP/IMAP servers and it does not mark the version sent/final. real SMTP/IMAP servers and it does not mark the version sent/final.
""" """
_get_campaign_for_principal(session, campaign_id, principal, write=True)
_require_permission(principal, "campaigns:recipient:read")
payload = payload or MockCampaignSendRequest() payload = payload or MockCampaignSendRequest()
_require_campaign_profile_use_if_needed(session, principal, campaign_id, payload.version_id) _require_campaign_profile_use_if_needed(session, principal, campaign_id, payload.version_id)
@@ -3550,9 +3549,9 @@ def send_campaign_now_endpoint(
session: Session = Depends(get_session), session: Session = Depends(get_session),
principal: ApiPrincipal = Depends(require_scope("campaigns:campaign:send")), principal: ApiPrincipal = Depends(require_scope("campaigns:campaign:send")),
): ):
"""Preflight and synchronously send a policy-bounded built execution."""
_get_campaign_for_principal(session, campaign_id, principal, write=True) _get_campaign_for_principal(session, campaign_id, principal, write=True)
_require_permission(principal, "campaigns:recipient:read") _require_permission(principal, "campaigns:recipient:read")
"""Preflight and synchronously send a policy-bounded built execution."""
payload = payload or SendCampaignNowRequest() payload = payload or SendCampaignNowRequest()
try: try: