def update_offer_data(self, request_data, vouchers, site): """ Remove all offers from the vouchers and add a new offer Arguments: request_data (dict): the request parameters sent via api. vouchers (list): the vouchers attached to this coupon to update. site (Site): the site for this request. """ benefit_value = request_data.get('benefit_value') enterprise_customer = request_data.get('enterprise_customer', {}).get('id', None) enterprise_catalog = request_data.get( 'enterprise_customer_catalog') or None max_uses = request_data.get('max_uses') email_domains = request_data.get('email_domains') # Validate max_uses if max_uses is not None: if vouchers.first().usage == Voucher.SINGLE_USE: log_message_and_raise_validation_error( 'Failed to update Coupon. ' 'max_global_applications field cannot be set for voucher type [{voucher_type}].' .format(voucher_type=Voucher.SINGLE_USE)) try: max_uses = int(max_uses) if max_uses < 1: raise ValueError except ValueError: raise ValidationError( 'max_global_applications field must be a positive number.') coupon_was_migrated = False for voucher in vouchers.all(): updated_enterprise_offer = update_voucher_with_enterprise_offer( offer=voucher.enterprise_offer, benefit_value=benefit_value, max_uses=max_uses, enterprise_customer=enterprise_customer, enterprise_catalog=enterprise_catalog, email_domains=email_domains, site=site, ) updated_orginal_offer = None if voucher.original_offer != voucher.enterprise_offer: coupon_was_migrated = True updated_orginal_offer = update_voucher_offer( offer=voucher.original_offer, benefit_value=benefit_value, max_uses=max_uses, email_domains=email_domains, site=site, ) voucher.offers.clear() voucher.offers.add(updated_enterprise_offer) if updated_orginal_offer: voucher.offers.add(updated_orginal_offer) if coupon_was_migrated: super(EnterpriseCouponViewSet, self).update_range_data(request_data, vouchers)
def update_offer_data(self, request_data, vouchers, site): """ Remove all offers from the vouchers and add a new offer Arguments: coupon (Product): Coupon product associated with vouchers vouchers (ManyRelatedManager): Vouchers associated with the coupon to be updated site (Site): The Site associated with this offer benefit_value (Decimal): Benefit value associated with a new offer program_uuid (str): Program UUID enterprise_customer (str): Enterprise Customer UUID enterprise_catalog (str): Enterprise Catalog UUID """ program_uuid = request_data.get('program_uuid') benefit_value = request_data.get('benefit_value') enterprise_customer_data = request_data.get('enterprise_customer') enterprise_customer = enterprise_customer_data.get('id', None) if enterprise_customer_data else None enterprise_catalog = request_data.get('enterprise_customer_catalog') or None max_uses = request_data.get('max_uses') email_domains = request_data.get('email_domains') for voucher in vouchers: updated_original_offer = update_voucher_offer( offer=voucher.original_offer, benefit_value=benefit_value, max_uses=max_uses, program_uuid=program_uuid, email_domains=email_domains, site=site, ) updated_enterprise_offer = None if voucher.enterprise_offer: updated_enterprise_offer = update_voucher_with_enterprise_offer( offer=voucher.enterprise_offer, benefit_value=benefit_value, max_uses=max_uses, enterprise_customer=enterprise_customer, enterprise_catalog=enterprise_catalog, email_domains=email_domains, site=site, ) elif enterprise_customer: # If we are performing an update on an existing enterprise coupon, # we need to ensure the enterprise offer is created if it didn't already exist. updated_enterprise_offer = get_or_create_enterprise_offer( benefit_value=benefit_value or voucher.original_offer.benefit.value, benefit_type=voucher.original_offer.benefit.type, enterprise_customer=enterprise_customer, enterprise_customer_catalog=enterprise_catalog, offer_name=voucher.original_offer.name + " ENT Offer", max_uses=max_uses or voucher.original_offer.max_global_applications, email_domains=email_domains or voucher.original_offer.email_domains, site=site or voucher.original_offer.site, ) voucher.offers.clear() voucher.offers.add(updated_original_offer) if updated_enterprise_offer: voucher.offers.add(updated_enterprise_offer)
def update_offer_data(self, request_data, vouchers, site): """ Remove all offers from the vouchers and add a new offer Arguments: request_data (dict): the request parameters sent via api. vouchers (list): the vouchers attached to this coupon to update. site (Site): the site for this request. """ benefit_value = request_data.get('benefit_value') enterprise_customer = request_data.get('enterprise_customer', {}).get('id', None) enterprise_catalog = request_data.get( 'enterprise_customer_catalog') or None max_uses = request_data.get('max_uses') email_domains = request_data.get('email_domains') if not self.is_offer_data_updated(benefit_value, enterprise_customer, enterprise_catalog, max_uses, email_domains): # Offer data does not need to be updated for current request return coupon_was_migrated = False for voucher in vouchers: updated_enterprise_offer = update_voucher_with_enterprise_offer( offer=voucher.enterprise_offer, benefit_value=benefit_value, max_uses=max_uses, enterprise_customer=enterprise_customer, enterprise_catalog=enterprise_catalog, email_domains=email_domains, site=site, ) updated_orginal_offer = None if voucher.original_offer != voucher.enterprise_offer: coupon_was_migrated = True updated_orginal_offer = update_voucher_offer( offer=voucher.original_offer, benefit_value=benefit_value, max_uses=max_uses, email_domains=email_domains, site=site, ) voucher.offers.clear() voucher.offers.add(updated_enterprise_offer) if updated_orginal_offer: voucher.offers.add(updated_orginal_offer) update_assignments_for_multi_use_per_customer(voucher) if coupon_was_migrated: super(EnterpriseCouponViewSet, self).update_range_data(request_data, vouchers)
def update_coupon_offer(self, coupon, vouchers, benefit_value=None, program_uuid=None, enterprise_customer=None, enterprise_catalog=None): """ Remove all offers from the vouchers and add a new offer Arguments: coupon (Product): Coupon product associated with vouchers vouchers (ManyRelatedManager): Vouchers associated with the coupon to be updated benefit_value (Decimal): Benefit value associated with a new offer program_uuid (str): Program UUID enterprise_customer (str): Enterprise Customer UUID enterprise_catalog (str): Enterprise Catalog UUID """ new_offers = [] # Only process the original conditional offer, and update/create the enterprise offer if needed. voucher_offer = vouchers.first().best_offer if program_uuid: Condition.objects.filter( program_uuid=voucher_offer.condition.program_uuid ).update(program_uuid=program_uuid) # The program uuid (if program coupon) is required for the benefit and condition update logic program_uuid = program_uuid or voucher_offer.condition.program_uuid new_offers.append(update_voucher_offer( offer=voucher_offer, benefit_value=benefit_value or voucher_offer.benefit.value, benefit_type=voucher_offer.benefit.type or getattr( voucher_offer.benefit.proxy(), 'benefit_class_type', None ), coupon=coupon, max_uses=voucher_offer.max_global_applications, program_uuid=program_uuid, )) if enterprise_customer: new_offers.append(update_voucher_with_enterprise_offer( offer=voucher_offer, benefit_value=benefit_value or voucher_offer.benefit.value, benefit_type=voucher_offer.benefit.type or getattr( voucher_offer.benefit.proxy(), 'benefit_class_type', None ), coupon=coupon, max_uses=voucher_offer.max_global_applications, enterprise_customer=enterprise_customer, enterprise_catalog=enterprise_catalog, )) for voucher in vouchers.all(): voucher.offers.clear() for new_offer in new_offers: voucher.offers.add(new_offer)
def update_offer_data(self, request_data, vouchers, site): """ Remove all offers from the vouchers and add a new offer Arguments: coupon (Product): Coupon product associated with vouchers vouchers (ManyRelatedManager): Vouchers associated with the coupon to be updated site (Site): The Site associated with this offer benefit_value (Decimal): Benefit value associated with a new offer program_uuid (str): Program UUID enterprise_customer (str): Enterprise Customer UUID enterprise_catalog (str): Enterprise Catalog UUID """ program_uuid = request_data.get('program_uuid') benefit_value = request_data.get('benefit_value') enterprise_customer_data = request_data.get('enterprise_customer') enterprise_customer = enterprise_customer_data.get('id', None) if enterprise_customer_data else None enterprise_catalog = request_data.get('enterprise_customer_catalog') or None max_uses = request_data.get('max_uses') email_domains = request_data.get('email_domains') # Validate max_uses if max_uses is not None: if vouchers.first().usage == Voucher.SINGLE_USE: log_message_and_raise_validation_error( 'Failed to update Coupon. ' 'max_global_applications field cannot be set for voucher type [{voucher_type}].'.format( voucher_type=Voucher.SINGLE_USE )) try: max_uses = int(max_uses) if max_uses < 1: raise ValueError except ValueError: raise ValidationError('max_global_applications field must be a positive number.') for voucher in vouchers.all(): updated_original_offer = update_voucher_offer( offer=voucher.original_offer, benefit_value=benefit_value, max_uses=max_uses, program_uuid=program_uuid, email_domains=email_domains, site=site, ) updated_enterprise_offer = None if voucher.enterprise_offer: updated_enterprise_offer = update_voucher_with_enterprise_offer( offer=voucher.enterprise_offer, benefit_value=benefit_value, max_uses=max_uses, enterprise_customer=enterprise_customer, enterprise_catalog=enterprise_catalog, email_domains=email_domains, site=site, ) elif enterprise_customer: # If we are performing an update on an existing enterprise coupon, # we need to ensure the enterprise offer is created if it didn't already exist. updated_enterprise_offer = get_or_create_enterprise_offer( benefit_value=benefit_value or voucher.original_offer.benefit.value, benefit_type=voucher.original_offer.benefit.type, enterprise_customer=enterprise_customer, enterprise_customer_catalog=enterprise_catalog, offer_name=voucher.original_offer.name + " ENT Offer", max_uses=max_uses or voucher.original_offer.max_global_applications, email_domains=email_domains or voucher.original_offer.email_domains, site=site or voucher.original_offer.site, ) voucher.offers.clear() voucher.offers.add(updated_original_offer) if updated_enterprise_offer: voucher.offers.add(updated_enterprise_offer)