def update_coupon_offer(self, coupon, vouchers, benefit_value=None, program_uuid=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 """ voucher_offers = vouchers.first().offers voucher_offer = voucher_offers.first() 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_offer = 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) for voucher in vouchers.all(): voucher.offers.clear() 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: 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 test_update_voucher_offer(self): """Test updating a voucher.""" vouchers = create_vouchers(benefit_type=Benefit.PERCENTAGE, benefit_value=100.00, catalog=self.catalog, coupon=self.coupon, end_datetime=datetime.date(2015, 10, 30), name="Test voucher", quantity=10, start_datetime=datetime.date(2015, 10, 1), voucher_type=Voucher.SINGLE_USE, email_domains='example.com') voucher = vouchers[0] voucher_offer = voucher.offers.first() self.assertEqual(voucher_offer.benefit.type, Benefit.PERCENTAGE) self.assertEqual(voucher_offer.benefit.value, 100.00) self.assertEqual(voucher_offer.benefit.range.catalog, self.catalog) new_email_domains = 'example.org' new_offer = update_voucher_offer(voucher_offer, 50.00, Benefit.PERCENTAGE, self.coupon, email_domains=new_email_domains) self.assertEqual(new_offer.benefit.type, Benefit.PERCENTAGE) self.assertEqual(new_offer.benefit.value, 50.00) self.assertEqual(new_offer.benefit.range.catalog, self.catalog) self.assertEqual(new_offer.email_domains, new_email_domains)
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_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: 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_benefit_value(self, benefit_value, vouchers): """ Remove all offers from the vouchers and add a new offer Arguments: benefit_value (Decimal): Benefit value associated with a new offer vouchers (ManyRelatedManager): Vouchers associated with the coupon to be updated """ voucher_offers = vouchers.first().offers voucher_offer = voucher_offers.first() new_offer = update_voucher_offer( offer=voucher_offer, benefit_value=benefit_value, benefit_type=voucher_offer.benefit.type ) for voucher in vouchers.all(): voucher.offers.clear() voucher.offers.add(new_offer)
def update_coupon_benefit_value(self, benefit_value, coupon, vouchers): """ Remove all offers from the vouchers and add a new offer Arguments: benefit_value (Decimal): Benefit value associated with a new offer coupon (Product): Coupon product associated with vouchers vouchers (ManyRelatedManager): Vouchers associated with the coupon to be updated """ voucher_offers = vouchers.first().offers voucher_offer = voucher_offers.first() new_offer = update_voucher_offer( offer=voucher_offer, benefit_value=benefit_value, benefit_type=voucher_offer.benefit.type, coupon=coupon, max_uses=voucher_offer.max_global_applications) for voucher in vouchers.all(): voucher.offers.clear() voucher.offers.add(new_offer)
def test_update_voucher_offer(self): """Test updating a voucher.""" self.data['email_domains'] = 'example.com' vouchers = create_vouchers(**self.data) voucher = vouchers[0] voucher_offer = voucher.offers.first() self.assertEqual(voucher_offer.benefit.type, Benefit.PERCENTAGE) self.assertEqual(voucher_offer.benefit.value, 100.00) self.assertEqual(voucher_offer.benefit.range.catalog, self.catalog) new_email_domains = 'example.org' new_offer = update_voucher_offer( voucher_offer, 50.00, Benefit.PERCENTAGE, email_domains=new_email_domains ) self.assertEqual(new_offer.benefit.type, Benefit.PERCENTAGE) self.assertEqual(new_offer.benefit.value, 50.00) self.assertEqual(new_offer.benefit.range.catalog, self.catalog) self.assertEqual(new_offer.email_domains, new_email_domains)
def update_coupon_benefit_value(self, benefit_value, coupon, vouchers): """ Remove all offers from the vouchers and add a new offer Arguments: benefit_value (Decimal): Benefit value associated with a new offer coupon (Product): Coupon product associated with vouchers vouchers (ManyRelatedManager): Vouchers associated with the coupon to be updated """ voucher_offers = vouchers.first().offers voucher_offer = voucher_offers.first() new_offer = update_voucher_offer( offer=voucher_offer, benefit_value=benefit_value, benefit_type=voucher_offer.benefit.type, coupon=coupon, max_uses=voucher_offer.max_global_applications ) for voucher in vouchers.all(): voucher.offers.clear() voucher.offers.add(new_offer)
def test_update_voucher_offer(self): vouchers = create_vouchers(benefit_type=Benefit.PERCENTAGE, benefit_value=100.00, catalog=self.catalog, coupon=self.coupon, end_datetime=datetime.date(2015, 10, 30), name="Test voucher", quantity=10, start_datetime=datetime.date(2015, 10, 1), voucher_type=Voucher.SINGLE_USE) voucher = vouchers[0] voucher_offer = voucher.offers.first() self.assertEqual(voucher_offer.benefit.type, Benefit.PERCENTAGE) self.assertEqual(voucher_offer.benefit.value, 100.00) self.assertEqual(voucher_offer.benefit.range.catalog, self.catalog) new_offer = update_voucher_offer(voucher_offer, 50.00, Benefit.PERCENTAGE) self.assertEqual(new_offer.benefit.type, Benefit.PERCENTAGE) self.assertEqual(new_offer.benefit.value, 50.00) self.assertEqual(new_offer.benefit.range.catalog, self.catalog)
def test_update_voucher_offer(self): vouchers = create_vouchers( benefit_type=Benefit.PERCENTAGE, benefit_value=100.00, catalog=self.catalog, coupon=self.coupon, end_datetime=datetime.date(2015, 10, 30), name="Test voucher", quantity=10, start_datetime=datetime.date(2015, 10, 1), voucher_type=Voucher.SINGLE_USE ) voucher = vouchers[0] voucher_offer = voucher.offers.first() self.assertEqual(voucher_offer.benefit.type, Benefit.PERCENTAGE) self.assertEqual(voucher_offer.benefit.value, 100.00) self.assertEqual(voucher_offer.benefit.range.catalog, self.catalog) new_offer = update_voucher_offer(voucher_offer, 50.00, Benefit.PERCENTAGE) self.assertEqual(new_offer.benefit.type, Benefit.PERCENTAGE) self.assertEqual(new_offer.benefit.value, 50.00) self.assertEqual(new_offer.benefit.range.catalog, self.catalog)
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)