"""Store Pricing Tier Code logic.""" from oto import response from pricing.constants import error from pricing.models import store_pricing_tier_code from pricing.models import store_pricing_tier_code_territory def create(store_pricing_tier_id, data): """Create a store pricing tier code. Args: store_pricing_tier_id (int): the tier ID to attach to data (dict): the data from which to create the store pricing tier code. Returns: response.Response: containing the created store pricing tier code dict. """ territories = [] if 'territories' in data: territories = data['territories'] del data['territories'] try: if has_duplicate(store_pricing_tier_id, data, territories): return response.create_error_response( 400, error.ERROR_MESSAGE_DUPLICATE) except Exception: return response.create_error_response( 500, error.ERROR_MESSAGE_DB_ISSUE) create_result = store_pricing_tier_code.create( store_pricing_tier_id, data) if create_result.status != 200 or len(territories) == 0: return create_result store_pricing_tier_code_id = create_result.message[ 'store_pricing_tier_code_id'] territories_result = \ store_pricing_tier_code_territory.update_territories( store_pricing_tier_code_id, territories) if territories_result.status != 200: return territories_result create_result.message['territories'] = territories_result.message return create_result def update(store_pricing_tier_id, store_pricing_tier_code_id, data): """Update a store pricing tier code. Args: store_pricing_tier_id (int): the tier ID to attach to store_pricing_tier_code_id (int): the ID of the store pricing tier code. data (dict): the data from which to update the store pricing tier code. Returns: response.Response: containing the updated store pricing tier code dict. """ territories = [] if 'territories' in data: territories = data['territories'] del data['territories'] update_result = store_pricing_tier_code.update( store_pricing_tier_id, store_pricing_tier_code_id, data) if update_result.status != 200 or len(territories) == 0: return update_result territories_result = \ store_pricing_tier_code_territory.update_territories( store_pricing_tier_code_id, territories) if territories_result.status != 200: return territories_result update_result.message['territories'] = territories_result.message return update_result def has_duplicate(store_pricing_tier_id, data, territories): """Try to find an identical store pricing tier code in the DB. Args: store_pricing_tier_id (int): the ID of the store pricing tier data (dict): the data to use to find the duplicate. territories ([string]): the list of territory codes to use to find the duplicate. Returns: boolean: True if a duplicate was found, False if not. """ find_result = store_pricing_tier_code.find_duplicate( store_pricing_tier_id, data) if find_result.status != 200: raise Exception() if find_result.message['found'] is False: return False found = find_result.message['item'] find_territories_result = \ store_pricing_tier_code_territory.get_by_store_pricing_tier_code_id( found['store_pricing_tier_code_id']) if find_territories_result.status != 200: raise Exception() found_territories = find_territories_result.message['items'] found_territory_codes = [i['territory_code'] for i in found_territories] if set(found_territory_codes) == set(territories): return True else: return False def delete(store_pricing_tier_code_id): """Delete a store pricing tier code. Args: store_pricing_tier_code_id (int): the ID of the store pricing tier code Returns: response.Response containing the deleted store pricing tier code dict. """ response_from_delete_by_store_pricing_tier_code_id_territory = \ store_pricing_tier_code_territory.delete_by_store_pricing_tier_code_id( store_pricing_tier_code_id) if response_from_delete_by_store_pricing_tier_code_id_territory.status \ != 200: return response_from_delete_by_store_pricing_tier_code_id_territory response_store_pricing_tier_code = store_pricing_tier_code.delete( store_pricing_tier_code_id) return response_store_pricing_tier_code