Flake8 fixes
This commit is contained in:
		
							parent
							
								
									71de0df5dc
								
							
						
					
					
						commit
						162db24817
					
				
					 9 changed files with 86 additions and 35 deletions
				
			
		| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
import collections
 | 
			
		||||
import datetime
 | 
			
		||||
import discount
 | 
			
		||||
import functools
 | 
			
		||||
import itertools
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -378,7 +377,11 @@ class CartController(object):
 | 
			
		|||
        )
 | 
			
		||||
 | 
			
		||||
        products = [i.product for i in product_items]
 | 
			
		||||
        discounts = DiscountController.available_discounts(self.cart.user, [], products)
 | 
			
		||||
        discounts = DiscountController.available_discounts(
 | 
			
		||||
            self.cart.user,
 | 
			
		||||
            [],
 | 
			
		||||
            products,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        # The highest-value discounts will apply to the highest-value
 | 
			
		||||
        # products first.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,6 @@
 | 
			
		|||
import itertools
 | 
			
		||||
import operator
 | 
			
		||||
 | 
			
		||||
from collections import defaultdict
 | 
			
		||||
from collections import namedtuple
 | 
			
		||||
 | 
			
		||||
from django.db.models import Case
 | 
			
		||||
from django.db.models import Count
 | 
			
		||||
from django.db.models import F, Q
 | 
			
		||||
from django.db.models import Sum
 | 
			
		||||
from django.db.models import Value
 | 
			
		||||
| 
						 | 
				
			
			@ -234,9 +229,9 @@ class TimeOrStockLimitFlagController(
 | 
			
		|||
        reserved_carts = cls._relevant_carts(user)
 | 
			
		||||
 | 
			
		||||
        # Calculate category lines
 | 
			
		||||
        cat_items = F('categories__product__productitem__product__category')
 | 
			
		||||
        item_cats = F('categories__product__productitem__product__category')
 | 
			
		||||
        reserved_category_products = (
 | 
			
		||||
            Q(categories=F('categories__product__productitem__product__category')) &
 | 
			
		||||
            Q(categories=item_cats) &
 | 
			
		||||
            Q(categories__product__productitem__cart__in=reserved_carts)
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,16 +46,17 @@ class DiscountController(object):
 | 
			
		|||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def available_discounts(cls, user, categories, products):
 | 
			
		||||
        ''' Returns all discounts available to this user for the given categories
 | 
			
		||||
        and products. The discounts also list the available quantity for this user,
 | 
			
		||||
        not including products that are pending purchase. '''
 | 
			
		||||
        ''' Returns all discounts available to this user for the given
 | 
			
		||||
        categories and products. The discounts also list the available quantity
 | 
			
		||||
        for this user, not including products that are pending purchase. '''
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        filtered_clauses = cls._filtered_discounts(user, categories, products)
 | 
			
		||||
 | 
			
		||||
        discounts = []
 | 
			
		||||
 | 
			
		||||
        # Markers so that we don't need to evaluate given conditions more than once
 | 
			
		||||
        # Markers so that we don't need to evaluate given conditions
 | 
			
		||||
        # more than once
 | 
			
		||||
        accepted_discounts = set()
 | 
			
		||||
        failed_discounts = set()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -71,7 +72,8 @@ class DiscountController(object):
 | 
			
		|||
                pass
 | 
			
		||||
            elif discount not in failed_discounts:
 | 
			
		||||
                # This clause is still available
 | 
			
		||||
                if discount in accepted_discounts or cond.is_met(user, filtered=True):
 | 
			
		||||
                is_accepted = discount in accepted_discounts
 | 
			
		||||
                if is_accepted or cond.is_met(user, filtered=True):
 | 
			
		||||
                    # This clause is valid for this user
 | 
			
		||||
                    discounts.append(DiscountAndQuantity(
 | 
			
		||||
                        discount=discount,
 | 
			
		||||
| 
						 | 
				
			
			@ -89,12 +91,15 @@ class DiscountController(object):
 | 
			
		|||
        '''
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            Sequence[discountbase]: All discounts that passed the filter function.
 | 
			
		||||
            Sequence[discountbase]: All discounts that passed the filter
 | 
			
		||||
            function.
 | 
			
		||||
 | 
			
		||||
        '''
 | 
			
		||||
 | 
			
		||||
        types = list(ConditionController._controllers())
 | 
			
		||||
        discounttypes = [i for i in types if issubclass(i, conditions.DiscountBase)]
 | 
			
		||||
        discounttypes = [
 | 
			
		||||
            i for i in types if issubclass(i, conditions.DiscountBase)
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
        # discounts that match provided categories
 | 
			
		||||
        category_discounts = conditions.DiscountForCategory.objects.filter(
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +110,8 @@ class DiscountController(object):
 | 
			
		|||
            product__in=products
 | 
			
		||||
        )
 | 
			
		||||
        # discounts that match categories for provided products
 | 
			
		||||
        product_category_discounts = conditions.DiscountForCategory.objects.filter(
 | 
			
		||||
        product_category_discounts = conditions.DiscountForCategory.objects
 | 
			
		||||
        product_category_discounts = product_category_discounts.filter(
 | 
			
		||||
            category__in=(product.category for product in products)
 | 
			
		||||
        )
 | 
			
		||||
        # (Not relevant: discounts that match products in provided categories)
 | 
			
		||||
| 
						 | 
				
			
			@ -115,7 +121,9 @@ class DiscountController(object):
 | 
			
		|||
            "product__category",
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        all_category_discounts = category_discounts | product_category_discounts
 | 
			
		||||
        all_category_discounts = (
 | 
			
		||||
            category_discounts | product_category_discounts
 | 
			
		||||
        )
 | 
			
		||||
        all_category_discounts = all_category_discounts.select_related(
 | 
			
		||||
            "category",
 | 
			
		||||
        )
 | 
			
		||||
| 
						 | 
				
			
			@ -136,7 +144,8 @@ class DiscountController(object):
 | 
			
		|||
 | 
			
		||||
        filtered_discounts = list(itertools.chain(*all_subsets))
 | 
			
		||||
 | 
			
		||||
        # Map from discount key to itself (contains annotations added by filter)
 | 
			
		||||
        # Map from discount key to itself
 | 
			
		||||
        # (contains annotations needed in the future)
 | 
			
		||||
        from_filter = dict((i.id, i) for i in filtered_discounts)
 | 
			
		||||
 | 
			
		||||
        # The set of all potential discounts
 | 
			
		||||
| 
						 | 
				
			
			@ -171,5 +180,7 @@ class DiscountController(object):
 | 
			
		|||
            default=Value(0),
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        queryset = queryset.annotate(past_use_count=Sum(past_use_quantity_or_zero))
 | 
			
		||||
        queryset = queryset.annotate(
 | 
			
		||||
            past_use_count=Sum(past_use_quantity_or_zero)
 | 
			
		||||
        )
 | 
			
		||||
        return queryset
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -228,12 +228,19 @@ class FlagCounter(_FlagCounter):
 | 
			
		|||
        # Get the count of how many conditions should exist per product
 | 
			
		||||
        flagbases = conditions.FlagBase.objects
 | 
			
		||||
 | 
			
		||||
        types = (conditions.FlagBase.ENABLE_IF_TRUE, conditions.FlagBase.DISABLE_IF_FALSE)
 | 
			
		||||
        types = (
 | 
			
		||||
            conditions.FlagBase.ENABLE_IF_TRUE,
 | 
			
		||||
            conditions.FlagBase.DISABLE_IF_FALSE,
 | 
			
		||||
        )
 | 
			
		||||
        keys = ("eit", "dif")
 | 
			
		||||
        flags = [
 | 
			
		||||
            flagbases.filter(condition=condition_type
 | 
			
		||||
            ).values('products', 'categories'
 | 
			
		||||
            ).annotate(count=Count('id'))
 | 
			
		||||
            flagbases.filter(
 | 
			
		||||
                condition=condition_type
 | 
			
		||||
            ).values(
 | 
			
		||||
                'products', 'categories'
 | 
			
		||||
            ).annotate(
 | 
			
		||||
                count=Count('id')
 | 
			
		||||
            )
 | 
			
		||||
            for condition_type in types
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,6 @@ from registrasion.models import commerce
 | 
			
		|||
from registrasion.models import inventory
 | 
			
		||||
 | 
			
		||||
from .category import CategoryController
 | 
			
		||||
from .conditions import ConditionController
 | 
			
		||||
from .flag import FlagController
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,7 @@ class RegistrationCartTestCase(SetTimeMixin, TestCase):
 | 
			
		|||
        super(RegistrationCartTestCase, self).setUp()
 | 
			
		||||
 | 
			
		||||
    def tearDown(self):
 | 
			
		||||
        if False:
 | 
			
		||||
        if True:
 | 
			
		||||
            # If you're seeing segfaults in tests, enable this.
 | 
			
		||||
            call_command(
 | 
			
		||||
                'flush',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -149,7 +149,11 @@ class CeilingsTestCases(RegistrationCartTestCase):
 | 
			
		|||
            cart.add_to_cart(self.PROD_1, 1)
 | 
			
		||||
            cart.next_cart()
 | 
			
		||||
 | 
			
		||||
        discounts = DiscountController.available_discounts(self.USER_1, [], [self.PROD_1])
 | 
			
		||||
        discounts = DiscountController.available_discounts(
 | 
			
		||||
            self.USER_1,
 | 
			
		||||
            [],
 | 
			
		||||
            [self.PROD_1],
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(0, len(discounts))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -245,7 +245,11 @@ class DiscountTestCase(RegistrationCartTestCase):
 | 
			
		|||
 | 
			
		||||
    # Tests for the DiscountController.available_discounts enumerator
 | 
			
		||||
    def test_enumerate_no_discounts_for_no_input(self):
 | 
			
		||||
        discounts = DiscountController.available_discounts(self.USER_1, [], [])
 | 
			
		||||
        discounts = DiscountController.available_discounts(
 | 
			
		||||
            self.USER_1,
 | 
			
		||||
            [],
 | 
			
		||||
            [],
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(0, len(discounts))
 | 
			
		||||
 | 
			
		||||
    def test_enumerate_no_discounts_if_condition_not_met(self):
 | 
			
		||||
| 
						 | 
				
			
			@ -258,7 +262,11 @@ class DiscountTestCase(RegistrationCartTestCase):
 | 
			
		|||
        )
 | 
			
		||||
        self.assertEqual(0, len(discounts))
 | 
			
		||||
 | 
			
		||||
        discounts = DiscountController.available_discounts(self.USER_1, [self.CAT_2], [])
 | 
			
		||||
        discounts = DiscountController.available_discounts(
 | 
			
		||||
            self.USER_1,
 | 
			
		||||
            [self.CAT_2],
 | 
			
		||||
            [],
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(0, len(discounts))
 | 
			
		||||
 | 
			
		||||
    def test_category_discount_appears_once_if_met_twice(self):
 | 
			
		||||
| 
						 | 
				
			
			@ -280,7 +288,11 @@ class DiscountTestCase(RegistrationCartTestCase):
 | 
			
		|||
        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.CAT_2], [])
 | 
			
		||||
        discounts = DiscountController.available_discounts(
 | 
			
		||||
            self.USER_1,
 | 
			
		||||
            [self.CAT_2],
 | 
			
		||||
            [],
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(1, len(discounts))
 | 
			
		||||
 | 
			
		||||
    def test_category_discount_appears_with_product(self):
 | 
			
		||||
| 
						 | 
				
			
			@ -328,7 +340,11 @@ class DiscountTestCase(RegistrationCartTestCase):
 | 
			
		|||
        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.CAT_1], [])
 | 
			
		||||
        discounts = DiscountController.available_discounts(
 | 
			
		||||
            self.USER_1,
 | 
			
		||||
            [self.CAT_1],
 | 
			
		||||
            [],
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(0, len(discounts))
 | 
			
		||||
 | 
			
		||||
    def test_discount_quantity_is_correct_before_first_purchase(self):
 | 
			
		||||
| 
						 | 
				
			
			@ -338,7 +354,11 @@ class DiscountTestCase(RegistrationCartTestCase):
 | 
			
		|||
        cart.add_to_cart(self.PROD_1, 1)  # Enable the discount
 | 
			
		||||
        cart.add_to_cart(self.PROD_3, 1)  # Exhaust the quantity
 | 
			
		||||
 | 
			
		||||
        discounts = DiscountController.available_discounts(self.USER_1, [self.CAT_2], [])
 | 
			
		||||
        discounts = DiscountController.available_discounts(
 | 
			
		||||
            self.USER_1,
 | 
			
		||||
            [self.CAT_2],
 | 
			
		||||
            [],
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(2, discounts[0].quantity)
 | 
			
		||||
 | 
			
		||||
        cart.next_cart()
 | 
			
		||||
| 
						 | 
				
			
			@ -349,14 +369,22 @@ class DiscountTestCase(RegistrationCartTestCase):
 | 
			
		|||
        cart = TestingCartController.for_user(self.USER_1)
 | 
			
		||||
        cart.add_to_cart(self.PROD_3, 1)  # Exhaust the quantity
 | 
			
		||||
 | 
			
		||||
        discounts = DiscountController.available_discounts(self.USER_1, [self.CAT_2], [])
 | 
			
		||||
        discounts = DiscountController.available_discounts(
 | 
			
		||||
            self.USER_1,
 | 
			
		||||
            [self.CAT_2],
 | 
			
		||||
            [],
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(1, discounts[0].quantity)
 | 
			
		||||
 | 
			
		||||
        cart.next_cart()
 | 
			
		||||
 | 
			
		||||
    def test_discount_is_gone_after_quantity_exhausted(self):
 | 
			
		||||
        self.test_discount_quantity_is_correct_after_first_purchase()
 | 
			
		||||
        discounts = DiscountController.available_discounts(self.USER_1, [self.CAT_2], [])
 | 
			
		||||
        discounts = DiscountController.available_discounts(
 | 
			
		||||
            self.USER_1,
 | 
			
		||||
            [self.CAT_2],
 | 
			
		||||
            [],
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(0, len(discounts))
 | 
			
		||||
 | 
			
		||||
    def test_product_discount_enabled_twice_appears_twice(self):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -427,7 +427,11 @@ def _handle_products(request, category, products, prefix):
 | 
			
		|||
                )
 | 
			
		||||
    handled = False if products_form.errors else True
 | 
			
		||||
 | 
			
		||||
    discounts = DiscountController.available_discounts(request.user, [], products)
 | 
			
		||||
    discounts = DiscountController.available_discounts(
 | 
			
		||||
        request.user,
 | 
			
		||||
        [],
 | 
			
		||||
        products,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    return products_form, discounts, handled
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue