import itertools
import operator
from collections import defaultdict
from collections import namedtuple
from django.db.models import Sum
from django.utils import timezone
@@ -87,18 +88,28 @@ class ConditionController(object):
for product, quantity in product_quantities)
elif product_quantities is None:
products = set(products)
quantities = {}
# Get the conditions covered by the products themselves
all_conditions = [
product.enablingconditionbase_set.select_subclasses() |
product.category.enablingconditionbase_set.select_subclasses()
prods = (
product.enablingconditionbase_set.select_subclasses()
for product in products
]
all_conditions = set(itertools.chain(*all_conditions))
)
# Get the conditions covered by their categories
cats = (
category.enablingconditionbase_set.select_subclasses()
for category in set(product.category for product in products)
if products:
# Simplify the query.
all_conditions = reduce(operator.or_, itertools.chain(prods, cats))
else:
all_conditions = []
# All mandatory conditions on a product need to be met
mandatory = defaultdict(lambda: True)
# At least one non-mandatory condition on a product must be met
# if there are no mandatory conditions
non_mandatory = defaultdict(lambda: False)
@@ -112,16 +123,20 @@ class ConditionController(object):
# Get all products covered by this condition, and the products
# from the categories covered by this condition
cond_products = condition.products.all()
from_category = rego.Product.objects.filter(
category__in=condition.categories.all(),
).all()
all_products = set(itertools.chain(cond_products, from_category))
all_products = cond_products | from_category
all_products = all_products.select_related("category")
# Remove the products that we aren't asking about
all_products = all_products & products
all_products = [
product
for product in all_products
if product in products
if quantities:
consumed = sum(quantities[i] for i in all_products)
consumed = 1
met = consumed <= remainder