示例#1
0
    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)
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
    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)
示例#6
0
    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)
示例#7
0
    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)
示例#8
0
    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)
示例#9
0
    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)
示例#10
0
    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)
示例#11
0
    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)
示例#12
0
    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)
示例#13
0
    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)
示例#14
0
    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)