"""DDEX Product extended metadata generation.""" from datetime import datetime from typing import Dict, List, Optional import jmespath from .e import E from .tracks import generate_tracks def generate_product( source_data: Dict, marketing_blurbs: Dict, sony_metadata: Optional[Dict] = None ): """Generate a Product extended metadata node.""" stores = [] for store in jmespath.search('deliveryLinks', source_data): stores.append(generate_store_element(source_data, store)) blurbs = marketing_blurbs.get('marketingProgramInfos', []) first_blurb = None if blurbs: first_blurb = blurbs[0].get('description') return E( 'Product', generate_product_id(source_data), E('Stores', *stores), E('MarketingBlurb', first_blurb), *generate_sony_metadata_elements(sony_metadata), generate_tracks(source_data), ) def generate_sony_metadata_elements(sony_metadata: Optional[Dict]) -> List: """Generate Sony financial metadata XML elements. Args: sony_metadata: Dict containing Sony financial metadata fields. Returns: List of XML elements for Sony metadata, empty if no data. """ if not sony_metadata: return [] elements = [] if sony_metadata.get('repertoireOwnerCode') or sony_metadata.get( 'repertoireOwnerName' ): elements.append( E( 'RepertoireOwner', E('Code', sony_metadata.get('repertoireOwnerCode')), E('Name', sony_metadata.get('repertoireOwnerName')), ) ) if sony_metadata.get('financialLabelCode') or sony_metadata.get( 'financialLabelName' ): elements.append( E( 'FinancialLabelOfRecord', E('Code', sony_metadata.get('financialLabelCode')), E('Name', sony_metadata.get('financialLabelName')), ) ) if sony_metadata.get('grasImprintCode') or sony_metadata.get('grasImprintName'): elements.append( E( 'ImprintLabel', E('Code', sony_metadata.get('grasImprintCode')), E('Name', sony_metadata.get('grasImprintName')), ) ) if sony_metadata.get('sapProfitCenterCode') or sony_metadata.get( 'sapProfitCenterName' ): elements.append( E( 'SAPProfitCenter', E('Code', sony_metadata.get('sapProfitCenterCode')), E('Name', sony_metadata.get('sapProfitCenterName')), ) ) return elements def generate_product_id(source_data: Dict): """Generate ProductId node.""" return E( 'ProductId', E( 'CatalogNumber', {'Namespace': 'DPID:PADPIDA2007040502I'}, jmespath.search('project.projectCode', source_data), ), E('ICPN', source_data['upc']), ) def generate_store_element(source_data: Dict, store: Dict): """Generate Store node.""" store_name = jmespath.search('store_name', store) deliveries = source_data.get('deliveryHistory', []) store_id = jmespath.search('store_id', store) return E( 'Store', E('Id', store_name), E('Link', jmespath.search('link', store)), E('DeliveryDate', retrieve_delivery_history(deliveries, store_id)), ) def retrieve_delivery_history(deliveries: List[Dict], store_id: int): """Generate Delivery nodes for DeliveryHistory.""" latest_date = None for delivery in deliveries: new_date = delivery['dateDelivered'] if str(delivery['store']['storeId']) == store_id and new_date: delivery_date = datetime.strptime(new_date, '%Y-%m-%d') if delivery_date: latest_date = ( delivery_date if not latest_date or delivery_date > latest_date else latest_date ) return latest_date