From 82bb3f3b6e7728f61cf3f8e5163ad8a199a93660 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 20 Aug 2020 13:51:35 +0200 Subject: [PATCH] RelativeDate: Allow to specify "minutes before x" --- src/pretix/base/reldate.py | 102 ++++++++++++------ .../pretixbase/forms/widgets/reldatetime.html | 4 + src/pretix/control/views/subevents.py | 6 +- src/tests/base/test_models.py | 24 ++--- src/tests/base/test_orders.py | 4 +- src/tests/base/test_payment.py | 10 +- src/tests/base/test_reldate.py | 36 ++++--- src/tests/presale/test_orders.py | 2 +- 8 files changed, 121 insertions(+), 67 deletions(-) diff --git a/src/pretix/base/reldate.py b/src/pretix/base/reldate.py index a057884582..35a8ed2bd5 100644 --- a/src/pretix/base/reldate.py +++ b/src/pretix/base/reldate.py @@ -18,7 +18,7 @@ BASE_CHOICES = ( ('presale_end', _('Presale end')), ) -RelativeDate = namedtuple('RelativeDate', ['days_before', 'time', 'base_date_name']) +RelativeDate = namedtuple('RelativeDate', ['days_before', 'minutes_before', 'time', 'base_date_name']) class RelativeDateWrapper: @@ -43,6 +43,9 @@ class RelativeDateWrapper: elif isinstance(self.data, datetime.datetime): return self.data.date() else: + if self.data.minutes_before is not None: + raise ValueError('A minute-based relative datetime can not be used as a date') + tz = pytz.timezone(event.settings.timezone) if isinstance(event, SubEvent): base_date = ( @@ -72,23 +75,31 @@ class RelativeDateWrapper: else: base_date = getattr(event, self.data.base_date_name) or event.date_from - oldoffset = base_date.astimezone(tz).utcoffset() - new_date = base_date.astimezone(tz) - datetime.timedelta(days=self.data.days_before) - if self.data.time: - new_date = new_date.replace( - hour=self.data.time.hour, - minute=self.data.time.minute, - second=self.data.time.second - ) - new_date = new_date.astimezone(tz) - new_offset = new_date.utcoffset() - new_date += oldoffset - new_offset - return new_date + if self.data.minutes_before is not None: + return base_date.astimezone(tz) - datetime.timedelta(minutes=self.data.minutes_before) + else: + oldoffset = base_date.astimezone(tz).utcoffset() + new_date = base_date.astimezone(tz) - datetime.timedelta(days=self.data.days_before) + if self.data.time: + new_date = new_date.replace( + hour=self.data.time.hour, + minute=self.data.time.minute, + second=self.data.time.second + ) + new_date = new_date.astimezone(tz) + new_offset = new_date.utcoffset() + new_date += oldoffset - new_offset + return new_date def to_string(self) -> str: 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 + ) return 'RELDATE/{}/{}/{}/'.format( # self.data.days_before, self.data.time.strftime('%H:%M:%S') if self.data.time else '-', @@ -99,23 +110,33 @@ class RelativeDateWrapper: def from_string(cls, input: str): if input.startswith('RELDATE/'): parts = input.split('/') - if parts[2] == '-': - time = None - else: - timeparts = parts[2].split(':') - 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), - base_date_name=parts[3], - time=time - ) - except ValueError: + if parts[1] == 'minutes': data = RelativeDate( days_before=0, + minutes_before=int(parts[2]), base_date_name=parts[3], - time=time + time=None ) + else: + if parts[2] == '-': + time = None + else: + timeparts = parts[2].split(':') + 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), + base_date_name=parts[3], + time=time, + minutes_before=None + ) + except ValueError: + data = RelativeDate( + days_before=0, + base_date_name=parts[3], + time=time, + minutes_before=None + ) 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)) else: @@ -138,7 +159,8 @@ class RelativeDateTimeWidget(forms.MultiWidget): ), forms.NumberInput(), forms.Select(choices=kwargs.pop('base_choices')), - forms.TimeInput(attrs={'placeholder': _('Time'), 'class': 'timepickerfield'}) + forms.TimeInput(attrs={'placeholder': _('Time'), 'class': 'timepickerfield'}), + forms.NumberInput(), ) super().__init__(widgets=widgets, *args, **kwargs) @@ -146,10 +168,12 @@ class RelativeDateTimeWidget(forms.MultiWidget): if isinstance(value, str): value = RelativeDateWrapper.from_string(value) if not value: - return ['unset', None, 1, 'date_from', None] + return ['unset', None, 1, 'date_from', None, 0] elif isinstance(value.data, (datetime.datetime, datetime.date)): - return ['absolute', value.data, 1, 'date_from', None] - return ['relative', None, value.data.days_before, value.data.base_date_name, value.data.time] + 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] def get_context(self, name, value, attrs): ctx = super().get_context(name, value, attrs) @@ -162,6 +186,7 @@ class RelativeDateTimeField(forms.MultiValueField): status_choices = [ ('absolute', _('Fixed date:')), ('relative', _('Relative date:')), + ('relative_minutes', _('Relative time:')), ] if kwargs.get('limit_choices'): limit = kwargs.pop('limit_choices') @@ -188,6 +213,9 @@ class RelativeDateTimeField(forms.MultiValueField): forms.TimeField( required=False, ), + forms.IntegerField( + required=False + ), ) if 'widget' not in kwargs: kwargs['widget'] = RelativeDateTimeWidget(status_choices=status_choices, base_choices=choices) @@ -209,11 +237,19 @@ class RelativeDateTimeField(forms.MultiValueField): return RelativeDateWrapper(data_list[1]) elif data_list[0] == 'unset': return None + elif data_list[0] == 'relative_minutes': + return RelativeDateWrapper(RelativeDate( + days_before=0, + base_date_name=data_list[3], + time=None, + minutes_before=data_list[5] + )) else: return RelativeDateWrapper(RelativeDate( days_before=data_list[2], base_date_name=data_list[3], - time=data_list[4] + time=data_list[4], + minutes_before=None )) def clean(self, value): @@ -221,6 +257,8 @@ class RelativeDateTimeField(forms.MultiValueField): raise ValidationError(self.error_messages['incomplete']) elif value[0] == 'relative' and (value[2] is None or not value[3]): raise ValidationError(self.error_messages['incomplete']) + elif value[0] == 'relative_minutes' and (value[5] is None or not value[3]): + raise ValidationError(self.error_messages['incomplete']) return super().clean(value) @@ -292,7 +330,7 @@ class RelativeDateField(RelativeDateTimeField): return RelativeDateWrapper(RelativeDate( days_before=data_list[2], base_date_name=data_list[3], - time=None + time=None, minutes_before=None )) def clean(self, value): diff --git a/src/pretix/base/templates/pretixbase/forms/widgets/reldatetime.html b/src/pretix/base/templates/pretixbase/forms/widgets/reldatetime.html index b35b330aaf..cbe123cbd1 100644 --- a/src/pretix/base/templates/pretixbase/forms/widgets/reldatetime.html +++ b/src/pretix/base/templates/pretixbase/forms/widgets/reldatetime.html @@ -10,6 +10,10 @@ {% if selopt.value == "absolute" %} {% 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" %} + {% 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" %} diff --git a/src/pretix/control/views/subevents.py b/src/pretix/control/views/subevents.py index 1208694a78..759c6cca05 100644 --- a/src/pretix/control/views/subevents.py +++ b/src/pretix/control/views/subevents.py @@ -660,12 +660,14 @@ class SubEventBulkCreate(SubEventEditorMixin, EventPermissionRequiredMixin, Crea initial['rel_presale_start'] = RelativeDateWrapper(RelativeDate( days_before=(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() + time=i.presale_start.astimezone(tz).time(), + minutes_before=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, base_date_name='date_from', - time=i.presale_end.astimezone(tz).time() + time=i.presale_end.astimezone(tz).time(), + minutes_before=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 0d0f58aa72..6378a11ba8 100644 --- a/src/tests/base/test_models.py +++ b/src/tests/base/test_models.py @@ -964,7 +964,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') + RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) )) self.order.status = Order.STATUS_EXPIRED @@ -1104,7 +1104,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') + RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) )) assert self.order.can_modify_answers self.op2.subevent = se3 @@ -1120,7 +1120,7 @@ class OrderTestCase(BaseQuotaTestCase): self.event.date_from = datetime.datetime(2017, 5, 3, 12, 0, 0, tzinfo=pytz.UTC) self.event.save() self.event.settings.set('payment_term_last', RelativeDateWrapper( - RelativeDate(days_before=2, time=None, base_date_name='date_from') + RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) )) assert self.order.payment_term_last == datetime.datetime(2017, 5, 1, 23, 59, 59, tzinfo=pytz.UTC) @@ -1136,7 +1136,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') + RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) )) assert self.order.payment_term_last > now() self.op2.subevent = se3 @@ -1152,7 +1152,7 @@ class OrderTestCase(BaseQuotaTestCase): self.event.date_from = datetime.datetime(2017, 5, 3, 12, 0, 0, tzinfo=pytz.UTC) self.event.save() self.event.settings.set('ticket_download_date', RelativeDateWrapper( - RelativeDate(days_before=2, time=None, base_date_name='date_from') + RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) )) assert self.order.ticket_download_date == datetime.datetime(2017, 5, 1, 12, 0, 0, tzinfo=pytz.UTC) @@ -1168,7 +1168,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') + RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) )) assert self.order.ticket_download_date > now() self.op2.subevent = se3 @@ -1307,13 +1307,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') + RelativeDate(days_before=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes_before=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') + RelativeDate(days_before=4, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes_before=None) )) self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_cancel_deadline < now() @@ -1332,7 +1332,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') + RelativeDate(days_before=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes_before=None) )) self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_cancel_deadline < now() @@ -1697,13 +1697,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') + RelativeDate(days_before=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes_before=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') + RelativeDate(days_before=4, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes_before=None) )) self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_change_deadline < now() @@ -1725,7 +1725,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') + RelativeDate(days_before=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes_before=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 f99314def2..e5eca0c6e9 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -103,7 +103,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') + RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) )) order = _create_order(event, email='dummy@example.org', positions=[], now_dt=today, payment_provider=FreeOrderProvider(event), @@ -134,7 +134,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') + RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) )) order = _create_order(event, email='dummy@example.org', positions=[cp1, cp2], now_dt=today, payment_provider=FreeOrderProvider(event), diff --git a/src/tests/base/test_payment.py b/src/tests/base/test_payment.py index fff0eeceb7..d4b387a92b 100644 --- a/src/tests/base/test_payment.py +++ b/src/tests/base/test_payment.py @@ -83,7 +83,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') + RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) )) utc = pytz.timezone('UTC') @@ -126,12 +126,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') + RelativeDate(days_before=3, time=None, base_date_name='date_from', minutes_before=None) )) assert prov._is_still_available(cart_id="123") prov.settings.set('_availability_date', RelativeDateWrapper( - RelativeDate(days_before=4, time=None, base_date_name='date_from') + RelativeDate(days_before=4, time=None, base_date_name='date_from', minutes_before=None) )) assert not prov._is_still_available(cart_id="123") @@ -165,11 +165,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') + RelativeDate(days_before=3, time=None, base_date_name='date_from', minutes_before=None) )) assert prov._is_still_available(order=order) prov.settings.set('_availability_date', RelativeDateWrapper( - RelativeDate(days_before=4, time=None, base_date_name='date_from') + RelativeDate(days_before=4, time=None, base_date_name='date_from', minutes_before=None) )) assert not prov._is_still_available(order=order) diff --git a/src/tests/base/test_reldate.py b/src/tests/base/test_reldate.py index ac3c2e98e8..69fcac7a8c 100644 --- a/src/tests/base/test_reldate.py +++ b/src/tests/base/test_reldate.py @@ -35,7 +35,7 @@ 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')) + rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='date_from', minutes_before=None)) assert rdw.datetime(event).astimezone(TOKYO) == TOKYO.localize(datetime(2017, 12, 26, 5, 0, 0)) assert rdw.to_string() == 'RELDATE/1/-/date_from/' @@ -43,32 +43,39 @@ def test_relative_date_without_time(event): @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')) + rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_start', minutes_before=None)) assert rdw.datetime(event) == TOKYO.localize(datetime(2017, 11, 30, 5, 0, 0)) 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')) + rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_end', minutes_before=None)) assert rdw.datetime(event) == TOKYO.localize(datetime(2017, 12, 26, 5, 0, 0)) assert rdw.to_string() == 'RELDATE/1/-/presale_end/' # subevent base se = event.subevents.create(name="SE1", date_from=TOKYO.localize(datetime(2017, 11, 27, 5, 0, 0))) - rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='date_from')) + rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='date_from', minutes_before=None)) assert rdw.datetime(se) == TOKYO.localize(datetime(2017, 11, 26, 5, 0, 0)) # presale_start is unset on subevent, default to event - rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_start')) + rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_start', minutes_before=None)) assert rdw.datetime(se) == TOKYO.localize(datetime(2017, 11, 30, 5, 0, 0)) # 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')) + rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_end', minutes_before=None)) assert rdw.datetime(se) == TOKYO.localize(datetime(2017, 11, 26, 5, 0, 0)) +@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)) + assert rdw.to_string() == 'RELDATE/minutes/60/date_from/' + assert rdw.datetime(event) == TOKYO.localize(datetime(2017, 12, 27, 4, 0, 0)) + + @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')) + rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=time(8, 5, 13), base_date_name='date_from', minutes_before=None)) assert rdw.to_string() == 'RELDATE/1/08:05:13/date_from/' assert rdw.datetime(event) == TOKYO.localize(datetime(2017, 12, 26, 8, 5, 13)) @@ -78,21 +85,21 @@ def test_relative_date_with_time_around_dst(event): event.settings.timezone = "Europe/Berlin" event.date_from = BERLIN.localize(datetime(2020, 3, 29, 18, 0, 0)) - rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=time(18, 0, 0), base_date_name='date_from')) + rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=time(18, 0, 0), base_date_name='date_from', minutes_before=None)) assert rdw.to_string() == 'RELDATE/1/18:00:00/date_from/' assert rdw.datetime(event) == BERLIN.localize(datetime(2020, 3, 28, 18, 0, 0)) - rdw = RelativeDateWrapper(RelativeDate(days_before=0, time=time(2, 30, 0), base_date_name='date_from')) + rdw = RelativeDateWrapper(RelativeDate(days_before=0, time=time(2, 30, 0), base_date_name='date_from', minutes_before=None)) assert rdw.to_string() == 'RELDATE/0/02:30:00/date_from/' assert rdw.datetime(event) == BERLIN.localize(datetime(2020, 3, 29, 2, 30, 0)) event.date_from = BERLIN.localize(datetime(2020, 10, 25, 18, 0, 0)) - rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=time(18, 0, 0), base_date_name='date_from')) + rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=time(18, 0, 0), base_date_name='date_from', minutes_before=None)) assert rdw.to_string() == 'RELDATE/1/18:00:00/date_from/' assert rdw.datetime(event) == BERLIN.localize(datetime(2020, 10, 24, 18, 0, 0)) - rdw = RelativeDateWrapper(RelativeDate(days_before=0, time=time(2, 30, 0), base_date_name='date_from')) + rdw = RelativeDateWrapper(RelativeDate(days_before=0, time=time(2, 30, 0), base_date_name='date_from', minutes_before=None)) assert rdw.to_string() == 'RELDATE/0/02:30:00/date_from/' assert rdw.datetime(event) == BERLIN.localize(datetime(2020, 10, 25, 2, 30, 0)) @@ -103,7 +110,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') + assert rdw.data == RelativeDate(days_before=1, time=None, base_date_name='date_from', minutes_before=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') + assert rdw.data == RelativeDate(days_before=1, time=time(18, 5, 13), base_date_name='date_from', minutes_before=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) diff --git a/src/tests/presale/test_orders.py b/src/tests/presale/test_orders.py index 7d46f688ef..725001028e 100644 --- a/src/tests/presale/test_orders.py +++ b/src/tests/presale/test_orders.py @@ -745,7 +745,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 + base_date_name='date_from', days_before=2, time=None, minutes_before=None ))) response = self.client.post( '/%s/%s/order/%s/%s/download/%d/testdummy' % (self.orga.slug, self.event.slug, self.order.code,