Browse Source

Ignore expired vouchers during order placement (#3217)

... because the basket flow also ignores them.
master
Lars van de Kerkhof 6 years ago
parent
commit
670fc947a3
2 changed files with 21 additions and 3 deletions
  1. 6
    3
      src/oscar/apps/order/utils.py
  2. 15
    0
      tests/integration/order/test_creator.py

+ 6
- 3
src/oscar/apps/order/utils.py View File

@@ -66,9 +66,12 @@ class OrderCreator(object):
66 66
                 self.update_stock_records(line)
67 67
 
68 68
             for voucher in basket.vouchers.select_for_update():
69
-                available_to_user, msg = voucher.is_available_to_user(user=user)
70
-                if not voucher.is_active() or not available_to_user:
71
-                    raise ValueError(msg)
69
+                if not voucher.is_active():  # basket ignores inactive vouchers
70
+                    basket.vouchers.remove(voucher)
71
+                else:
72
+                    available_to_user, msg = voucher.is_available_to_user(user=user)
73
+                    if not available_to_user:
74
+                        raise ValueError(msg)
72 75
 
73 76
             # Record any discounts associated with this order
74 77
             for application in basket.offer_applications:

+ 15
- 0
tests/integration/order/test_creator.py View File

@@ -1,3 +1,4 @@
1
+import datetime
1 2
 import threading
2 3
 import time
3 4
 from decimal import Decimal as D
@@ -7,6 +8,7 @@ from django.contrib.auth.models import AnonymousUser
7 8
 from django.http import HttpRequest
8 9
 from django.test import TestCase, TransactionTestCase
9 10
 from django.test.utils import override_settings
11
+from django.utils import timezone
10 12
 
11 13
 from oscar.apps.catalogue.models import Product, ProductClass
12 14
 from oscar.apps.checkout import calculators
@@ -266,6 +268,19 @@ class TestPlaceOrderWithVoucher(TestCase):
266 268
         with pytest.raises(ValueError):
267 269
             place_order(creator, basket=basket, order_number='12347', user=user)
268 270
 
271
+    def test_expired_voucher(self):
272
+        user = AnonymousUser()
273
+        basket = factories.create_basket()
274
+        creator = OrderCreator()
275
+
276
+        voucher = factories.VoucherFactory(usage=Voucher.SINGLE_USE)
277
+        voucher.offers.add(factories.create_offer(offer_type='Voucher'))
278
+        basket.vouchers.add(voucher)
279
+        voucher.end_datetime = timezone.now() - datetime.timedelta(days=100)
280
+        voucher.save()
281
+        place_order(creator, basket=basket, order_number='12346', user=user)
282
+        assert voucher.applications.count() == 0
283
+
269 284
 
270 285
 class TestConcurrentOrderPlacement(TransactionTestCase):
271 286
 

Loading…
Cancel
Save