diff --git a/src/pretix/base/reldate.py b/src/pretix/base/reldate.py index 904a7d7153..567eebb454 100644 --- a/src/pretix/base/reldate.py +++ b/src/pretix/base/reldate.py @@ -39,7 +39,7 @@ BASE_CHOICES = ( ('presale_end', _('Presale end')), ) -RelativeDate = namedtuple('RelativeDate', ['days_before', 'minutes_before', 'time', 'base_date_name']) +RelativeDate = namedtuple('RelativeDate', ['days', 'minutes', 'time', 'is_after', 'base_date_name'], defaults=(0, None, None, False, 'date_from')) class RelativeDateWrapper: @@ -64,7 +64,7 @@ class RelativeDateWrapper: elif isinstance(self.data, datetime.date): return self.data else: - if self.data.minutes_before is not None: + if self.data.minutes is not None: raise ValueError('A minute-based relative datetime can not be used as a date') tz = ZoneInfo(event.settings.timezone) @@ -77,7 +77,10 @@ class RelativeDateWrapper: else: base_date = getattr(event, self.data.base_date_name) or event.date_from - new_date = base_date.astimezone(tz) - datetime.timedelta(days=self.data.days_before) + if self.data.is_after: + new_date = base_date.astimezone(tz) + datetime.timedelta(days=self.data.days) + else: + new_date = base_date.astimezone(tz) - datetime.timedelta(days=self.data.days) return new_date.date() def datetime(self, event) -> datetime.datetime: @@ -96,10 +99,16 @@ class RelativeDateWrapper: else: base_date = getattr(event, self.data.base_date_name) or event.date_from - if self.data.minutes_before is not None: - return base_date.astimezone(tz) - datetime.timedelta(minutes=self.data.minutes_before) + if self.data.minutes is not None: + if self.data.is_after: + return base_date.astimezone(tz) + datetime.timedelta(minutes=self.data.minutes) + else: + return base_date.astimezone(tz) - datetime.timedelta(minutes=self.data.minutes) else: - new_date = (base_date.astimezone(tz) - datetime.timedelta(days=self.data.days_before)).astimezone(tz) + if self.data.is_after: + new_date = (base_date.astimezone(tz) + datetime.timedelta(days=self.data.days)).astimezone(tz) + else: + new_date = (base_date.astimezone(tz) - datetime.timedelta(days=self.data.days)).astimezone(tz) if self.data.time: new_date = new_date.replace( hour=self.data.time.hour, @@ -113,15 +122,17 @@ class RelativeDateWrapper: if isinstance(self.data, (datetime.datetime, datetime.date)): return self.data.isoformat() else: - if self.data.minutes_before is not None: - return 'RELDATE/minutes/{}/{}/'.format( # - self.data.minutes_before, - self.data.base_date_name + if self.data.minutes is not None: + return 'RELDATE/minutes/{}/{}/{}'.format( # + self.data.minutes, + self.data.base_date_name, + 'after' if self.data.is_after else '', ) - return 'RELDATE/{}/{}/{}/'.format( # - self.data.days_before, + return 'RELDATE/{}/{}/{}/{}'.format( # + self.data.days, self.data.time.strftime('%H:%M:%S') if self.data.time else '-', - self.data.base_date_name + self.data.base_date_name, + 'after' if self.data.is_after else '', ) @classmethod @@ -130,10 +141,11 @@ class RelativeDateWrapper: parts = input.split('/') if parts[1] == 'minutes': data = RelativeDate( - days_before=0, - minutes_before=int(parts[2]), + days=0, + minutes=int(parts[2]), base_date_name=parts[3], - time=None + time=None, + is_after=len(parts) > 4 and parts[4] == "after", ) else: if parts[2] == '-': @@ -143,17 +155,19 @@ class RelativeDateWrapper: time = datetime.time(hour=int(timeparts[0]), minute=int(timeparts[1]), second=int(timeparts[2])) try: data = RelativeDate( - days_before=int(parts[1] or 0), + days=int(parts[1] or 0), base_date_name=parts[3], time=time, - minutes_before=None + minutes=None, + is_after=len(parts) > 4 and parts[4] == "after", ) except ValueError: data = RelativeDate( - days_before=0, + days=0, base_date_name=parts[3], time=time, - minutes_before=None + minutes=None, + is_after=len(parts) > 4 and parts[4] == "after", ) if data.base_date_name not in [k[0] for k in BASE_CHOICES]: raise ValueError('{} is not a valid base date'.format(data.base_date_name)) @@ -165,20 +179,30 @@ class RelativeDateWrapper: return len(self.to_string()) +BEFORE_AFTER_CHOICE = ( + ('before', _('before')), + ('after', _('after')), +) + + class RelativeDateTimeWidget(forms.MultiWidget): template_name = 'pretixbase/forms/widgets/reldatetime.html' def __init__(self, *args, **kwargs): self.status_choices = kwargs.pop('status_choices') + base_choices = kwargs.pop('base_choices') widgets = ( forms.RadioSelect(choices=self.status_choices), forms.DateTimeInput( attrs={'class': 'datetimepicker'} ), forms.NumberInput(), - forms.Select(choices=kwargs.pop('base_choices')), + forms.Select(choices=base_choices), forms.TimeInput(attrs={'placeholder': _('Time'), 'class': 'timepickerfield'}), forms.NumberInput(), + forms.Select(choices=base_choices), + forms.Select(choices=BEFORE_AFTER_CHOICE), + forms.Select(choices=BEFORE_AFTER_CHOICE), ) super().__init__(widgets=widgets, *args, **kwargs) @@ -186,12 +210,14 @@ class RelativeDateTimeWidget(forms.MultiWidget): if isinstance(value, str): value = RelativeDateWrapper.from_string(value) if not value: - return ['unset', None, 1, 'date_from', None, 0] + return ['unset', None, 1, 'date_from', None, 0, "date_from", "before", "before"] elif isinstance(value.data, (datetime.datetime, datetime.date)): - return ['absolute', value.data, 1, 'date_from', None, 0] - elif value.data.minutes_before is not None: - return ['relative_minutes', None, None, value.data.base_date_name, None, value.data.minutes_before] - return ['relative', None, value.data.days_before, value.data.base_date_name, value.data.time, 0] + return ['absolute', value.data, 1, 'date_from', None, 0, "date_from", "before", "before"] + elif value.data.minutes is not None: + return ['relative_minutes', None, None, value.data.base_date_name, None, value.data.minutes, value.data.base_date_name, + "after" if value.data.is_after else "before", "after" if value.data.is_after else "before"] + return ['relative', None, value.data.days, value.data.base_date_name, value.data.time, 0, value.data.base_date_name, + "after" if value.data.is_after else "before", "after" if value.data.is_after else "before"] def get_context(self, name, value, attrs): ctx = super().get_context(name, value, attrs) @@ -234,6 +260,18 @@ class RelativeDateTimeField(forms.MultiValueField): forms.IntegerField( required=False ), + forms.ChoiceField( + choices=choices, + required=False + ), + forms.ChoiceField( + choices=BEFORE_AFTER_CHOICE, + required=False + ), + forms.ChoiceField( + choices=BEFORE_AFTER_CHOICE, + required=False + ), ) if 'widget' not in kwargs: kwargs['widget'] = RelativeDateTimeWidget(status_choices=status_choices, base_choices=choices) @@ -257,17 +295,19 @@ class RelativeDateTimeField(forms.MultiValueField): return None elif data_list[0] == 'relative_minutes': return RelativeDateWrapper(RelativeDate( - days_before=0, + days=0, base_date_name=data_list[3], time=None, - minutes_before=data_list[5] + minutes=data_list[5], + is_after=data_list[7] == "after", )) else: return RelativeDateWrapper(RelativeDate( - days_before=data_list[2], - base_date_name=data_list[3], + days=data_list[2], + base_date_name=data_list[6], time=data_list[4], - minutes_before=None + minutes=None, + is_after=data_list[8] == "after", )) def has_changed(self, initial, data): @@ -298,6 +338,7 @@ class RelativeDateWidget(RelativeDateTimeWidget): ), forms.NumberInput(), forms.Select(choices=kwargs.pop('base_choices')), + forms.Select(choices=BEFORE_AFTER_CHOICE), ) forms.MultiWidget.__init__(self, widgets=widgets, *args, **kwargs) @@ -305,10 +346,10 @@ class RelativeDateWidget(RelativeDateTimeWidget): if isinstance(value, str): value = RelativeDateWrapper.from_string(value) if not value: - return ['unset', None, 1, 'date_from'] + return ['unset', None, 1, 'date_from', 'before'] elif isinstance(value.data, (datetime.datetime, datetime.date)): - return ['absolute', value.data, 1, 'date_from'] - return ['relative', None, value.data.days_before, value.data.base_date_name] + return ['absolute', value.data, 1, 'date_from', 'before'] + return ['relative', None, value.data.days, value.data.base_date_name, "after" if value.data.is_after else "before"] class RelativeDateField(RelativeDateTimeField): @@ -335,6 +376,10 @@ class RelativeDateField(RelativeDateTimeField): choices=BASE_CHOICES, required=False ), + forms.ChoiceField( + choices=BEFORE_AFTER_CHOICE, + required=False + ), ) if 'widget' not in kwargs: kwargs['widget'] = RelativeDateWidget(status_choices=status_choices, base_choices=BASE_CHOICES) @@ -351,9 +396,10 @@ class RelativeDateField(RelativeDateTimeField): return None else: return RelativeDateWrapper(RelativeDate( - days_before=data_list[2], + days=data_list[2], base_date_name=data_list[3], - time=None, minutes_before=None + time=None, minutes=None, + is_after=data_list[4] == "after" )) def clean(self, value): diff --git a/src/pretix/base/templates/pretixbase/forms/widgets/reldate.html b/src/pretix/base/templates/pretixbase/forms/widgets/reldate.html index 99772f3a70..4337aa6c1d 100644 --- a/src/pretix/base/templates/pretixbase/forms/widgets/reldate.html +++ b/src/pretix/base/templates/pretixbase/forms/widgets/reldate.html @@ -12,7 +12,8 @@ {% include widget.subwidgets.1.template_name with widget=widget.subwidgets.1 %} {% elif selopt.value == "relative" %} {% include widget.subwidgets.2.template_name with widget=widget.subwidgets.2 %} - {% trans "days before" %} + {% trans "days" %} + {% include widget.subwidgets.4.template_name with widget=widget.subwidgets.4 %} {% include widget.subwidgets.3.template_name with widget=widget.subwidgets.3 %} {% endif %} diff --git a/src/pretix/base/templates/pretixbase/forms/widgets/reldatetime.html b/src/pretix/base/templates/pretixbase/forms/widgets/reldatetime.html index cbe123cbd1..de1dbaa9ea 100644 --- a/src/pretix/base/templates/pretixbase/forms/widgets/reldatetime.html +++ b/src/pretix/base/templates/pretixbase/forms/widgets/reldatetime.html @@ -12,12 +12,14 @@ {% include widget.subwidgets.1.template_name with widget=widget.subwidgets.1 %} {% elif selopt.value == "relative_minutes" %} {% include widget.subwidgets.5.template_name with widget=widget.subwidgets.5 %} - {% trans "minutes before" %} + {% trans "minutes" %} + {% include widget.subwidgets.7.template_name with widget=widget.subwidgets.7 %} {% include widget.subwidgets.3.template_name with widget=widget.subwidgets.3 %} {% elif selopt.value == "relative" %} {% include widget.subwidgets.2.template_name with widget=widget.subwidgets.2 %} - {% trans "days before" %} - {% include widget.subwidgets.3.template_name with widget=widget.subwidgets.3 %} + {% trans "days" %} + {% include widget.subwidgets.8.template_name with widget=widget.subwidgets.8 %} + {% include widget.subwidgets.6.template_name with widget=widget.subwidgets.6 %} {% trans "at" %} {% include widget.subwidgets.4.template_name with widget=widget.subwidgets.4 %} {% endif %} diff --git a/src/pretix/control/views/subevents.py b/src/pretix/control/views/subevents.py index 02df3f70b6..adafe370f3 100644 --- a/src/pretix/control/views/subevents.py +++ b/src/pretix/control/views/subevents.py @@ -758,16 +758,16 @@ class SubEventBulkCreate(SubEventEditorMixin, EventPermissionRequiredMixin, Asyn initial['time_to'] = i.date_to.astimezone(tz).time() if i.date_to else None initial['time_admission'] = i.date_admission.astimezone(tz).time() if i.date_admission else None initial['rel_presale_start'] = RelativeDateWrapper(RelativeDate( - days_before=(i.date_from.astimezone(tz).date() - i.presale_start.astimezone(tz).date()).days, + days=(i.date_from.astimezone(tz).date() - i.presale_start.astimezone(tz).date()).days, base_date_name='date_from', time=i.presale_start.astimezone(tz).time(), - minutes_before=None + minutes=None )) if i.presale_start else None initial['rel_presale_end'] = RelativeDateWrapper(RelativeDate( - days_before=(i.date_from.astimezone(tz).date() - i.presale_end.astimezone(tz).date()).days, + days=(i.date_from.astimezone(tz).date() - i.presale_end.astimezone(tz).date()).days, base_date_name='date_from', time=i.presale_end.astimezone(tz).time(), - minutes_before=None + minutes=None )) if i.presale_end else None else: kwargs['instance'] = SubEvent(event=self.request.event) diff --git a/src/tests/base/test_models.py b/src/tests/base/test_models.py index 6a0963a5f7..a70a9e9eeb 100644 --- a/src/tests/base/test_models.py +++ b/src/tests/base/test_models.py @@ -1108,7 +1108,7 @@ class OrderTestCase(BaseQuotaTestCase): self.op2.subevent = se2 self.op2.save() self.event.settings.set('payment_term_last', RelativeDateWrapper( - RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) )) self.order.status = Order.STATUS_EXPIRED @@ -1251,7 +1251,7 @@ class OrderTestCase(BaseQuotaTestCase): self.op2.subevent = se2 self.op2.save() self.event.settings.set('last_order_modification_date', RelativeDateWrapper( - RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) )) assert self.order.can_modify_answers self.op2.subevent = se3 @@ -1267,7 +1267,7 @@ class OrderTestCase(BaseQuotaTestCase): self.event.date_from = datetime.datetime(2017, 5, 3, 12, 0, 0, tzinfo=datetime.timezone.utc) self.event.save() self.event.settings.set('payment_term_last', RelativeDateWrapper( - RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) )) assert self.order.payment_term_last == datetime.datetime(2017, 5, 1, 23, 59, 59, tzinfo=datetime.timezone.utc) @@ -1283,7 +1283,7 @@ class OrderTestCase(BaseQuotaTestCase): self.op2.subevent = se2 self.op2.save() self.event.settings.set('payment_term_last', RelativeDateWrapper( - RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) )) assert self.order.payment_term_last > now() self.op2.subevent = se3 @@ -1299,7 +1299,7 @@ class OrderTestCase(BaseQuotaTestCase): self.event.date_from = datetime.datetime(2017, 5, 3, 12, 0, 0, tzinfo=datetime.timezone.utc) self.event.save() self.event.settings.set('ticket_download_date', RelativeDateWrapper( - RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) )) assert self.order.ticket_download_date == datetime.datetime(2017, 5, 1, 12, 0, 0, tzinfo=datetime.timezone.utc) @@ -1315,7 +1315,7 @@ class OrderTestCase(BaseQuotaTestCase): self.op2.subevent = se2 self.op2.save() self.event.settings.set('ticket_download_date', RelativeDateWrapper( - RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) )) assert self.order.ticket_download_date > now() self.op2.subevent = se3 @@ -1486,13 +1486,13 @@ class OrderTestCase(BaseQuotaTestCase): assert self.order.user_cancel_deadline is None self.event.settings.set('cancel_allow_user_until', RelativeDateWrapper( - RelativeDate(days_before=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes=None) )) self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_cancel_deadline > now() assert self.order.user_cancel_allowed self.event.settings.set('cancel_allow_user_until', RelativeDateWrapper( - RelativeDate(days_before=4, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes_before=None) + RelativeDate(days=4, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes=None) )) self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_cancel_deadline < now() @@ -1511,7 +1511,7 @@ class OrderTestCase(BaseQuotaTestCase): self.op2.save() self.event.settings.set('cancel_allow_user_until', RelativeDateWrapper( - RelativeDate(days_before=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes=None) )) self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_cancel_deadline < now() @@ -1922,13 +1922,13 @@ class OrderTestCase(BaseQuotaTestCase): assert self.order.user_change_deadline is None self.event.settings.set('change_allow_user_until', RelativeDateWrapper( - RelativeDate(days_before=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes=None) )) self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_change_deadline > now() assert self.order.user_change_allowed self.event.settings.set('change_allow_user_until', RelativeDateWrapper( - RelativeDate(days_before=4, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes_before=None) + RelativeDate(days=4, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes=None) )) self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_change_deadline < now() @@ -1950,7 +1950,7 @@ class OrderTestCase(BaseQuotaTestCase): self.op2.save() self.event.settings.set('change_allow_user_until', RelativeDateWrapper( - RelativeDate(days_before=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes=None) )) self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_change_deadline < now() diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index ec8da209ba..34a7da31dd 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -198,7 +198,7 @@ def test_expiry_last_relative(event): event.date_from = now() + timedelta(days=5) event.save() event.settings.set('payment_term_last', RelativeDateWrapper( - RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) )) order = _create_order(event, email='dummy@example.org', positions=[], now_dt=today, @@ -238,7 +238,7 @@ def test_expiry_last_relative_subevents(event): ) event.settings.set('payment_term_last', RelativeDateWrapper( - RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) )) order = _create_order(event, email='dummy@example.org', positions=[cp1, cp2], now_dt=today, diff --git a/src/tests/base/test_payment.py b/src/tests/base/test_payment.py index da22ab3234..e2ecaf2c7a 100644 --- a/src/tests/base/test_payment.py +++ b/src/tests/base/test_payment.py @@ -133,7 +133,7 @@ def test_availability_date_relative(event): event.save() prov = DummyPaymentProvider(event) prov.settings.set('_availability_date', RelativeDateWrapper( - RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) )) utc = datetime.timezone.utc @@ -150,7 +150,7 @@ def test_availability_start_relative(event): event.save() prov = DummyPaymentProvider(event) prov.settings.set('_availability_start', RelativeDateWrapper( - RelativeDate(days_before=2, time=datetime.time(12, 0), base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=datetime.time(12, 0), base_date_name='date_from', minutes=None) )) utc = datetime.timezone.utc @@ -193,12 +193,12 @@ def test_availability_date_cart_relative_subevents(event): prov = DummyPaymentProvider(event) prov.settings.set('_availability_date', RelativeDateWrapper( - RelativeDate(days_before=3, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=3, time=None, base_date_name='date_from', minutes=None) )) assert prov._is_available_by_time(cart_id="123") prov.settings.set('_availability_date', RelativeDateWrapper( - RelativeDate(days_before=4, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=4, time=None, base_date_name='date_from', minutes=None) )) assert not prov._is_available_by_time(cart_id="123") @@ -232,11 +232,11 @@ def test_availability_date_order_relative_subevents(event): prov = DummyPaymentProvider(event) prov.settings.set('_availability_date', RelativeDateWrapper( - RelativeDate(days_before=3, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=3, time=None, base_date_name='date_from', minutes=None) )) assert prov._is_available_by_time(order=order) prov.settings.set('_availability_date', RelativeDateWrapper( - RelativeDate(days_before=4, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=4, time=None, base_date_name='date_from', minutes=None) )) assert not prov._is_available_by_time(order=order) diff --git a/src/tests/base/test_reldate.py b/src/tests/base/test_reldate.py index 301dc781dd..0e340cd9ed 100644 --- a/src/tests/base/test_reldate.py +++ b/src/tests/base/test_reldate.py @@ -56,49 +56,58 @@ def test_absolute_date(event): @pytest.mark.django_db def test_relative_date_without_time(event): - rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='date_from', minutes_before=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='date_from', minutes=None)) assert rdw.datetime(event).astimezone(TOKYO) == datetime(2017, 12, 26, 5, 0, 0, tzinfo=TOKYO) assert rdw.to_string() == 'RELDATE/1/-/date_from/' + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='date_from', minutes=None, is_after=True)) + assert rdw.datetime(event).astimezone(TOKYO) == datetime(2017, 12, 28, 5, 0, 0, tzinfo=TOKYO) + assert rdw.to_string() == 'RELDATE/1/-/date_from/after' @pytest.mark.django_db def test_relative_date_other_base_point(event): with scope(organizer=event.organizer): - rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_start', minutes_before=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='presale_start', minutes=None)) assert rdw.datetime(event) == datetime(2017, 11, 30, 5, 0, 0, tzinfo=TOKYO) assert rdw.to_string() == 'RELDATE/1/-/presale_start/' # presale_end is unset, defaults to date_from - rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_end', minutes_before=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='presale_end', minutes=None)) assert rdw.datetime(event) == datetime(2017, 12, 26, 5, 0, 0, tzinfo=TOKYO) assert rdw.to_string() == 'RELDATE/1/-/presale_end/' # subevent base se = event.subevents.create(name="SE1", date_from=datetime(2017, 11, 27, 5, 0, 0, tzinfo=TOKYO)) - rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='date_from', minutes_before=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='date_from', minutes=None)) assert rdw.datetime(se) == datetime(2017, 11, 26, 5, 0, 0, tzinfo=TOKYO) # presale_start is unset on subevent, default to event - rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_start', minutes_before=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='presale_start', minutes=None)) assert rdw.datetime(se) == datetime(2017, 11, 30, 5, 0, 0, tzinfo=TOKYO) # presale_end is unset on all, default to date_from of subevent - rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_end', minutes_before=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='presale_end', minutes=None)) assert rdw.datetime(se) == datetime(2017, 11, 26, 5, 0, 0, tzinfo=TOKYO) @pytest.mark.django_db def test_relative_date_in_minutes(event): - rdw = RelativeDateWrapper(RelativeDate(days_before=0, time=None, base_date_name='date_from', minutes_before=60)) + rdw = RelativeDateWrapper(RelativeDate(days=0, time=None, base_date_name='date_from', minutes=60)) assert rdw.to_string() == 'RELDATE/minutes/60/date_from/' assert rdw.datetime(event) == datetime(2017, 12, 27, 4, 0, 0, tzinfo=TOKYO) + rdw = RelativeDateWrapper(RelativeDate(days=0, time=None, base_date_name='date_from', minutes=60, is_after=True)) + assert rdw.to_string() == 'RELDATE/minutes/60/date_from/after' + assert rdw.datetime(event) == datetime(2017, 12, 27, 6, 0, 0, tzinfo=TOKYO) @pytest.mark.django_db def test_relative_date_with_time(event): - rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=time(8, 5, 13), base_date_name='date_from', minutes_before=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=time(8, 5, 13), base_date_name='date_from', minutes=None)) assert rdw.to_string() == 'RELDATE/1/08:05:13/date_from/' assert rdw.datetime(event) == datetime(2017, 12, 26, 8, 5, 13, tzinfo=TOKYO) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=time(8, 5, 13), base_date_name='date_from', minutes=None, is_after=True)) + assert rdw.to_string() == 'RELDATE/1/08:05:13/date_from/after' + assert rdw.datetime(event) == datetime(2017, 12, 28, 8, 5, 13, tzinfo=TOKYO) @pytest.mark.django_db @@ -106,21 +115,21 @@ def test_relative_date_with_time_around_dst(event): event.settings.timezone = "Europe/Berlin" event.date_from = datetime(2020, 3, 29, 18, 0, 0, tzinfo=BERLIN) - rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=time(18, 0, 0), base_date_name='date_from', minutes_before=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=time(18, 0, 0), base_date_name='date_from', minutes=None)) assert rdw.to_string() == 'RELDATE/1/18:00:00/date_from/' assert rdw.datetime(event) == datetime(2020, 3, 28, 18, 0, 0, tzinfo=BERLIN) - rdw = RelativeDateWrapper(RelativeDate(days_before=0, time=time(2, 30, 0), base_date_name='date_from', minutes_before=None)) + rdw = RelativeDateWrapper(RelativeDate(days=0, time=time(2, 30, 0), base_date_name='date_from', minutes=None)) assert rdw.to_string() == 'RELDATE/0/02:30:00/date_from/' assert rdw.datetime(event) == datetime(2020, 3, 29, 2, 30, 0, tzinfo=BERLIN) event.date_from = datetime(2020, 10, 25, 18, 0, 0, tzinfo=BERLIN) - rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=time(18, 0, 0), base_date_name='date_from', minutes_before=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=time(18, 0, 0), base_date_name='date_from', minutes=None)) assert rdw.to_string() == 'RELDATE/1/18:00:00/date_from/' assert rdw.datetime(event) == datetime(2020, 10, 24, 18, 0, 0, tzinfo=BERLIN) - rdw = RelativeDateWrapper(RelativeDate(days_before=0, time=time(2, 30, 0), base_date_name='date_from', minutes_before=None)) + rdw = RelativeDateWrapper(RelativeDate(days=0, time=time(2, 30, 0), base_date_name='date_from', minutes=None)) assert rdw.to_string() == 'RELDATE/0/02:30:00/date_from/' assert rdw.datetime(event) == datetime(2020, 10, 25, 2, 30, 0, tzinfo=BERLIN) @@ -131,10 +140,10 @@ def test_unserialize(): assert rdw.data == d rdw = RelativeDateWrapper.from_string('RELDATE/1/-/date_from/') - assert rdw.data == RelativeDate(days_before=1, time=None, base_date_name='date_from', minutes_before=None) + assert rdw.data == RelativeDate(days=1, time=None, base_date_name='date_from', minutes=None) rdw = RelativeDateWrapper.from_string('RELDATE/1/18:05:13/date_from/') - assert rdw.data == RelativeDate(days_before=1, time=time(18, 5, 13), base_date_name='date_from', minutes_before=None) + assert rdw.data == RelativeDate(days=1, time=time(18, 5, 13), base_date_name='date_from', minutes=None) rdw = RelativeDateWrapper.from_string('RELDATE/minutes/60/date_from/') - assert rdw.data == RelativeDate(days_before=0, time=None, base_date_name='date_from', minutes_before=60) + assert rdw.data == RelativeDate(days=0, time=None, base_date_name='date_from', minutes=60) diff --git a/src/tests/presale/test_order_change.py b/src/tests/presale/test_order_change.py index b2d05d7554..23a3f0693e 100644 --- a/src/tests/presale/test_order_change.py +++ b/src/tests/presale/test_order_change.py @@ -1218,7 +1218,7 @@ class OrderChangeAddonsTest(BaseOrdersTest): self.order.save() self._subevent_setup() self.event.settings.set('payment_term_last', RelativeDateWrapper( - RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) + RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) )) response = self.client.get( diff --git a/src/tests/presale/test_orders.py b/src/tests/presale/test_orders.py index 9cecc2bf60..bc3f47a50a 100644 --- a/src/tests/presale/test_orders.py +++ b/src/tests/presale/test_orders.py @@ -944,7 +944,7 @@ class OrdersTest(BaseOrdersTest): self.event.date_from = now() + datetime.timedelta(days=3) self.event.save() self.event.settings.set('ticket_download_date', RelativeDateWrapper(RelativeDate( - base_date_name='date_from', days_before=2, time=None, minutes_before=None + base_date_name='date_from', days=2, time=None, minutes=None ))) response = self.client.post( '/%s/%s/order/%s/%s/download/%d/testdummy' % (self.orga.slug, self.event.slug, self.order.code,