"""Logic for Marketing Program Info.""" from sales_goals.constants.models import MARKETING_PROGRAM_ENTITY_TYPES from sales_goals.models import marketing_drivers def create_marketing_program_info(data): """Create marketing program info.""" result = [] for row in data: result.append(marketing_drivers.create_marketing_program_info(row)) return result def get_marketing_program_info(entity_type, entity_id, program_id=None): """Get marketing program info for given entity type and id. If program_id is not set it will return results for every program type. Args: entity_type (str): Type of the entity, for example "product" entity_id (int): ID of the entity program_id (int): Marketing program ID Returns: list: List of marketing program info data """ return marketing_drivers.get_marketing_program_info( info_for_id=entity_id, info_for=MARKETING_PROGRAM_ENTITY_TYPES[entity_type], mkt_program_id=program_id, ) def update_marketing_program_info(marketing_program_info_id, data): """Update marketing program info. Args: marketing_program_info_id (int): Marketing program Info ID data (dict): Marketing program info data Returns: bool """ return marketing_drivers.update_marketing_program_info( marketing_program_info_id, data) def upsert_marketing_program_info(entity_type, entity_id, input): """Upsert marketing program info for the given entity. Args: entity_type (str): Type of the entity, for example "product" entity_id (int): ID of the entity data (dict): Marketing program info data Returns: list of dicts """ id_column = 'mkt_program_info_id' result = [] data = [] for item in input: data.append({ **item, 'info_for': MARKETING_PROGRAM_ENTITY_TYPES[entity_type], 'info_for_id': entity_id, }) existing_program_infos = get_marketing_program_info(entity_type, entity_id) existing_ids = {item[id_column] for item in existing_program_infos} upsert_ids = {item[id_column] for item in data if item.get(id_column)} for id in upsert_ids: if id not in existing_ids: raise ValueError('Id does not exist') ids_to_delete = {id for id in existing_ids if id not in upsert_ids} marketing_drivers.delete_marketing_program_infos(ids_to_delete) rows_to_create = [row for row in data if not row.get(id_column)] result.extend(create_marketing_program_info(rows_to_create)) rows_to_update = [item for item in data if item.get(id_column)] for row in rows_to_update: result.append(marketing_drivers.update_marketing_program_info( row[id_column], row)) return result