from __future__ import annotations import argparse import json from app.db.bootstrap import create_all_tables from app.db.models import Campaign from app.db.session import SessionLocal from app.mailer.sending.jobs import queue_campaign_jobs from app.security.api_keys import authenticate_api_key from app.settings import settings def main() -> None: parser = argparse.ArgumentParser(description="Queue built campaign jobs for sending.") parser.add_argument("--campaign-id", required=True, help="Database campaign UUID, not external campaign id") parser.add_argument("--version-id", default=None, help="Optional campaign version UUID; defaults to current version") parser.add_argument("--api-key", default=settings.dev_bootstrap_api_key) parser.add_argument("--no-celery", action="store_true", help="Only mark jobs as queued; do not enqueue Celery tasks") parser.add_argument("--exclude-warnings", action="store_true", help="Queue only validation_status=ready, not warnings") parser.add_argument("--dry-run", action="store_true") parser.add_argument("--json", action="store_true") args = parser.parse_args() create_all_tables() with SessionLocal() as session: api_key = authenticate_api_key(session, args.api_key) if not api_key: raise SystemExit("Invalid API key") result = queue_campaign_jobs( session, tenant_id=api_key.tenant_id, campaign_id=args.campaign_id, version_id=args.version_id, enqueue_celery=not args.no_celery, include_warnings=not args.exclude_warnings, dry_run=args.dry_run, ) if args.json: print(json.dumps(result.as_dict(), indent=2)) return campaign = session.get(Campaign, args.campaign_id) print(f"Campaign: {campaign.name if campaign else args.campaign_id}") print(f"Version: {result.version_id}") print(f"Queued: {result.queued_count}") print(f"Skipped: {result.skipped_count}") print(f"Blocked: {result.blocked_count}") print(f"Enqueued Celery tasks: {result.enqueued_count}") if result.dry_run: print("Dry run: no database changes were committed") if __name__ == "__main__": main()