Makes the discounts section from _handle_products evaluate lazily, just in case it’s never displayed in a template (those are some very very expensive queries there).

This commit is contained in:
Christopher Neugebauer 2016-04-28 17:19:27 +10:00
parent 76e6206d09
commit 3b5b958b78
2 changed files with 35 additions and 1 deletions

View file

@ -25,3 +25,33 @@ def all_arguments_optional(ntcls):
) )
return ntcls return ntcls
def lazy(function, *args, **kwargs):
''' Produces a callable so that functions can be lazily evaluated in
templates.
Arguments:
function (callable): The function to call at evaluation time.
args: Positional arguments, passed directly to ``function``.
kwargs: Keyword arguments, passed directly to ``function``.
Return:
callable: A callable that will evaluate a call to ``function`` with
the specified arguments.
'''
NOT_EVALUATED = object()
retval = [NOT_EVALUATED]
def evaluate():
if retval[0] is NOT_EVALUATED:
retval[0] = function(*args, **kwargs)
return retval[0]
return evaluate

View file

@ -429,7 +429,11 @@ def _handle_products(request, category, products, prefix):
) )
handled = False if products_form.errors else True handled = False if products_form.errors else True
discounts = DiscountController.available_discounts( # Making this a function to lazily evaluate when it's displayed
# in templates.
discounts = util.lazy(
DiscountController.available_discounts,
request.user, request.user,
[], [],
products, products,