Ejemplo n.º 1
0
    def test_non_negative_basket_lines_values(self):
        # absolute benefit is larger than the line price
        rng = models.Range.objects.create(name="", includes_all_products=True)
        benefit1 = models.Benefit.objects.create(type=models.Benefit.FIXED,
                                                 range=rng,
                                                 value=D('100'))
        benefit2 = models.Benefit.objects.create(type=models.Benefit.FIXED,
                                                 range=rng,
                                                 value=D('100'))
        condition = models.ValueCondition.objects.create(
            range=rng, type=models.Condition.VALUE, value=D('10'))
        models.ConditionalOffer.objects.create(name='offer1',
                                               benefit=benefit1,
                                               condition=condition,
                                               exclusive=False)
        models.ConditionalOffer.objects.create(name='offer2',
                                               benefit=benefit2,
                                               condition=condition,
                                               exclusive=False)

        basket = factories.create_basket(empty=True)
        add_products(basket, [(D('20'), 1)])

        Applicator().apply(basket)
        assert len(basket.offer_applications) == 2
        line = basket.all_lines().first()
        assert line.line_price_excl_tax_incl_discounts == D(0)
        assert line.line_price_incl_tax_incl_discounts == D(0)
        assert basket.total_incl_tax == 0
Ejemplo n.º 2
0
    def setUp(self):
        # Flush the cache
        conn = get_redis_connection('redis')
        conn.flushall()

        self.condition_product = factories.ProductFactory()
        condition_range = factories.RangeFactory()
        condition_range.add_product(self.condition_product)
        self.condition = BluelightCountCondition.objects.create(
            range=condition_range,
            type=Condition.COUNT,
            value=2)

        self.benefit_product = factories.ProductFactory()
        benefit_range = factories.RangeFactory()
        benefit_range.add_product(self.benefit_product)
        self.benefit = BluelightAbsoluteDiscountBenefit.objects.create(
            range=benefit_range,
            type=Benefit.FIXED,
            value=D('3.00'))

        self.offer = ConditionalOffer(
            id=1, condition=self.condition, benefit=self.benefit)
        self.basket = factories.create_basket(empty=True)

        self.applicator = Applicator()
Ejemplo n.º 3
0
 def apply_20percent_shipping_offer(self):
     """Shipping offer 20% off"""
     range = Range.objects.create(name="All products range",
                                 includes_all_products=True)
     benefit = Benefit.objects.create(
         range=range, type=Benefit.SHIPPING_PERCENTAGE, value=20)
     offer = factories.create_offer(range=range, benefit=benefit)
     Applicator().apply_offers(self.basket, [offer])
Ejemplo n.º 4
0
 def setUp(self):
     self.applicator = Applicator()
     self.basket = BasketFactory()
     rng = RangeFactory(includes_all_products=True)
     self.condition = ConditionFactory(
         range=rng, type=ConditionFactory._meta.model.VALUE,
         value=D('100'), proxy_class=None)
     self.benefit = BenefitFactory(
         range=rng, type=BenefitFactory._meta.model.FIXED,
         value=D('10'))
Ejemplo n.º 5
0
 def setUp(self):
     self.applicator = Applicator()
     rng = RangeFactory(includes_all_products=True)
     self.condition = ConditionFactory(
         range=rng, type=ConditionFactory._meta.model.VALUE,
         value=D('100'), proxy_class=None)
     self.benefit = BenefitFactory(
         range=rng, type=BenefitFactory._meta.model.FIXED,
         value=D('10'), max_affected_items=1)
     self.basket = factories.create_basket()
     self.line = self.basket.all_lines()[0]
Ejemplo n.º 6
0
    def test_get_site_offers(self):
        models.ConditionalOffer.objects.create(
            name="globaloffer", condition=self.condition,
            benefit=self.benefit, offer_type=models.ConditionalOffer.SITE)
        models.ConditionalOffer.objects.create(
            name="sessionoffer", condition=self.condition,
            benefit=self.benefit, offer_type=models.ConditionalOffer.SESSION)

        site_offers = Applicator().get_site_offers()
        # Only one offer should be returned
        self.assertEqual(len(site_offers), 1)
        self.assertEqual(site_offers[0].name, "globaloffer")
Ejemplo n.º 7
0
 def setUp(self):
     self.applicator = Applicator()
     self.basket = Basket.objects.create()
     self.product = create_product(price=D('100'))
     rng = G(models.Range, includes_all_products=True)
     self.condition = G(models.Condition,
                        range=rng,
                        type="Value",
                        value=D('100'))
     self.benefit = G(models.Benefit,
                      range=rng,
                      type="Absolute",
                      value=D('10'))
Ejemplo n.º 8
0
 def setUp(self):
     self.applicator = Applicator()
     self.basket = factories.create_basket(empty=True)
     rng = G(models.Range, includes_all_products=True)
     self.condition = G(models.Condition,
                        range=rng,
                        type="Value",
                        value=D('100'),
                        proxy_class=None)
     self.benefit = G(models.Benefit,
                      range=rng,
                      type="Absolute",
                      value=D('10'))
Ejemplo n.º 9
0
    def post(self, request, *args, **kwargs):
        """
        Place an order.

        We fetch the txn details again and then proceed with oscar's standard
        payment details view for placing the order.
        """
        try:
            payer_id = request.POST['payer_id']
            token = request.POST['token']
        except KeyError:
            # Probably suspicious manipulation if we get here
            messages.error(
                self.request,
                _("A problem occurred communicating with PayPal - please try again later"
                  ))
            return HttpResponseRedirect(reverse('basket:summary'))
        try:
            self.fetch_paypal_data(payer_id, token)
        except PayPalError:
            # Unable to fetch txn details from PayPal - we have to bail out
            messages.error(
                self.request,
                _("A problem occurred communicating with PayPal - please try again later"
                  ))
            return HttpResponseRedirect(reverse('basket:summary'))

        # Pass the user email so it can be stored with the order
        order_kwargs = {}  # 'guest_email': self.txn.value('EMAIL')}

        # Lookup the frozen basket that this txn corresponds to
        try:
            self.basket = Basket.objects.get(id=kwargs['basket_id'],
                                             status=Basket.FROZEN)
            Applicator().apply(request, self.basket)
            request.basket = self.basket
        except Basket.DoesNotExist:
            messages.error(
                self.request,
                _("No basket was found that corresponds to your "
                  "PayPal transaction"))
            return HttpResponseRedirect(reverse('basket:summary'))

        return self.submit(self.basket, order_kwargs=order_kwargs)
Ejemplo n.º 10
0
    def setUp(self):
        self.condition_product = factories.ProductFactory()
        condition_range = factories.RangeFactory()
        condition_range.add_product(self.condition_product)
        self.condition = models.CountCondition.objects.create(
            range=condition_range, type=models.Condition.COUNT, value=2)

        self.benefit_product = factories.ProductFactory()
        benefit_range = factories.RangeFactory()
        benefit_range.add_product(self.benefit_product)
        self.benefit = models.AbsoluteDiscountBenefit.objects.create(
            range=benefit_range, type=models.Benefit.FIXED, value=D('3.00'))

        self.offer = models.ConditionalOffer(id=1,
                                             condition=self.condition,
                                             benefit=self.benefit)
        self.basket = factories.create_basket(empty=True)

        self.applicator = Applicator()
Ejemplo n.º 11
0
    def test_apply_offer_with_multibuy_benefit_and_count_condition(self):
        rng = RangeFactory(includes_all_products=True)
        condition = ConditionFactory(range=rng,
                                     type=ConditionFactory._meta.model.COUNT,
                                     value=1)
        benefit = BenefitFactory(range=rng,
                                 type=BenefitFactory._meta.model.MULTIBUY,
                                 value=1)
        offer = ConditionalOfferFactory(condition=condition, benefit=benefit)

        add_product(self.basket, D('100'), 5)

        applicator = Applicator()
        applicator.apply_offers(self.basket, [offer])
        line = self.basket.all_lines()[0]
        assert line.quantity_with_offer_discount(offer) == 1

        self.basket.refresh_from_db()
        assert self.basket.total_discount == D('100')
Ejemplo n.º 12
0
    def get(self, request, *args, **kwargs):
        """
        Fetch details about the successful transaction from
        PayPal.  We use these details to show a preview of
        the order with a 'submit' button to place it.
        """
        try:
            payer_id = request.GET['PayerID']
            token = request.GET['token']
        except KeyError:
            # Manipulation - redirect to basket page with warning message
            messages.error(self.request,
                           _("Unable to determine PayPal transaction details"))
            return HttpResponseRedirect(reverse('basket:summary'))

        try:
            self.fetch_paypal_data(payer_id, token)
        except PayPalError:
            messages.error(
                self.request,
                _("A problem occurred communicating with PayPal - please try again later"
                  ))
            return HttpResponseRedirect(reverse('basket:summary'))

        # Lookup the frozen basket that this txn corresponds to
        try:
            self.basket = Basket.objects.get(id=kwargs['basket_id'],
                                             status=Basket.FROZEN)
            Applicator().apply(request, self.basket)
            request.basket = self.basket
        except Basket.DoesNotExist:
            messages.error(
                self.request,
                _("No basket was found that corresponds to your "
                  "PayPal transaction"))
            return HttpResponseRedirect(reverse('basket:summary'))

        return super(SuccessResponseView, self).get(request, *args, **kwargs)