Implements new workflow to extract CreativeX quality scores from PDFs
using LlamaExtract AI and store results in PostgreSQL database.
Components added:
- creativex_scoring_storing.py: Main script to process PDFs from Box
- creativex_scores table: Database table with JSONB for full JSON storage
- Database methods: store_creativex_score() and get_creativex_score_by_filename()
- Email templates: creativex_complete, creativex_partial, creativex_no_files
- Configuration: creativex section in config.yaml
- CREATIVEX_DEPLOYMENT.md: Complete deployment and usage guide
Features:
- Monitors Box folder 350605024645 for PDFs
- Extracts scores using LlamaExtract agent "Creativex-Extract"
- Stores 4 key fields (filename, ID, URL, score) + full JSON
- Deletes processed PDFs from Box after successful extraction
- Sends email notifications for success/partial/no-files scenarios
- Manual execution (python scripts/creativex_scoring_storing.py)
Database schema:
- Table: creativex_scores with 10 columns
- Indexes on filename, box_file_id, status for fast lookups
- JSONB column stores complete extraction for future flexibility
Future integration ready:
db.get_creativex_score_by_filename() available for DAM upload workflows
to attach CreativeX metadata during asset processing.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Changes:
- Downgraded boxsdk to 3.x (compatible API)
- Created .env file with all credentials
- Fixed requirements.txt versions
Python automation now ready for testing:
✅ Virtual environment created
✅ All dependencies installed
✅ Box connection working
✅ Database connection working
⚠️ DAM OAuth (same creds as PHP, might be temp server issue)
Next steps:
1. Test DAM connection (may need to retry)
2. Run A1→A2 script
3. Monitor logs
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Changed from continuous loop to single-run mode:
- Processes ONLY the first A1 campaign found
- Exits after processing (success=0, failure=1)
- Cron will run every 5 minutes, naturally processing one at a time
Benefits:
✅ Controlled processing (one campaign at a time)
✅ Easy to test manually
✅ Predictable resource usage
✅ Failed campaigns retry on next run
✅ Can stop/start easily
How it works:
1. Cron triggers script every 5 minutes
2. Script finds A1 campaigns
3. Processes first one only
4. If success → Updates to A2, exits
5. If failure → Stays A1, exits
6. Next run processes next A1 (or retries failed)
Also fixed requirements.txt to use >= versions for Python 3.10+ compatibility
🤖 Generated with Claude Code