#!/usr/bin/env python3 """ Interactive Campaign Status Advance A1→A3 (PPR Only) Allows user to advance A1 campaigns directly to A3 (skip A2) Shows campaign details and asks for confirmation for each one Updates campaign status and triggers folder scaling status update API Useful for testing workflow progression Compatible with Python 3.6+ """ import sys import os import logging import argparse # Add shared library to path sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) from shared.config_loader import load_config from shared.dam_client import DAMClient # Setup simple console logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger('AdvanceA1toA3') def get_user_confirmation(campaign_name, campaign_number): """ Ask user if they want to advance this campaign to A3 Args: campaign_name: Campaign name campaign_number: Campaign number (e.g., C000000078) Returns: bool: True if user says yes, False if no """ print("") print("=" * 70) print("Campaign: {}".format(campaign_name)) print("Number: {}".format(campaign_number if campaign_number else 'N/A')) print("Current: A1") print("Target: A3") print("=" * 70) while True: response = input("Advance this campaign A1 → A3? (yes/no): ").strip().lower() if response in ['yes', 'y']: return True elif response in ['no', 'n']: return False else: print("Please enter 'yes' or 'no'") def main(): """Main interactive loop""" # Parse command-line arguments parser = argparse.ArgumentParser(description='Interactive Campaign Advance A1→A3') parser.add_argument('--auth-pfx', action='store_true', help='Use mTLS certificate authentication instead of OAuth2') args = parser.parse_args() print("") print("=" * 70) print("Ferrero Campaign Status Advance: A1 → A3") if args.auth_pfx: print("Authentication: mTLS Certificate (--auth-pfx)") else: print("Authentication: OAuth2 (default)") print("") print("Note: This skips A2 status and goes directly to A3") print(" Useful for testing A2→A3 upload workflow") print("=" * 70) print("") # Load configuration config = load_config('config/config.yaml') # Initialize DAM client dam = DAMClient(config, use_mtls=args.auth_pfx) # Test connection logger.info("Testing DAM connection...") if not dam.test_connection(): logger.error("DAM connection failed - exiting") sys.exit(1) logger.info("DAM connection OK") print("") # Get all A1 campaigns logger.info("Searching for A1 campaigns...") campaigns = dam.search_campaigns(status='A1') if not campaigns: print("") print("No A1 campaigns found") print("Exiting...") sys.exit(0) print("") print("=" * 70) print("Found {} A1 campaign(s) to review".format(len(campaigns))) print("=" * 70) print("") # Process each campaign advanced_count = 0 skipped_count = 0 for i, campaign in enumerate(campaigns, 1): campaign_id = campaign['asset_id'] campaign_name = campaign['campaign_name'] campaign_number = campaign.get('campaign_id', 'N/A') print("") print("Campaign {}/{}".format(i, len(campaigns))) # Ask user for confirmation if get_user_confirmation(campaign_name, campaign_number): # User said yes - advance to A3 print("") print("Advancing campaign A1 → A3...") result = dam.update_campaign_status(campaign_id, 'A3') if result['success']: print("✓ SUCCESS: Campaign status updated to A3") # Call folders_scaling_update API (PPR only) print("Updating folder scaling status...") scaling_result = dam.update_folder_scaling_status(campaign_id, 'A3') if scaling_result['success']: print("✓ SUCCESS: Folder scaling status updated (HTTP {})".format( scaling_result.get('status_code', 'Unknown') )) advanced_count += 1 else: print("✗ WARNING: Folder scaling update failed - {}".format( scaling_result.get('error', 'Unknown error') )) print("Campaign status was updated but folder scaling failed") # Still count as advanced since main status update succeeded advanced_count += 1 else: print("✗ FAILED: {}".format(result.get('error', 'Unknown error'))) print("Continuing to next campaign...") else: # User said no - skip print("Skipped (no change)") skipped_count += 1 # Final summary print("") print("=" * 70) print("Summary") print("=" * 70) print("Total campaigns reviewed: {}".format(len(campaigns))) print("Advanced to A3: {}".format(advanced_count)) print("Skipped: {}".format(skipped_count)) print("=" * 70) print("") print("Done!") if __name__ == '__main__': main()