Add local_campaign_id extraction and storage for complete campaign tracking

Database Schema:
 Added local_campaign_id VARCHAR(50) column
 Stores the immediate campaign the asset belongs to (C000000551)

Enhanced Extraction:
 extract_global_campaign_reference() now returns 3 values:
   - global_master_campaign_id (C000000068)
   - global_master_folder_id (676f2bcde4c7...)
   - local_campaign_id (C000000551)

 Extracts FERRERO.FIELD.CAMPAIGN ID from same collection
 Only sets local_campaign_id if that collection has global reference
 Logs all three IDs when found

A1→A2 Script:
 Passes local_campaign_id to store_master_asset()
 Stores complete campaign relationship

Database Now Stores:
- tracking_id: ABC123 (unique 6-char)
- opentext_id: 0008a50... (DAM asset ID)
- local_campaign_id: C000000551 (immediate campaign)
- global_master_campaign_id: C000000068 (global master)
- global_master_folder_id: 676f2bcde4c7... (global folder)

Example Relationship:
- Asset downloaded from Local Campaign C000000551
- That campaign references Global Master C000000068
- All three IDs stored for complete traceability

Database schema now complete with full campaign relationship tracking!

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
DJP 2025-11-04 10:31:19 -05:00
parent 92ad76faae
commit eebfc8f189
2 changed files with 32 additions and 14 deletions

View file

@ -111,10 +111,10 @@ def process_campaign(campaign, dam, box, db, notifier, config):
tracking_id=tracking_id
)
# 4. Extract Global Campaign Reference from asset metadata
# 4. Extract Global Campaign Reference and Local Campaign ID from asset metadata
global_ref = db.extract_global_campaign_reference(asset)
# 5. Store in database with FULL metadata and global campaign reference
# 5. Store in database with FULL metadata and campaign references
db_result = db.store_master_asset(
tracking_id=tracking_id,
opentext_id=asset_id,
@ -123,7 +123,8 @@ def process_campaign(campaign, dam, box, db, notifier, config):
box_url=box_result['url'],
upload_folder_id=final_folder_id,
global_master_campaign_id=global_ref['global_master_campaign_id'],
global_master_folder_id=global_ref['global_master_folder_id']
global_master_folder_id=global_ref['global_master_folder_id'],
local_campaign_id=global_ref['local_campaign_id']
)
if db_result['success']:

View file

@ -76,7 +76,7 @@ class Database:
cursor.close()
self.put_connection(conn)
def store_master_asset(self, tracking_id, opentext_id, asset_data, box_file_id, box_url, upload_folder_id, global_master_campaign_id=None, global_master_folder_id=None):
def store_master_asset(self, tracking_id, opentext_id, asset_data, box_file_id, box_url, upload_folder_id, global_master_campaign_id=None, global_master_folder_id=None, local_campaign_id=None):
"""
Store master asset with FULL metadata in JSONB column
@ -89,6 +89,7 @@ class Database:
upload_folder_id: Final Assets folder ID for upload
global_master_campaign_id: Global master campaign ID (from GLOBAL CAMPAIGN REFERENCE)
global_master_folder_id: Global master folder ID
local_campaign_id: Local campaign ID (immediate campaign this asset belongs to)
Returns:
dict with success boolean
@ -117,9 +118,9 @@ class Database:
tracking_id, opentext_id, original_filename, file_extension,
file_size_bytes, mime_type, upload_directory,
description, full_metadata, status,
global_master_campaign_id, global_master_folder_id
global_master_campaign_id, global_master_folder_id, local_campaign_id
) VALUES (
%s, %s, %s, %s, %s, %s, %s, %s, %s, 'active', %s, %s
%s, %s, %s, %s, %s, %s, %s, %s, %s, 'active', %s, %s, %s
)
ON CONFLICT (tracking_id) DO UPDATE SET
upload_directory = EXCLUDED.upload_directory,
@ -127,6 +128,7 @@ class Database:
full_metadata = EXCLUDED.full_metadata,
global_master_campaign_id = EXCLUDED.global_master_campaign_id,
global_master_folder_id = EXCLUDED.global_master_folder_id,
local_campaign_id = EXCLUDED.local_campaign_id,
updated_at = CURRENT_TIMESTAMP
""", (
tracking_id,
@ -139,7 +141,8 @@ class Database:
description,
full_metadata_json,
global_master_campaign_id,
global_master_folder_id
global_master_folder_id,
local_campaign_id
))
conn.commit()
@ -319,16 +322,17 @@ class Database:
def extract_global_campaign_reference(self, asset_data):
"""
Extract Global Campaign Reference from asset metadata
Extract Global Campaign Reference and Local Campaign ID from asset metadata
Args:
asset_data: Complete DAM asset JSON
Returns:
dict with global_master_campaign_id and global_master_folder_id
dict with global_master_campaign_id, global_master_folder_id, local_campaign_id
"""
global_master_campaign_id = None
global_master_folder_id = None
local_campaign_id = None
# Look in inherited_metadata_collections
collections = asset_data.get('inherited_metadata_collections', [])
@ -338,20 +342,32 @@ class Database:
if collection.get('container_type_name') == 'L7+ - CAMPAIGN':
inherited_metadata = collection.get('inherited_metadata_values', [])
campaign_id_in_collection = None
has_global_reference = False
for inherited in inherited_metadata:
metadata_element = inherited.get('metadata_element', {})
# Extract Campaign ID
if metadata_element.get('id') == 'FERRERO.FIELD.CAMPAIGN ID':
campaign_id_value = metadata_element.get('value', {}).get('value', {}).get('value')
if campaign_id_value:
campaign_id_in_collection = campaign_id_value
# Look for GLOBAL CAMPAIGN REFERENCE field
if metadata_element.get('id') == 'FERRERO.FIELD.GLOBAL CAMPAIGN REFERENCE':
value = metadata_element.get('value', {}).get('value', {}).get('value')
if value:
global_master_campaign_id = value
has_global_reference = True
logger.info("Found Global Campaign Reference: {}".format(value))
# If this collection has a global reference, it might also have the folder ID
# The container itself might be the global master folder
if global_master_campaign_id:
# Get the container ID if available
# If this campaign has a global reference, it's the local campaign
if has_global_reference and campaign_id_in_collection:
local_campaign_id = campaign_id_in_collection
logger.info("Local Campaign ID: {}".format(local_campaign_id))
# Get the container ID (global master folder)
container_id = collection.get('container_id')
if container_id:
global_master_folder_id = container_id
@ -359,7 +375,8 @@ class Database:
return {
'global_master_campaign_id': global_master_campaign_id,
'global_master_folder_id': global_master_folder_id
'global_master_folder_id': global_master_folder_id,
'local_campaign_id': local_campaign_id
}
def close(self):