"""Logic for vendor_dms_master_restriction.""" from typing import List, Type from owsresponse import response from abacus_legacy_sync import models from abacus_legacy_sync.models.ows import carveouts_python def _create_vendor_dms_master_restriction( distribution_type_id: int, store_ids: List[str], vendor_contract_id: int ) -> List[models.VendorDmsMasterRestriction]: """Create vendor_dms_master_restriction. Args: distribution_type_id (int): Id of distribution type store_ids (List[str]): List of customer_master_master_id's vendor_contract_id (int): Id of vendor_contract Returns: List of new vendor_dms_master_restriction records """ new_vendor_dms_master_restriction = list() for store_id in store_ids: vendor_dms_master_restriction = models.VendorDmsMasterRestriction.build( customer_master_master_id=store_id, distribution_type_id=distribution_type_id, vendor_contract_id=vendor_contract_id, ) new_vendor_dms_master_restriction.append(vendor_dms_master_restriction) models.VendorDmsMasterRestriction.commit_changes() return new_vendor_dms_master_restriction def create_vendor_dms_master_restriction(**params) -> Type[response.Response]: """Create vendor_dms_master_restriction. Args: params: POST request body - vendor_contract_id (int): Vendor active contract Id - distribution_type_id (int): Id of distribution type - store_ids (List[str]): List of customer_master_master_id's """ vendor_contract_id = params.get('vendor_contract_id') distribution_type_id = params.get('distribution_type_id') store_ids = params.get('store_ids') try: dms_restriction_data = [ {'service_id': store_id, 'distribution_types': [distribution_type_id]} for store_id in store_ids ] carveouts_python.save_account_carveouts( vendor_contract_id, {'service': dms_restriction_data} ) except Exception as e: return response.create_error_response(code='error', status=400, message=str(e)) def _update_or_create_vendor_dms_master_restriction( distribution_type_id: int, vendor_contract_id: int, store_ids: List[str], vendor_dms_master_restrictions: List[models.VendorDmsMasterRestriction], ) -> bool: """Update/create/delete vendor_dms_master_restrictions. Args: distribution_type_id (int): Id of distribution type vendor_contract_id (int): Id of vendor_contract store_ids (List[str]): List of customer_master_master_id's vendor_dms_master_restrictions (list ): List of existing vendor_dms_master_restrictions """ update_dms_master_restriction_ids = dict() matched_store_ids = list() if vendor_dms_master_restrictions: matched_store_ids = [ str(dms_master_restriction.customer_master_master_id) for dms_master_restriction in vendor_dms_master_restrictions if str(dms_master_restriction.customer_master_master_id) in store_ids ] update_dms_master_restriction_ids = sorted( [ dms_master_restriction.restriction_id for dms_master_restriction in vendor_dms_master_restrictions if str(dms_master_restriction.customer_master_master_id) not in store_ids ] ) new_store_ids = sorted(list(set(store_ids) - set(matched_store_ids))) if len(new_store_ids) > 0: update_store_ids = ( new_store_ids[0 : len(update_dms_master_restriction_ids)] if update_dms_master_restriction_ids else list() ) create_store_ids = ( new_store_ids[len(update_dms_master_restriction_ids) :] if update_dms_master_restriction_ids else new_store_ids ) delete_restriction_ids = ( update_dms_master_restriction_ids[len(new_store_ids) :] if len(update_dms_master_restriction_ids) > len(new_store_ids) else list() ) # noqa: E501 if update_store_ids: payload = { update_dms_master_restriction_ids[i]: update_store_ids[i] for i in range(0, len(update_store_ids)) } models.VendorDmsMasterRestriction.update_by_ids(payload) if create_store_ids: _create_vendor_dms_master_restriction( distribution_type_id=distribution_type_id, store_ids=create_store_ids, vendor_contract_id=vendor_contract_id, ) if delete_restriction_ids: models.VendorDmsMasterRestriction.delete_by_ids(delete_restriction_ids) if len(new_store_ids) == 0 and len(update_dms_master_restriction_ids) > 0: models.VendorDmsMasterRestriction.delete_by_ids( update_dms_master_restriction_ids ) return True def update_vendor_dms_master_restriction(**params: dict): """Update vendor_dms_master_restriction. Args: params: POST request body - distribution_type_id (int): Id of distribution type - store_ids (List[str]): List of customer_master_master_id's - vendor_contract_id (int): Id of vendor_contract """ vendor_contract_id = params.get('vendor_contract_id') distribution_type_id = params.get('distribution_type_id') store_ids = params.get('store_ids') vendor_dms_master_restrictions = models.VendorDmsMasterRestriction.get_by_criteria( distribution_type_id, vendor_contract_id ) # return True if store restriction doesn't exist in art_relation # and store_ids field is empty if len(vendor_dms_master_restrictions) == 0 and store_ids is None: return True # # delete existing store restriction if store_ids field is empty if store_ids is None and len(vendor_dms_master_restrictions) > 0: vendor_dms_master_restriction_ids = [ vendor_dms_master_restriction.restriction_id for vendor_dms_master_restriction in vendor_dms_master_restrictions ] models.VendorDmsMasterRestriction.delete_by_ids( vendor_dms_master_restriction_ids ) # update or create or delete vendor_dms_master_restriction's try: _update_or_create_vendor_dms_master_restriction( distribution_type_id=distribution_type_id, vendor_contract_id=vendor_contract_id, store_ids=store_ids, vendor_dms_master_restrictions=vendor_dms_master_restrictions, ) except Exception as e: return response.create_error_response(code='error', status=400, message=str(e))