Changeset - 02fe88a4e4db
[Not reviewed]
0 2 0
Christopher Neugebauer - 8 years ago 2016-04-29 01:11:59
chrisjrn@gmail.com
Tests and fixes for a bug where discount quantities did not respect per-line item quantities.
2 files changed with 52 insertions and 15 deletions:
0 comments (0 inline, 0 general)
registrasion/controllers/discount.py
Show inline comments
...
 
@@ -7,3 +7,3 @@ from registrasion.models import conditions
 
from django.db.models import Case
 
from django.db.models import Q
 
from django.db.models import F, Q
 
from django.db.models import Sum
...
 
@@ -66,5 +66,3 @@ class DiscountController(object):
 

	
 
            past_use_count = discount.past_use_count
 

	
 

	
 
            past_use_count = clause.past_use_count
 
            if past_use_count >= clause.quantity:
...
 
@@ -141,3 +139,2 @@ class DiscountController(object):
 
            discounts = ctrl.pre_filter(discounts, user)
 
            discounts = cls._annotate_with_past_uses(discounts, user)
 
            all_subsets.append(discounts)
...
 
@@ -150,7 +147,13 @@ class DiscountController(object):
 

	
 
        # The set of all potential discounts
 
        discount_clauses = set(itertools.chain(
 
        clause_sets = (
 
            product_discounts.filter(discount__in=filtered_discounts),
 
            all_category_discounts.filter(discount__in=filtered_discounts),
 
        ))
 
        )
 

	
 
        clause_sets = (
 
            cls._annotate_with_past_uses(i, user) for i in clause_sets
 
        )
 

	
 
        # The set of all potential discount clauses
 
        discount_clauses = set(itertools.chain(*clause_sets))
 

	
...
 
@@ -166,11 +169,22 @@ class DiscountController(object):
 
    def _annotate_with_past_uses(cls, queryset, user):
 
        ''' Annotates the queryset with a usage count for that discount by the
 
        given user. '''
 
        ''' Annotates the queryset with a usage count for that discount claus
 
        by the given user. '''
 

	
 
        if queryset.model == conditions.DiscountForCategory:
 
            matches = (
 
                Q(category=F('discount__discountitem__product__category'))
 
            )
 
        elif queryset.model == conditions.DiscountForProduct:
 
            matches = (
 
                Q(product=F('discount__discountitem__product'))
 
            )
 

	
 
        in_carts = (
 
            Q(discount__discountitem__cart__user=user) &
 
            Q(discount__discountitem__cart__status=commerce.Cart.STATUS_PAID)
 
        )
 

	
 
        past_use_quantity = When(
 
            (
 
                Q(discountitem__cart__user=user) &
 
                Q(discountitem__cart__status=commerce.Cart.STATUS_PAID)
 
            ),
 
            then="discountitem__quantity",
 
            in_carts & matches,
 
            then="discount__discountitem__quantity",
 
        )
registrasion/tests/test_discount.py
Show inline comments
...
 
@@ -400,2 +400,25 @@ class DiscountTestCase(RegistrationCartTestCase):
 

	
 
    def test_product_discount_applied_on_different_invoices(self):
 
        # quantity=1 means "quantity per product"
 
        self.add_discount_prod_1_includes_prod_3_and_prod_4(quantity=1)
 
        cart = TestingCartController.for_user(self.USER_1)
 
        cart.add_to_cart(self.PROD_1, 1)  # Enable the discount
 
        discounts = DiscountController.available_discounts(
 
            self.USER_1,
 
            [],
 
            [self.PROD_3, self.PROD_4],
 
        )
 
        self.assertEqual(2, len(discounts))
 
        # adding one of PROD_3 should make it no longer an available discount.
 
        cart.add_to_cart(self.PROD_3, 1)
 
        cart.next_cart()
 

	
 
        # should still have (and only have) the discount for prod_4
 
        discounts = DiscountController.available_discounts(
 
            self.USER_1,
 
            [],
 
            [self.PROD_3, self.PROD_4],
 
        )
 
        self.assertEqual(1, len(discounts))
 

	
 
    def test_discounts_are_released_by_refunds(self):
0 comments (0 inline, 0 general)