From d87106ee6782f71c51cb0a9e6495d015a1cbf971 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 14 Aug 2015 21:17:28 +0200 Subject: [PATCH] Fixed #85 -- Fixed logic of time restrictions --- doc/development/api/restriction.rst | 23 ++++++++++------- src/pretix/base/models.py | 11 ++++++-- src/pretix/plugins/timerestriction/signals.py | 25 +++++++++++-------- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/doc/development/api/restriction.rst b/doc/development/api/restriction.rst index 0fceeaffd1..c45894b9ee 100644 --- a/doc/development/api/restriction.rst +++ b/doc/development/api/restriction.rst @@ -152,6 +152,19 @@ In our example, the implementation could look like this:: # Walk through all variations we are asked for for v in variations: + var_restrictions = [] + for restriction in restrictions: + applied_to = list(restriction.variations.current.all()) + + # Only take this restriction into consideration if it + # is directly applied to this variation or if the item + # has no variations + if v.empty() or ('variation' in v and v['variation'] in applied_to): + var_restrictions.append(restriction) + + if not var_restrictions: + continue + # If this point is reached, there ARE time restrictions for this item # Therefore, it is only available inside one of the timeframes, but not # without any timeframe @@ -175,15 +188,7 @@ In our example, the implementation could look like this:: # Walk through all restriction objects applied to this item prices = [] - for restriction in restrictions: - applied_to = list(restriction.variations.current.all()) - - # Only take this restriction into consideration if it - # is directly applied to this variation or if the item - # has no variations - if not v.empty() and ('variation' not in v or v['variation'] not in applied_to): - continue - + for restriction in var_restrictions: if restriction.timeframe_from <= now() <= restriction.timeframe_to: # Selling this item is currently possible available = True diff --git a/src/pretix/base/models.py b/src/pretix/base/models.py index d8621e1b7f..b13aa883f6 100644 --- a/src/pretix/base/models.py +++ b/src/pretix/base/models.py @@ -1022,15 +1022,22 @@ class Item(Versionable): else: var['price'] = self.default_price + # It is possible, that *multiple* restriction plugins change the default price. + # In this case, the cheapest one wins. As soon as there is a restriction + # that changes the price, the default price has no effect. + newprice = None for receiver, response in responses: - if 'available' in response[i]: - var['available'] &= response[i]['available'] + if 'available' in response[i] and not response[i]['available']: + var['available'] = False + break if 'price' in response[i] and response[i]['price'] is not None \ and (newprice is None or response[i]['price'] < newprice): newprice = response[i]['price'] var['price'] = newprice or var['price'] + variations = [var for var in variations if var['available']] + self._get_all_available_variations_cache = variations return variations diff --git a/src/pretix/plugins/timerestriction/signals.py b/src/pretix/plugins/timerestriction/signals.py index 646f68c21d..5edbbeaae0 100644 --- a/src/pretix/plugins/timerestriction/signals.py +++ b/src/pretix/plugins/timerestriction/signals.py @@ -56,9 +56,22 @@ def availability_handler(sender, **kwargs): # Walk through all variations we are asked for for v in variations: + var_restrictions = [] + for restriction in restrictions: + applied_to = list(restriction.variations.current.all()) + + # Only take this restriction into consideration if it + # is directly applied to this variation or if the item + # has no variations + if v.empty() or ('variation' in v and v['variation'] in applied_to): + var_restrictions.append(restriction) + + if not var_restrictions: + continue + # If this point is reached, there ARE time restrictions for this item # Therefore, it is only available inside one of the timeframes, but not - # without any timeframe + # without any timeframe. available = False # Make up some unique key for this variation @@ -79,15 +92,7 @@ def availability_handler(sender, **kwargs): # Walk through all restriction objects applied to this item prices = [] - for restriction in restrictions: - applied_to = list(restriction.variations.current.all()) - - # Only take this restriction into consideration if it - # is directly applied to this variation or if the item - # has no variations - if not v.empty() and ('variation' not in v or v['variation'] not in applied_to): - continue - + for restriction in var_restrictions: if restriction.timeframe_from <= now() <= restriction.timeframe_to: # Selling this item is currently possible available = True