ferrero-opentext/Python-Version
DJP d4debbe3da Add complete deployment guide and database init.sql
Production-ready deployment package with database schema and server setup guide.

NEW FILES:
1. DEPLOYMENT_GUIDE.md - Complete server deployment instructions
2. database/init.sql - PostgreSQL database initialization script

DEPLOYMENT_GUIDE.md includes:
✓ Server deployment steps (rsync/scp)
✓ PostgreSQL setup (Docker or native)
✓ Python environment setup
✓ Configuration guide
✓ Cron job examples
✓ OAuth2 vs mTLS setup instructions
✓ Testing checklist
✓ Troubleshooting guide
✓ Production checklist
✓ Security hardening steps

database/init.sql includes:
✓ Complete schema with all 35 columns in master_assets
✓ All 4 tables (master_assets, derivative_assets, asset_events, workflow_state)
✓ Campaign relationship fields (global_master_campaign_id, global_master_folder_id, local_campaign_id)
✓ JSONB full_metadata column
✓ 12 indexes for performance
✓ 4 triggers (auto-update timestamps, event logging)
✓ 2 helper functions
✓ Proper permissions for ferrero_user

KEY FEATURES:
- Self-contained deployment
- Works with Docker or native PostgreSQL
- Includes all schema additions from this session
- OAuth2 and mTLS configuration documented
- Cron job templates provided
- Security checklist included

DEPLOYMENT:
1. Copy Python-Version/ folder to server
2. Run database init.sql
3. Install Python dependencies
4. Update .env for server
5. Test connections
6. Set up cron jobs

Everything needed for production deployment is included.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-05 09:27:25 -05:00
..
config Add separate mTLS base URL configuration for certificate authentication 2025-11-05 08:25:31 -05:00
database Add complete deployment guide and database init.sql 2025-11-05 09:27:25 -05:00
scripts Add separate mTLS base URL configuration for certificate authentication 2025-11-05 08:25:31 -05:00
.env Add separate mTLS base URL configuration for certificate authentication 2025-11-05 08:25:31 -05:00
DATABASE_SCHEMA.md Add comprehensive database schema documentation - DATABASE_SCHEMA.md 2025-11-04 10:24:44 -05:00
DEPLOYMENT.md Make email notifications verbose with detailed asset lists 2025-10-31 08:27:05 -04:00
DEPLOYMENT_GUIDE.md Add complete deployment guide and database init.sql 2025-11-05 09:27:25 -05:00
README.md Add comprehensive DEPLOYMENT.md and update README for production server 2025-10-30 18:59:12 -04:00
requirements.txt Fix boxsdk version and add .env file 2025-10-30 17:09:49 -04:00
setup.sh Start Python automation - Foundation components 2025-10-30 16:38:26 -04:00
WORKFLOW_DIAGRAMS.md Add comprehensive Mermaid workflow diagrams for all Python scripts 2025-11-03 16:26:45 -05:00

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:

  1. Upload files to server
  2. Run ./setup.sh
  3. Edit .env with production credentials
  4. Test: python scripts/test_connection.py
  5. 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:

  1. Check logs in logs/ directory
  2. Run python scripts/test_connection.py
  3. Review configuration in config/config.yaml
  4. Check .env has all required variables

Version: 1.0.0 Compatible: Python 3.6+ (server) and Python 3.10+ (local) Status: Ready for testing