Exemplo n.º 1
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)
Exemplo n.º 2
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)
Exemplo n.º 3
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)
Exemplo n.º 4
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)
Exemplo n.º 5
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)