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…
Reference in a new issue