diff --git a/src/pretix/base/reldate.py b/src/pretix/base/reldate.py index b16cb7907b..41e5611f93 100644 --- a/src/pretix/base/reldate.py +++ b/src/pretix/base/reldate.py @@ -71,20 +71,18 @@ class RelativeDateWrapper: :param reference: :return: """ - from .models import SubEvent, Event, Order + from .models import Event, Order, SubEvent if self.data.base_date_name in ORDER_CHOICES_KEYS: if not isinstance(reference, Order): raise ValueError('A order-based relative datetime choice must be used with an order object') event = reference.event - base_date = getattr(order, self.data.base_date_name) + base_date = getattr(reference, self.data.base_date_name) elif isinstance(reference, SubEvent): event = reference.event - base_date = ( - getattr(reference, self.data.base_date_name) - or getattr(reference.event, self.data.base_date_name) - or reference.date_from - ) + base_date = (getattr(reference, self.data.base_date_name) or + getattr(reference.event, self.data.base_date_name) or + reference.date_from) elif isinstance(reference, Event): event = reference base_date = getattr(reference, self.data.base_date_name) or event.date_from @@ -188,7 +186,7 @@ class RelativeDateWrapper: minutes=None, is_after=len(parts) > 4 and parts[4] == "after", ) - if data.base_date_name in [k[0] for k in ORDER_CHOICES] and parts[4] == "before": + if data.base_date_name in [k[0] for k in ORDER_CHOICES] and parts[4] != "after": raise ValueError('ORDER_CHOICE: {} cannot be combined with "before"'.format(data.base_date_name)) if data.base_date_name not in [k[0] for k in EVENT_CHOICES + ORDER_CHOICES]: raise ValueError('{} is not a valid base date'.format(data.base_date_name)) @@ -569,7 +567,6 @@ class RelativeDateField(RelativeDateTimeField): elif data.status == 'relative' and data.rel_days_relationto in ORDER_CHOICES_KEYS and data.rel_days_relation == 'before': raise ValidationError(_('A relative date in relation to an order can only be after the order has been placed')) - return forms.MultiValueField.clean(self, value) diff --git a/src/tests/base/test_reldate.py b/src/tests/base/test_reldate.py index 821e9aa980..3b0cc4f0d4 100644 --- a/src/tests/base/test_reldate.py +++ b/src/tests/base/test_reldate.py @@ -25,7 +25,7 @@ from zoneinfo import ZoneInfo import pytest from django_scopes import scope -from pretix.base.models import Event, Organizer, Order +from pretix.base.models import Event, Order, Organizer from pretix.base.reldate import RelativeDate, RelativeDateWrapper TOKYO = ZoneInfo('Asia/Tokyo') @@ -46,7 +46,6 @@ def event(): return event - @pytest.mark.django_db def test_absolute_date(event): d = datetime(2017, 12, 25, 5, 0, 0, tzinfo=TOKYO) @@ -149,6 +148,7 @@ def test_unserialize(): rdw = RelativeDateWrapper.from_string('RELDATE/minutes/60/date_from/') assert rdw.data == RelativeDate(days=0, time=None, base_date_name='date_from', minutes=60) + @pytest.mark.django_db def test_relative_to_order(event): with scope(organizer=event.organizer): @@ -166,6 +166,9 @@ def test_relative_to_order(event): rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='datetime', minutes=None)) assert rdw.datetime(order).astimezone(TOKYO) == datetime(2020, 3, 28, 18, 0, 0, tzinfo=TOKYO) assert rdw.to_string() == 'RELDATE/1/-/datetime/' + # this is expressible as a RelativeDate but the Wrapper should catch it as invalid when parsing + with pytest.raises(ValueError): + rdw.from_string(rdw.to_string()) rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='datetime', minutes=None, is_after=True)) assert rdw.datetime(order).astimezone(TOKYO) == datetime(2020, 3, 30, 18, 0, 0, tzinfo=TOKYO)