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
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()
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])
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'))
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]
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")
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'))
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'))
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)
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()
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')
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)