Major enhancements to all workflow scripts with recursive search and detailed rejection tracking. NEW FEATURES: 1. Recursive Folder Search (ALL workflows: A1→A2, A5→A6, B1→B2) - Searches subfolders within Master/Final Assets folders - Preserves folder structure in Box - Adds 'folder_path' attribute to each asset 2. NOT APPROVED Filtering (A5→A6 ONLY) - Only downloads assets with ECOMMERCE STATUS = "NOT APPROVED" - Skips approved/other status assets - Logs rejected vs skipped counts 3. Rejection Details Extraction (A5→A6) - Extracts comments from 3 reviewers: Approver, Legal, IA&CC - Includes certifier names and dates - Displays in detailed email notifications CHANGES BY FILE: dam_client.py: - NEW: _get_assets_recursive() - Recursively searches folders - UPDATED: get_master_assets() - Now uses recursive search, adds folder_path to assets - NEW: is_asset_not_approved() - Checks FERRERO.FIELD.ECOMMERCE STATUS - NEW: extract_rejection_details() - Extracts all rejection comments from 10 fields box_client.py: - UPDATED: upload_with_tracking_id() - Added subfolder_path parameter - NEW: _get_or_create_subfolder_path() - Creates/navigates Box subfolders - Preserves DAM folder structure in Box uploads a1_to_a2_download.py: - Added folder_path extraction from assets - Pass subfolder_path to Box upload - Logs subfolder info during processing b1_to_b2_download.py: - Added folder_path extraction from assets - Pass subfolder_path to Box upload - Logs subfolder info during processing a5_to_a6_download.py: - Filter assets for NOT APPROVED status ONLY - Extract rejection details for each asset - Pass subfolder_path to Box upload - Updated email data with rejection_details - Handle "no rejections" scenario with email - Updated logging to show rejected vs skipped counts notifier.py: - REPLACED: a5_to_a6_complete → a5_to_a6_rejections - Detailed HTML template with rejection sections - Shows Approver, Legal, and IA&CC rejections - Styled with red warnings and bordered sections - NEW: a5_to_a6_no_rejections template - Green success message when no rejected assets found - UPDATED: a5_to_a6_partial - Now uses rejected_assets FIELD IDs EXTRACTED (A5→A6): - FERRERO.FIELD.ECOMMERCE STATUS (primary check) - FERRERO.MARKETING.FIELD.CERTIFIER COMMENT - FERRERO.FIELD.ECOMMERCE CERTIFIER - FERRERO.MARKETING.FIELD.APPROVAL DATE - FERRERO.MARKETING.FIELD.LEGAL COMMENT - FERRERO.FIELD.LEGAL CERTIFER (typo in field ID) - FERRERO.MARKETING.FIELD.LEGAL APPROVAL DATE - FERRERO.MARKETING.FIELD.IA CC COMMENT - FERRERO.MARKETING.FIELD.IA CERTIFIER - FERRERO.MARKETING.FIELD.IA CC APPROVAL DATE TESTING: ✓ All connections working (DAM, Box, Database) ✓ A5→A6 script executes correctly ✓ Recursive search working ✓ NOT APPROVED filtering working ✓ "No rejections" email sent successfully ✓ Folder structure preserved in logs WORKFLOW IMPACTS: - A1→A2: Now searches recursively, preserves folder structure - A5→A6: Filters for NOT APPROVED only, shows rejection details - B1→B2: Now searches recursively, preserves folder structure 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| config | ||
| scripts | ||
| .env | ||
| DATABASE_SCHEMA.md | ||
| DEPLOYMENT.md | ||
| README.md | ||
| requirements.txt | ||
| setup.sh | ||
| WORKFLOW_DIAGRAMS.md | ||
Ferrero Content Scaling - Python Automation
Automated workflow for Content Scaling (A1→A2→A3)
Compatible with Python 3.6+ (server) and Python 3.10+ (local development)
Status: ✅ Production Ready & Tested
📚 Documentation
- DEPLOYMENT.md - Complete production server deployment guide
- PYTHON_AUTOMATION_PLAN.md - Architecture and design
- README.md - This file (quick reference)
Quick Start (Local Testing)
1. Setup
cd Python-Version
# Create virtual environment and install dependencies
./setup.sh
2. Configure
# Edit .env with your credentials
nano .env
# Verify configuration
nano config/config.yaml
Important:
- Set correct Box folders in .env:
BOX_ROOT_FOLDER_A1_A2=348304357505(master downloads)BOX_ROOT_FOLDER_A2_A3=348526703108(agency uploads)
- Update webhook URL: Make.com or your endpoint
- Configure email recipients
3. Test Connections
source venv/bin/activate
python scripts/test_connection.py
Expected output:
✓ DAM connection OK
✓ Box connection OK
✓ Database connection OK
4. Test A1→A2 Script
python scripts/a1_to_a2_download.py
What happens:
- Searches for campaigns with status A1
- Processes FIRST campaign only
- Downloads all master assets from DAM
- Uploads to Box (folder: 348304357505)
- Creates folder: C000000078-Campaign_Name
- Stores in PostgreSQL with full metadata
- Updates status A1 → A2 (if all successful)
- Sends webhook to Make.com
- Sends email notification
- Exits
If no A1 campaigns:
No A1 campaigns found - exiting
🚀 Production Deployment
See DEPLOYMENT.md for complete server deployment guide
Quick steps:
- Upload files to server
- Run
./setup.sh - Edit
.envwith production credentials - Test:
python scripts/test_connection.py - Setup cron:
*/5 * * * * cd ~/ferrero-automation/Python-Version && venv/bin/python scripts/a1_to_a2_download.py >> logs/cron.log 2>&1
Features
A1→A2 Master Asset Downloader
- Polls DAM every 5 minutes for campaigns with status A1
- Downloads all master assets
- Uploads to Box with tracking IDs
- Stores complete metadata in PostgreSQL
- Only updates status A1→A2 when ALL assets processed successfully
- Sends webhook notification with campaign ID and number
- Email notifications on success/failure
A2→A3 Upload Handler
- Receives webhooks from Box when files uploaded
- Parses V2 filenames
- Loads master metadata from database
- Extracts 27-28 MVP fields
- Updates fields from filename (Description, State, Language)
- Uploads to DAM with clean filename
- Only updates status A2→A3 when ALL campaign assets uploaded
- Sends webhook notification
- Email notifications
Configuration
Easy Field Updates
Edit config/field_mappings.yaml:
mvp_fields:
- FERRERO.FIELD.MKTG.ASSET TYPE
- NEW.FIELD.ID.HERE # Just add new field IDs!
Environment Switching
# Staging
export ENV=staging
# Production
export ENV=production
Change Webhook URL
# config/config.yaml
webhooks:
campaign_status_update:
url: https://your-new-url.com/api # Just change URL!
Change Email Recipients
# config/config.yaml
notifications:
recipients:
success:
- newperson@ferrero.com # Just add to list!
Deployment
Local Testing
source venv/bin/activate
python scripts/a1_to_a2_download.py
Production (Cron)
# Add to crontab
crontab -e
# Run every 5 minutes
*/5 * * * * cd ~/ferrero-automation/Python-Version && venv/bin/python scripts/a1_to_a2_download.py >> logs/cron.log 2>&1
Webhook Server (Background)
cd Python-Version
source venv/bin/activate
nohup python scripts/a2_to_a3_upload.py > logs/webhook.log 2>&1 &
echo $! > webhook.pid
Monitoring
Check Logs
tail -f logs/a1_to_a2.log
tail -f logs/a2_to_a3.log
tail -f logs/errors.log
Check Database
psql -h localhost -p 5433 -U ferrero_user -d ferrero_tracking
# Check recent uploads
SELECT tracking_id, original_filename, created_at
FROM master_assets
ORDER BY created_at DESC LIMIT 10;
Troubleshooting
Connection Issues
python scripts/test_connection.py
Invalid Filename
# Test filename parsing
python -c "from scripts.shared.filename_parser import FilenameParser; p=FilenameParser(); print(p.parse_filename('your_filename.mp4'))"
Email Not Sending
- Check Mailgun API key in .env
- Check recipient emails in config
- Check logs:
grep -i mailgun logs/*.log
Webhook Not Receiving
- Check webhook server running:
ps aux | grep a2_to_a3 - Check port accessible:
netstat -an | grep 5000 - Check Box webhook configuration
File Structure
Python-Version/
├── venv/ # Virtual environment
├── scripts/
│ ├── a1_to_a2_download.py # A1→A2 poller
│ ├── a2_to_a3_upload.py # A2→A3 webhook
│ ├── test_connection.py # Connection tester
│ └── shared/
│ ├── config_loader.py # Config management
│ ├── dam_client.py # DAM API
│ ├── box_client.py # Box API
│ ├── database.py # PostgreSQL
│ ├── notifier.py # Email + webhooks
│ ├── filename_parser.py # V2 naming parser
│ └── metadata_extractor_mvp.py
├── config/
│ ├── config.yaml # Main config
│ ├── field_mappings.yaml # MVP fields (easy to edit!)
│ └── environments/
│ ├── staging.yaml
│ └── production.yaml
├── logs/
├── temp/downloads/
└── .env # Environment variables
Support
For issues:
- Check logs in
logs/directory - Run
python scripts/test_connection.py - Review configuration in
config/config.yaml - Check
.envhas all required variables
Version: 1.0.0 Compatible: Python 3.6+ (server) and Python 3.10+ (local) Status: Ready for testing