From 21fc8e4dec8d7ab35dbcc7f646d4445b0eb8b8bc Mon Sep 17 00:00:00 2001 From: Lukas Bockstaller Date: Tue, 19 May 2026 17:11:06 +0200 Subject: [PATCH] moves logic from RelativeDateWrapper into RelativeDate and adds BaseChoice for configuring which models attributes support which relationship --- src/pretix/base/reldate.py | 426 ++++++++++++++++--------- src/pretix/control/forms/subevents.py | 12 +- src/pretix/control/views/subevents.py | 2 +- src/tests/base/test_models.py | 28 +- src/tests/base/test_orders.py | 4 +- src/tests/base/test_payment.py | 12 +- src/tests/base/test_reldate.py | 69 ++-- src/tests/base/test_waitinglist.py | 2 +- src/tests/control/test_events.py | 4 +- src/tests/control/test_subevents.py | 56 ++-- src/tests/presale/test_event.py | 2 +- src/tests/presale/test_order_change.py | 2 +- src/tests/presale/test_orders.py | 2 +- 13 files changed, 363 insertions(+), 258 deletions(-) diff --git a/src/pretix/base/reldate.py b/src/pretix/base/reldate.py index b95e8e70e..7b90b422f 100644 --- a/src/pretix/base/reldate.py +++ b/src/pretix/base/reldate.py @@ -20,8 +20,13 @@ # . # import datetime +import os +import pprint +import warnings from collections import namedtuple -from typing import Tuple, Union, TYPE_CHECKING +from typing import ( + TYPE_CHECKING, Iterable, List, Literal, Tuple, Union, +) from zoneinfo import ZoneInfo from dateutil import parser @@ -29,7 +34,7 @@ from django import forms from django.core.exceptions import ValidationError from django.db import models from django.utils.formats import get_format -from django.utils.functional import lazy +from django.utils.functional import Promise, lazy from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from rest_framework import serializers @@ -37,21 +42,205 @@ from rest_framework import serializers if TYPE_CHECKING: from .models import Event, Order, SubEvent -EVENT_CHOICES = ( - ('date_from', _('Event start')), - ('date_to', _('Event end')), - ('date_admission', _('Event admission')), - ('presale_start', _('Presale start')), - ('presale_end', _('Presale end')), -) -# extend NO_BEFORE_VALUES in reldate.js if changed -ORDER_CHOICES = ( - ('datetime', _('Order creation')), -) -ORDER_CHOICES_KEYS = {choice[0] for choice in ORDER_CHOICES} +class BaseChoice: + def __init__(self, base: Literal["event", "order"], attribute: str, text: Promise, supports_before: bool, + supports_after: bool) -> None: + self.base = base + self.attribute = attribute + self.text = text + self.supports_before = supports_before + self.supports_after = supports_after + self.key = f"{self.base}__{self.attribute}" -RelativeDate = namedtuple('RelativeDate', ['days', 'minutes', 'time', 'is_after', 'base_date_name'], defaults=(0, None, None, False, 'date_from')) + @staticmethod + def find(objects: Iterable["BaseChoice"], key: str) -> "BaseChoice": + if "__" in key: + choice = next((obj for obj in objects if obj.key == key), None) + else: + # fallback for RelativeDateFields stored, before support for bases other than event was added + choice = next((obj for obj in objects if obj.attribute == key and obj.base == "event"), None) + + if choice is None: + raise TypeError(f"key {key} must be a valid key in BASE_CHOICES") + + return choice + + +BASE_CHOICES: List[BaseChoice] = [ + BaseChoice('event', 'date_from', _('Event start'), True, True), + BaseChoice('event', 'date_to', _('Event end'), True, True), + BaseChoice('event', 'date_admission', _('Event admission'), True, True), + BaseChoice('event', 'presale_start', _('Presale start'), True, True), + BaseChoice('event', 'presale_end', _('Presale end'), True, True), + BaseChoice('order', 'datetime', _('Order creation'), False, True), + BaseChoice('order', 'expires', _('Order expiry'), True, False), +] + +LIMIT_FALLBACKS = ['date_from', 'date_to', 'date_admission', 'presale_start', 'presale_end'] + +EVENT_BASE_CHOICES = [ + x for x in BASE_CHOICES if x.base == 'event' +] + +ORDER_BASE_CHOICES = [ + x for x in BASE_CHOICES if x.base == 'order' +] + + +class RelativeDate: + """ + This contains information on a date that is defined in relation to a fixed base point. + This means that the underlying data is a fixed date as the base point and a number of days or a time interval + to calculate the date. + + The list of valid base date choices is defined in BASE_CHOICES. + If the base_date_key is not set, the date_from attribute of Event is used. + """ + + def __init__(self, days: int = 0, minutes: int = None, time: datetime.time = None, is_after: bool = False, + base_date_name: str = 'event__date_from') -> None: + choice = BaseChoice.find(BASE_CHOICES, base_date_name) + self.base = choice.base + self.attribute = choice.attribute + + if is_after and not choice.supports_after: + raise ValueError( + "The selected base date and attribute combination does not support relative dates placed after the base date") + if not is_after and not choice.supports_before: + raise ValueError( + "The selected base date and attribute combination does not support relative dates placed before the base date") + self.is_after = is_after + + self.days = days + self.minutes = minutes + self.time = time + self.key = choice.key + + def __eq__(self, o: object) -> bool: + if not isinstance(o, RelativeDate): + return False + return self.to_string() == o.to_string() + + def _resolve_base_date(self, base: "Event | Order | SubEvent") -> Tuple[datetime.datetime, ZoneInfo]: + """ + + :param base: + :return: + """ + from .models import Event, Order, SubEvent + + if self.base == "order" and isinstance(base, Order): + event = base.event + base_date = getattr(base, self.attribute) + elif self.base == "event" and isinstance(base, SubEvent): + event = base.event + base_date = (getattr(base, self.attribute) or + getattr(base.event, self.attribute) or + base.date_from) + elif self.base == "event" and isinstance(base, Event): + event = base + base_date = getattr(base, self.attribute) or event.date_from + else: + raise TypeError("The base defined by data does not match the passed in base") + + tz = ZoneInfo(event.settings.timezone) + return base_date, tz + + def date(self, base: "Event | Order | SubEvent") -> datetime.date: + if self.minutes is not None: + raise ValueError('A minute-based relative datetime can not be used as a date') + + base_date, tz = self._resolve_base_date(base) + + if self.is_after: + new_date = base_date.astimezone(tz) + datetime.timedelta(days=self.days) + else: + new_date = base_date.astimezone(tz) - datetime.timedelta(days=self.days) + return new_date.date() + + def datetime(self, base: "Event | Order | SubEvent") -> datetime.datetime: + base_date, tz = self._resolve_base_date(base) + + if self.minutes is not None: + if self.is_after: + return base_date.astimezone(tz) + datetime.timedelta(minutes=self.minutes) + else: + return base_date.astimezone(tz) - datetime.timedelta(minutes=self.minutes) + else: + if self.is_after: + new_date = (base_date.astimezone(tz) + datetime.timedelta(days=self.days)).astimezone(tz) + else: + new_date = (base_date.astimezone(tz) - datetime.timedelta(days=self.days)).astimezone(tz) + if self.time: + new_date = new_date.replace( + hour=self.time.hour, + minute=self.time.minute, + second=self.time.second + ) + new_date = new_date.astimezone(tz) + return new_date + + def to_string(self) -> str: + """ + + :return: + """ + if self.minutes is not None: + return 'RELDATE/minutes/{}/{}/{}'.format( # + self.minutes, + self.key, + 'after' if self.is_after else '', + ) + return 'RELDATE/{}/{}/{}/{}'.format( # + self.days, + self.time.strftime('%H:%M:%S') if self.time else '-', + self.key, + 'after' if self.is_after else '', + ) + + @classmethod + def from_string(cls, input: str): + """ + + :param input: + """ + if not input.startswith('RELDATE/'): + raise TypeError("Invalid input for RelativeDate.from_string()") + + parts = input.split('/') + if parts[1] == 'minutes': + data = RelativeDate( + days=0, + minutes=int(parts[2]), + base_date_name=parts[3], + time=None, + is_after=len(parts) > 4 and parts[4] == "after", + ) + 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=int(parts[1] or 0), + base_date_name=parts[3], + time=time, + minutes=None, + is_after=len(parts) > 4 and parts[4] == "after", + ) + except ValueError: + data = RelativeDate( + days=0, + base_date_name=parts[3], + time=time, + minutes=None, + is_after=len(parts) > 4 and parts[4] == "after", + ) + + return data class RelativeDateWrapper: @@ -59,140 +248,35 @@ class RelativeDateWrapper: This contains information on a date that might be relative to an event. This means that the underlying data is either a fixed date or a number of days and a wall clock time to calculate the date based on a base point. - - The base point can be the ``date_from``, ``date_to``, ``date_admission``, ``presale_start`` - or ``presale_end`` attribute of an event or subevent, as well as a ``datetime`` of an order. - If the respective attribute is not set, ``date_from`` will be used. """ def __init__(self, data: Union[datetime.datetime, RelativeDate]): self.data = data - def _resolve_base_date(self, reference: "Event | Order | SubEvent") -> Tuple[datetime.datetime, ZoneInfo]: - """ - - :param reference: - :return: - """ - 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(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) - elif isinstance(reference, Event): - event = reference - base_date = getattr(reference, self.data.base_date_name) or event.date_from - else: - raise TypeError("Only event, subevent or order objects are supported") - - tz = ZoneInfo(event.settings.timezone) - - return base_date, tz - - def date(self, reference: "datetime.date | datetime.datetime | Event | Order | SubEvent" ) -> datetime.date: + def date(self, base: "Event | Order | SubEvent") -> datetime.date: if isinstance(self.data, datetime.datetime): return self.data.date() elif isinstance(self.data, datetime.date): return self.data else: - if self.data.minutes is not None: - raise ValueError('A minute-based relative datetime can not be used as a date') + return self.data.date(base) - base_date, tz = self._resolve_base_date(reference) - - 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, reference: "datetime.date | datetime.datetime | Event | Order | SubEvent" ) -> datetime.datetime: + def datetime(self, base: "Event | Order | SubEvent") -> datetime.datetime: if isinstance(self.data, (datetime.datetime, datetime.date)): return self.data else: - base_date, tz = self._resolve_base_date(reference) - - 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: - 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, - minute=self.data.time.minute, - second=self.data.time.second - ) - new_date = new_date.astimezone(tz) - return new_date + return self.data.datetime(base) def to_string(self) -> str: if isinstance(self.data, (datetime.datetime, datetime.date)): return self.data.isoformat() else: - 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, - self.data.time.strftime('%H:%M:%S') if self.data.time else '-', - self.data.base_date_name, - 'after' if self.data.is_after else '', - ) + return self.data.to_string() @classmethod def from_string(cls, input: str): if input.startswith('RELDATE/'): - parts = input.split('/') - if parts[1] == 'minutes': - data = RelativeDate( - days=0, - minutes=int(parts[2]), - base_date_name=parts[3], - time=None, - is_after=len(parts) > 4 and parts[4] == "after", - ) - 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=int(parts[1] or 0), - base_date_name=parts[3], - time=time, - minutes=None, - is_after=len(parts) > 4 and parts[4] == "after", - ) - except ValueError: - data = RelativeDate( - days=0, - base_date_name=parts[3], - time=time, - minutes=None, - is_after=len(parts) > 4 and parts[4] == "after", - ) - if data.base_date_name in ORDER_CHOICES_KEYS 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)) + data = RelativeDate.from_string(input) else: data = parser.parse(input) return RelativeDateWrapper(data) @@ -206,7 +290,6 @@ BEFORE_AFTER_CHOICE = ( ('after', _('after')), ) - reldatetimeparts = namedtuple('reldatetimeparts', ( "status", # 0 "absolute", # 1 @@ -266,10 +349,10 @@ class RelativeDateTimeWidget(forms.MultiWidget): status="unset", absolute=None, rel_days_number=1, - rel_mins_relationto="date_from", + rel_mins_relationto="event__date_from", rel_days_timeofday=None, rel_mins_number=0, - rel_days_relationto="date_from", + rel_days_relationto="event__date_from", rel_mins_relation="before", rel_days_relation="before" ) @@ -278,10 +361,10 @@ class RelativeDateTimeWidget(forms.MultiWidget): status="absolute", absolute=value.data, rel_days_number=1, - rel_mins_relationto="date_from", + rel_mins_relationto="event__date_from", rel_days_timeofday=None, rel_mins_number=0, - rel_days_relationto="date_from", + rel_days_relationto="event__date_from", rel_mins_relation="before", rel_days_relation="before" ) @@ -301,10 +384,10 @@ class RelativeDateTimeWidget(forms.MultiWidget): status="relative", absolute=None, rel_days_number=value.data.days, - rel_mins_relationto=value.data.base_date_name, + rel_mins_relationto=value.data.key, rel_days_timeofday=value.data.time, rel_mins_number=0, - rel_days_relationto=value.data.base_date_name, + rel_days_relationto=value.data.key, rel_mins_relation="after" if value.data.is_after else "before", rel_days_relation="after" if value.data.is_after else "before" ) @@ -328,15 +411,28 @@ class RelativeDateTimeField(forms.MultiValueField): ('relative', _('Relative date:')), ('relative_minutes', _('Relative time:')), ] + self.relative_to_order = kwargs.pop('relative_to_order', False) + + all_choices = EVENT_BASE_CHOICES + if self.relative_to_order: + all_choices.extend(ORDER_BASE_CHOICES) + if kwargs.get('limit_choices'): limit = kwargs.pop('limit_choices') - choices = [(k, v) for k, v in EVENT_CHOICES if k in limit] - else: - choices = EVENT_CHOICES + if any(["__" not in l for l in limit]): + _warn_skips = (os.path.dirname(__file__),) + warnings.warn( + "Please prefix limit_choices with the base the attributes refer to, for example event__date_from", + skip_file_prefixes=_warn_skips) - self.relative_to_order = kwargs.pop('relative_to_order', False) - if self.relative_to_order: - choices += ORDER_CHOICES + choices = [(c.key, c.text) for c in all_choices if + # new base case as we want limit_choices to be expressed as base__attribute + (c.key in limit) or + # fallback for old event based entries + # if the base is an event, then using only attribute is fine + (c.base == "event" and c.attribute in limit)] + else: + choices = [(c.key, c.text) for c in all_choices] if not kwargs.get('required', True): status_choices.insert(0, ('unset', _('Not set'))) @@ -385,10 +481,10 @@ class RelativeDateTimeField(forms.MultiValueField): def set_event(self, event): choices = [ - (k, v) for k, v in EVENT_CHOICES if getattr(event, k, None) + (c.key, c.text) for c in EVENT_BASE_CHOICES if getattr(event, c.attribute, None) ] if self.relative_to_order: - choices += ORDER_CHOICES + choices += [(c.key, c.text) for c in ORDER_BASE_CHOICES] self.widget.widgets[reldateparts.indizes.rel_days_relationto].choices = choices self.widget.widgets[reldatetimeparts.indizes.rel_mins_relationto].choices = choices @@ -396,10 +492,10 @@ class RelativeDateTimeField(forms.MultiValueField): if not data_list: return None data = reldatetimeparts(*data_list) - if data.status == 'absolute': - return RelativeDateWrapper(data.absolute) - elif data.status == 'unset': + if data.status == 'unset': return None + elif data.status == 'absolute': + return RelativeDateWrapper(data.absolute) elif data.status == 'relative_minutes': return RelativeDateWrapper(RelativeDate( days=0, @@ -430,10 +526,18 @@ class RelativeDateTimeField(forms.MultiValueField): raise ValidationError(self.error_messages['incomplete']) elif data.status == 'relative_minutes' and (data.rel_mins_number is None or not data.rel_mins_relationto): raise ValidationError(self.error_messages['incomplete']) - 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')) - elif data.status == 'relative' and data.rel_mins_relationto in ORDER_CHOICES_KEYS and data.rel_mins_relation == 'before': - raise ValidationError(_('A relative date in relation to an order can only be after the order has been placed')) + elif data.status == 'relative': + choice = BaseChoice.find(BASE_CHOICES, data.rel_days_relationto) + if data.rel_days_relation == "before" and not choice.supports_before: + raise ValidationError(_("A relative date cannot be expressed as 'before' for '{}'".format(choice.text))) + elif data.status == 'relative' and data.rel_days_relation == "after" and not choice.supports_after: + raise ValidationError(_("A relative date cannot be expressed as 'after' for '{}'".format(choice.text))) + elif data.status == 'relative_minutes': + choice = BaseChoice.find(BASE_CHOICES, data.rel_days_relationto) + if data.rel_days_relation == "before" and not choice.supports_before: + raise ValidationError(_("A relative time cannot be expressed as 'before' for '{}'".format(choice.text))) + elif data.rel_days_relation == "after" and not choice.supports_after: + raise ValidationError(_("A relative time cannot be expressed as 'after' for '{}'".format(choice.text))) return super().clean(value) @@ -506,10 +610,10 @@ class RelativeDateField(RelativeDateTimeField): if not kwargs.get('required', True): status_choices.insert(0, ('unset', _('Not set'))) - choices = EVENT_CHOICES + choices = [(c.key, c.text) for c in EVENT_BASE_CHOICES] self.relative_to_order = kwargs.pop('relative_to_order', False) if self.relative_to_order: - choices += ORDER_CHOICES + choices += [(c.key, c.text) for c in ORDER_BASE_CHOICES] fields = reldateparts( status=forms.ChoiceField( @@ -539,20 +643,20 @@ class RelativeDateField(RelativeDateTimeField): def set_event(self, event): choices = [ - (k, v) for k, v in EVENT_CHOICES if getattr(event, k, None) + (c.key, c.text) for c in EVENT_BASE_CHOICES if getattr(event, c.attribute, None) ] if self.relative_to_order: - choices += ORDER_CHOICES + choices += [(c.key, c.text) for c in ORDER_BASE_CHOICES] self.widget.widgets[reldateparts.indizes.rel_days_relationto].choices = choices def compress(self, data_list): if not data_list: return None data = reldateparts(*data_list) - if data.status == 'absolute': - return RelativeDateWrapper(data.absolute) - elif data.status == 'unset': + if data.status == 'unset': return None + elif data.status == 'absolute': + return RelativeDateWrapper(data.absolute) else: return RelativeDateWrapper(RelativeDate( days=data.rel_days_number, @@ -565,10 +669,14 @@ class RelativeDateField(RelativeDateTimeField): data = reldateparts(*value) if data.status == 'absolute' and not data.absolute: raise ValidationError(self.error_messages['incomplete']) - elif data.status == 'relative' and (data.rel_days_number is None or not data.rel_days_relationto): - raise ValidationError(self.error_messages['incomplete']) - 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')) + if data.status == 'relative': + choice = BaseChoice.find(BASE_CHOICES, data.rel_days_relationto) + if data.rel_days_number is None or not data.rel_days_relationto: + raise ValidationError(self.error_messages['incomplete']) + elif data.rel_days_relation == "before" and not choice.supports_before: + raise ValidationError(_("A relative date cannot be expressed as 'before' for '{}'".format(choice.text))) + elif data.rel_days_relation == "after" and not choice.supports_after: + raise ValidationError(_("A relative date cannot be expressed as 'after' for '{}'".format(choice.text))) return forms.MultiValueField.clean(self, value) diff --git a/src/pretix/control/forms/subevents.py b/src/pretix/control/forms/subevents.py index 05607956e..008486b4e 100644 --- a/src/pretix/control/forms/subevents.py +++ b/src/pretix/control/forms/subevents.py @@ -93,14 +93,14 @@ class SubEventBulkForm(SubEventForm): label=_('Start of presale'), help_text=_('Optional. No products will be sold before this date.'), required=False, - limit_choices=('date_from', 'date_to'), + limit_choices=('event__date_from', 'event__date_to'), ) rel_presale_end = RelativeDateTimeField( label=_('End of presale'), help_text=_('Optional. No products will be sold after this date. If you do not set this value, the presale ' 'will end after the end date of your event.'), required=False, - limit_choices=('date_from', 'date_to'), + limit_choices=('event__date_from', 'event__date_to'), ) skip_if_overlap = forms.BooleanField( label=pgettext_lazy('subevent', 'Skip dates that overlap with any existing date'), @@ -332,12 +332,12 @@ class BulkSubEventItemForm(SubEventItemForm): rel_available_from = RelativeDateTimeField( label=_('Available from'), required=False, - limit_choices=('date_from', 'date_to'), + limit_choices=('event__date_from', 'event__date_to'), ) rel_available_until = RelativeDateTimeField( label=_('Available until'), required=False, - limit_choices=('date_from', 'date_to'), + limit_choices=('event__date_from', 'event__date_to'), ) def __init__(self, *args, **kwargs): @@ -354,12 +354,12 @@ class BulkSubEventItemVariationForm(SubEventItemVariationForm): rel_available_from = RelativeDateTimeField( label=_('Available from'), required=False, - limit_choices=('date_from', 'date_to'), + limit_choices=('event__date_from', 'event__date_to'), ) rel_available_until = RelativeDateTimeField( label=_('Available_until'), required=False, - limit_choices=('date_from', 'date_to'), + limit_choices=('event__date_from', 'event__date_to'), ) def __init__(self, *args, **kwargs): diff --git a/src/pretix/control/views/subevents.py b/src/pretix/control/views/subevents.py index 4d5fbbc0c..62a053460 100644 --- a/src/pretix/control/views/subevents.py +++ b/src/pretix/control/views/subevents.py @@ -424,7 +424,7 @@ class SubEventEditorMixin(MetaDataEditorMixin): days = (self.copy_from.date_from.astimezone(tz).date() - value.astimezone(tz).date()).days return RelativeDateWrapper(RelativeDate( days=abs(days), - base_date_name='date_from', + base_date_name='event__date_from', time=value.astimezone(tz).time(), minutes=None, is_after=days < 0, diff --git a/src/tests/base/test_models.py b/src/tests/base/test_models.py index 6f2359db1..41d9d67ab 100644 --- a/src/tests/base/test_models.py +++ b/src/tests/base/test_models.py @@ -473,7 +473,7 @@ class QuotaTestCase(BaseQuotaTestCase): @classscope(attr='o') def test_waitinglist_auto_disable(self): self.event.settings.waiting_list_auto_disable = RelativeDateWrapper( - RelativeDate(days=0, time=None, base_date_name='date_from', minutes=20, is_after=True) + RelativeDate(days=0, time=None, base_date_name='event__date_from', minutes=20, is_after=True) ) self.quota.items.add(self.item1) self.quota.size = 1 @@ -484,7 +484,7 @@ class QuotaTestCase(BaseQuotaTestCase): self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_ORDERED, 0)) self.assertEqual(self.item1.check_quotas(count_waitinglist=False), (Quota.AVAILABILITY_OK, 1)) self.event.settings.waiting_list_auto_disable = RelativeDateWrapper( - RelativeDate(days=0, time=None, base_date_name='date_from', minutes=20, is_after=False) + RelativeDate(days=0, time=None, base_date_name='event__date_from', minutes=20, is_after=False) ) self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, 1)) self.assertEqual(self.item1.check_quotas(count_waitinglist=False), (Quota.AVAILABILITY_OK, 1)) @@ -1192,7 +1192,7 @@ class OrderTestCase(BaseQuotaTestCase): self.op2.subevent = se2 self.op2.save() self.event.settings.set('payment_term_last', RelativeDateWrapper( - RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=None, base_date_name='event__date_from', minutes=None) )) self.order.status = Order.STATUS_EXPIRED @@ -1347,7 +1347,7 @@ class OrderTestCase(BaseQuotaTestCase): self.op2.subevent = se2 self.op2.save() self.event.settings.set('last_order_modification_date', RelativeDateWrapper( - RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=None, base_date_name='event__date_from', minutes=None) )) assert self.order.can_modify_answers self.op2.subevent = se3 @@ -1363,7 +1363,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=2, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=None, base_date_name='event__date_from', minutes=None) )) assert self.order.payment_term_last == datetime.datetime(2017, 5, 1, 23, 59, 59, tzinfo=datetime.timezone.utc) @@ -1379,7 +1379,7 @@ class OrderTestCase(BaseQuotaTestCase): self.op2.subevent = se2 self.op2.save() self.event.settings.set('payment_term_last', RelativeDateWrapper( - RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=None, base_date_name='event__date_from', minutes=None) )) assert self.order.payment_term_last > now() self.op2.subevent = se3 @@ -1395,7 +1395,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=2, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=None, base_date_name='event__date_from', minutes=None) )) assert self.order.ticket_download_date == datetime.datetime(2017, 5, 1, 12, 0, 0, tzinfo=datetime.timezone.utc) @@ -1411,7 +1411,7 @@ class OrderTestCase(BaseQuotaTestCase): self.op2.subevent = se2 self.op2.save() self.event.settings.set('ticket_download_date', RelativeDateWrapper( - RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=None, base_date_name='event__date_from', minutes=None) )) assert self.order.ticket_download_date > now() self.op2.subevent = se3 @@ -1582,13 +1582,13 @@ class OrderTestCase(BaseQuotaTestCase): assert self.order.user_cancel_deadline is None self.event.settings.set('cancel_allow_user_until', RelativeDateWrapper( - RelativeDate(days=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=datetime.time(14, 0, 0), base_date_name='event__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=4, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes=None) + RelativeDate(days=4, time=datetime.time(14, 0, 0), base_date_name='event__date_from', minutes=None) )) self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_cancel_deadline < now() @@ -1607,7 +1607,7 @@ class OrderTestCase(BaseQuotaTestCase): self.op2.save() self.event.settings.set('cancel_allow_user_until', RelativeDateWrapper( - RelativeDate(days=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=datetime.time(14, 0, 0), base_date_name='event__date_from', minutes=None) )) self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_cancel_deadline < now() @@ -2018,13 +2018,13 @@ class OrderTestCase(BaseQuotaTestCase): assert self.order.user_change_deadline is None self.event.settings.set('change_allow_user_until', RelativeDateWrapper( - RelativeDate(days=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=datetime.time(14, 0, 0), base_date_name='event__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=4, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes=None) + RelativeDate(days=4, time=datetime.time(14, 0, 0), base_date_name='event__date_from', minutes=None) )) self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_change_deadline < now() @@ -2046,7 +2046,7 @@ class OrderTestCase(BaseQuotaTestCase): self.op2.save() self.event.settings.set('change_allow_user_until', RelativeDateWrapper( - RelativeDate(days=2, time=datetime.time(14, 0, 0), base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=datetime.time(14, 0, 0), base_date_name='event__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 8f39fc08e..9b58a1d78 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -204,7 +204,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=2, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=None, base_date_name='event__date_from', minutes=None) )) order = _create_order(event, email='dummy@example.org', positions=[], now_dt=today, @@ -245,7 +245,7 @@ def test_expiry_last_relative_subevents(event): ) event.settings.set('payment_term_last', RelativeDateWrapper( - RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=None, base_date_name='event__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 9b88e37a7..a2823b915 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=2, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=None, base_date_name='event__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=2, time=datetime.time(12, 0), base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=datetime.time(12, 0), base_date_name='event__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=3, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=3, time=None, base_date_name='event__date_from', minutes=None) )) assert prov._is_available_by_time(cart_id="123") prov.settings.set('_availability_date', RelativeDateWrapper( - RelativeDate(days=4, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=4, time=None, base_date_name='event__date_from', minutes=None) )) assert not prov._is_available_by_time(cart_id="123") @@ -233,11 +233,11 @@ def test_availability_date_order_relative_subevents(event): prov = DummyPaymentProvider(event) prov.settings.set('_availability_date', RelativeDateWrapper( - RelativeDate(days=3, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=3, time=None, base_date_name='event__date_from', minutes=None) )) assert prov._is_available_by_time(order=order) prov.settings.set('_availability_date', RelativeDateWrapper( - RelativeDate(days=4, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=4, time=None, base_date_name='event__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 3b0cc4f0d..62d812d3f 100644 --- a/src/tests/base/test_reldate.py +++ b/src/tests/base/test_reldate.py @@ -20,6 +20,7 @@ # . # from datetime import datetime, time, timedelta +from pprint import pprint from zoneinfo import ZoneInfo import pytest @@ -56,57 +57,57 @@ def test_absolute_date(event): @pytest.mark.django_db def test_relative_date_without_time(event): - rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='date_from', minutes=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='event__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.to_string() == 'RELDATE/1/-/event__date_from/' + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='event__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' + assert rdw.to_string() == 'RELDATE/1/-/event__date_from/after' @pytest.mark.django_db def test_relative_date_other_base_point(event): with scope(organizer=event.organizer): - rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='presale_start', minutes=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='event__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/' + assert rdw.to_string() == 'RELDATE/1/-/event__presale_start/' # presale_end is unset, defaults to date_from - rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='presale_end', minutes=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='event__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/' + assert rdw.to_string() == 'RELDATE/1/-/event__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=1, time=None, base_date_name='date_from', minutes=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='event__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=1, time=None, base_date_name='presale_start', minutes=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='event__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=1, time=None, base_date_name='presale_end', minutes=None)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='event__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=0, time=None, base_date_name='date_from', minutes=60)) - assert rdw.to_string() == 'RELDATE/minutes/60/date_from/' + rdw = RelativeDateWrapper(RelativeDate(days=0, time=None, base_date_name='event__date_from', minutes=60)) + assert rdw.to_string() == 'RELDATE/minutes/60/event__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' + rdw = RelativeDateWrapper(RelativeDate(days=0, time=None, base_date_name='event__date_from', minutes=60, is_after=True)) + assert rdw.to_string() == 'RELDATE/minutes/60/event__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=1, time=time(8, 5, 13), base_date_name='date_from', minutes=None)) - assert rdw.to_string() == 'RELDATE/1/08:05:13/date_from/' + rdw = RelativeDateWrapper(RelativeDate(days=1, time=time(8, 5, 13), base_date_name='event__date_from', minutes=None)) + assert rdw.to_string() == 'RELDATE/1/08:05:13/event__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' + rdw = RelativeDateWrapper(RelativeDate(days=1, time=time(8, 5, 13), base_date_name='event__date_from', minutes=None, is_after=True)) + assert rdw.to_string() == 'RELDATE/1/08:05:13/event__date_from/after' assert rdw.datetime(event) == datetime(2017, 12, 28, 8, 5, 13, tzinfo=TOKYO) @@ -115,22 +116,22 @@ 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=1, time=time(18, 0, 0), base_date_name='date_from', minutes=None)) - assert rdw.to_string() == 'RELDATE/1/18:00:00/date_from/' + rdw = RelativeDateWrapper(RelativeDate(days=1, time=time(18, 0, 0), base_date_name='event__date_from', minutes=None)) + assert rdw.to_string() == 'RELDATE/1/18:00:00/event__date_from/' assert rdw.datetime(event) == datetime(2020, 3, 28, 18, 0, 0, tzinfo=BERLIN) - 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/' + rdw = RelativeDateWrapper(RelativeDate(days=0, time=time(2, 30, 0), base_date_name='event__date_from', minutes=None)) + assert rdw.to_string() == 'RELDATE/0/02:30:00/event__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=1, time=time(18, 0, 0), base_date_name='date_from', minutes=None)) - assert rdw.to_string() == 'RELDATE/1/18:00:00/date_from/' + rdw = RelativeDateWrapper(RelativeDate(days=1, time=time(18, 0, 0), base_date_name='event__date_from', minutes=None)) + assert rdw.to_string() == 'RELDATE/1/18:00:00/event__date_from/' assert rdw.datetime(event) == datetime(2020, 10, 24, 18, 0, 0, tzinfo=BERLIN) - 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/' + rdw = RelativeDateWrapper(RelativeDate(days=0, time=time(2, 30, 0), base_date_name='event__date_from', minutes=None)) + assert rdw.to_string() == 'RELDATE/0/02:30:00/event__date_from/' assert rdw.datetime(event) == datetime(2020, 10, 25, 2, 30, 0, tzinfo=BERLIN) @@ -140,6 +141,9 @@ def test_unserialize(): assert rdw.data == d rdw = RelativeDateWrapper.from_string('RELDATE/1/-/date_from/') + x = RelativeDate(days=1, time=None, base_date_name='date_from', minutes=None) + pprint(rdw.data) + pprint(x) 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/') @@ -163,13 +167,6 @@ def test_relative_to_order(event): total=23, locale='en' ) - 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)) + rdw = RelativeDateWrapper(RelativeDate(days=1, time=None, base_date_name='order__datetime', minutes=None, is_after=True)) assert rdw.datetime(order).astimezone(TOKYO) == datetime(2020, 3, 30, 18, 0, 0, tzinfo=TOKYO) - assert rdw.to_string() == 'RELDATE/1/-/datetime/after' + assert rdw.to_string() == 'RELDATE/1/-/order__datetime/after' diff --git a/src/tests/base/test_waitinglist.py b/src/tests/base/test_waitinglist.py index df90eaa87..ffa155d9e 100644 --- a/src/tests/base/test_waitinglist.py +++ b/src/tests/base/test_waitinglist.py @@ -235,7 +235,7 @@ class WaitingListTestCase(TestCase): self.event.settings.set('waiting_list_enabled', True) self.event.settings.set('waiting_list_auto', True) self.event.settings.waiting_list_auto_disable = RelativeDateWrapper( - RelativeDate(days=0, time=None, base_date_name='date_from', minutes=20, is_after=False) + RelativeDate(days=0, time=None, base_date_name='event__date_from', minutes=20, is_after=False) ) self.event.save() with scope(organizer=self.o): diff --git a/src/tests/control/test_events.py b/src/tests/control/test_events.py index efd8a64d8..e363c4889 100644 --- a/src/tests/control/test_events.py +++ b/src/tests/control/test_events.py @@ -481,7 +481,7 @@ class EventsTest(SoupTest): 'payment_term_last_0': 'absolute', 'payment_term_last_1': (self.event1.presale_end - datetime.timedelta(1)).strftime('%Y-%m-%d'), 'payment_term_last_2': '0', - 'payment_term_last_3': 'date_from', + 'payment_term_last_3': 'event__date_from', 'tax_rule_payment': 'default', }) assert doc.select('.alert-danger') @@ -496,7 +496,7 @@ class EventsTest(SoupTest): 'payment_term_last_0': 'relative', 'payment_term_last_1': '', 'payment_term_last_2': '10', - 'payment_term_last_3': 'date_from', + 'payment_term_last_3': 'event__date_from', 'tax_rule_payment': 'default', }) assert doc.select('.alert-danger') diff --git a/src/tests/control/test_subevents.py b/src/tests/control/test_subevents.py index 5e58e0ebf..4724c9984 100644 --- a/src/tests/control/test_subevents.py +++ b/src/tests/control/test_subevents.py @@ -230,19 +230,19 @@ class SubEventsTest(SoupTest): 'rel_presale_start_0': 'unset', 'rel_presale_start_1': '', 'rel_presale_start_2': '1', - 'rel_presale_start_3': 'date_from', + 'rel_presale_start_3': 'event__date_from', 'rel_presale_start_4': '', 'rel_presale_start_5': '', - 'rel_presale_start_6': 'date_from', + 'rel_presale_start_6': 'event__date_from', 'rel_presale_start_7': 'before', 'rel_presale_start_8': 'before', 'rel_presale_end_1': '', 'rel_presale_end_0': 'relative', 'rel_presale_end_2': '1', - 'rel_presale_end_3': 'date_from', + 'rel_presale_end_3': 'event__date_from', 'rel_presale_end_4': '13:29:31', 'rel_presale_end_5': '', - 'rel_presale_end_6': 'date_from', + 'rel_presale_end_6': 'event__date_from', 'rel_presale_end_7': 'before', 'rel_presale_end_8': 'before', 'quotas-TOTAL_FORMS': '1', @@ -328,19 +328,19 @@ class SubEventsTest(SoupTest): 'rel_presale_start_0': 'unset', 'rel_presale_start_1': '', 'rel_presale_start_2': '1', - 'rel_presale_start_3': 'date_from', + 'rel_presale_start_3': 'event__date_from', 'rel_presale_start_4': '', 'rel_presale_start_5': '', - 'rel_presale_start_6': 'date_from', + 'rel_presale_start_6': 'event__date_from', 'rel_presale_start_7': 'before', 'rel_presale_start_8': 'before', 'rel_presale_end_1': '', 'rel_presale_end_0': 'relative', 'rel_presale_end_2': '1', - 'rel_presale_end_3': 'date_from', + 'rel_presale_end_3': 'event__date_from', 'rel_presale_end_4': '13:29:31', 'rel_presale_end_5': '', - 'rel_presale_end_6': 'date_from', + 'rel_presale_end_6': 'event__date_from', 'rel_presale_end_7': 'before', 'rel_presale_end_8': 'before', 'quotas-TOTAL_FORMS': '1', @@ -403,19 +403,19 @@ class SubEventsTest(SoupTest): 'rel_presale_start_0': 'unset', 'rel_presale_start_1': '', 'rel_presale_start_2': '1', - 'rel_presale_start_3': 'date_from', + 'rel_presale_start_3': 'event__date_from', 'rel_presale_start_4': '', 'rel_presale_start_5': '', - 'rel_presale_start_6': 'date_from', + 'rel_presale_start_6': 'event__date_from', 'rel_presale_start_7': 'before', 'rel_presale_start_8': 'before', 'rel_presale_end_1': '', 'rel_presale_end_0': 'relative', 'rel_presale_end_2': '1', - 'rel_presale_end_3': 'date_from', + 'rel_presale_end_3': 'event__date_from', 'rel_presale_end_4': '13:29:31', 'rel_presale_end_5': '', - 'rel_presale_end_6': 'date_from', + 'rel_presale_end_6': 'event__date_from', 'rel_presale_end_7': 'before', 'rel_presale_end_8': 'before', 'quotas-TOTAL_FORMS': '1', @@ -479,19 +479,19 @@ class SubEventsTest(SoupTest): 'rel_presale_start_0': 'unset', 'rel_presale_start_1': '', 'rel_presale_start_2': '1', - 'rel_presale_start_3': 'date_from', + 'rel_presale_start_3': 'event__date_from', 'rel_presale_start_4': '', 'rel_presale_start_5': '', - 'rel_presale_start_6': 'date_from', + 'rel_presale_start_6': 'event__date_from', 'rel_presale_start_7': 'before', 'rel_presale_start_8': 'before', 'rel_presale_end_1': '', 'rel_presale_end_0': 'relative', 'rel_presale_end_2': '1', - 'rel_presale_end_3': 'date_from', + 'rel_presale_end_3': 'event__date_from', 'rel_presale_end_4': '02:30:00', 'rel_presale_end_5': '', - 'rel_presale_end_6': 'date_from', + 'rel_presale_end_6': 'event__date_from', 'rel_presale_end_7': 'before', 'rel_presale_end_8': 'before', 'quotas-TOTAL_FORMS': '1', @@ -567,19 +567,19 @@ class SubEventsTest(SoupTest): 'rel_presale_start_0': 'unset', 'rel_presale_start_1': '', 'rel_presale_start_2': '1', - 'rel_presale_start_3': 'date_from', + 'rel_presale_start_3': 'event__date_from', 'rel_presale_start_4': '', 'rel_presale_start_5': '', - 'rel_presale_start_6': 'date_from', + 'rel_presale_start_6': 'event__date_from', 'rel_presale_start_7': 'before', 'rel_presale_start_8': 'before', 'rel_presale_end_1': '', 'rel_presale_end_0': 'relative', 'rel_presale_end_2': '1', - 'rel_presale_end_3': 'date_from', + 'rel_presale_end_3': 'event__date_from', 'rel_presale_end_4': '13:29:31', 'rel_presale_end_5': '', - 'rel_presale_end_6': 'date_from', + 'rel_presale_end_6': 'event__date_from', 'rel_presale_end_7': 'before', 'rel_presale_end_8': 'before', 'quotas-TOTAL_FORMS': '1', @@ -639,19 +639,19 @@ class SubEventsTest(SoupTest): 'rel_presale_start_0': 'unset', 'rel_presale_start_1': '', 'rel_presale_start_2': '1', - 'rel_presale_start_3': 'date_from', + 'rel_presale_start_3': 'event__date_from', 'rel_presale_start_4': '', 'rel_presale_start_5': '', - 'rel_presale_start_6': 'date_from', + 'rel_presale_start_6': 'event__date_from', 'rel_presale_start_7': 'before', 'rel_presale_start_8': 'before', 'rel_presale_end_0': 'unset', 'rel_presale_end_1': '', 'rel_presale_end_2': '1', - 'rel_presale_end_3': 'date_from', + 'rel_presale_end_3': 'event__date_from', 'rel_presale_end_4': '13:29:31', 'rel_presale_end_5': '', - 'rel_presale_end_6': 'date_from', + 'rel_presale_end_6': 'event__date_from', 'rel_presale_end_7': 'before', 'rel_presale_end_8': 'before', 'quotas-TOTAL_FORMS': '1', @@ -711,19 +711,19 @@ class SubEventsTest(SoupTest): 'rel_presale_start_0': 'unset', 'rel_presale_start_1': '', 'rel_presale_start_2': '1', - 'rel_presale_start_3': 'date_from', + 'rel_presale_start_3': 'event__date_from', 'rel_presale_start_4': '', 'rel_presale_start_5': '', - 'rel_presale_start_6': 'date_from', + 'rel_presale_start_6': 'event__date_from', 'rel_presale_start_7': 'before', 'rel_presale_start_8': 'before', 'rel_presale_end_0': 'unset', 'rel_presale_end_1': '', 'rel_presale_end_2': '1', - 'rel_presale_end_3': 'date_from', + 'rel_presale_end_3': 'event__date_from', 'rel_presale_end_4': '13:29:31', 'rel_presale_end_5': '', - 'rel_presale_end_6': 'date_from', + 'rel_presale_end_6': 'event__date_from', 'rel_presale_end_7': 'before', 'rel_presale_end_8': 'before', 'quotas-TOTAL_FORMS': '1', diff --git a/src/tests/presale/test_event.py b/src/tests/presale/test_event.py index 5ffd28db3..9aa6adf0b 100644 --- a/src/tests/presale/test_event.py +++ b/src/tests/presale/test_event.py @@ -1122,7 +1122,7 @@ class WaitingListTest(EventTestMixin, SoupTest): def test_auto_disable(self): self.event.settings.set('waiting_list_enabled', True) self.event.settings.waiting_list_auto_disable = RelativeDateWrapper( - RelativeDate(days=900, time=datetime.time(9, 0, 0), base_date_name='date_from', minutes=None, is_after=False) + RelativeDate(days=900, time=datetime.time(9, 0, 0), base_date_name='event__date_from', minutes=None, is_after=False) ) response = self.client.get( '/%s/%s/' % (self.orga.slug, self.event.slug) diff --git a/src/tests/presale/test_order_change.py b/src/tests/presale/test_order_change.py index 24c110c38..ac9eed6f2 100644 --- a/src/tests/presale/test_order_change.py +++ b/src/tests/presale/test_order_change.py @@ -1485,7 +1485,7 @@ class OrderChangeAddonsTest(BaseOrdersTest): self.order.save() self._subevent_setup() self.event.settings.set('payment_term_last', RelativeDateWrapper( - RelativeDate(days=2, time=None, base_date_name='date_from', minutes=None) + RelativeDate(days=2, time=None, base_date_name='event__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 9606938b8..72f4523d3 100644 --- a/src/tests/presale/test_orders.py +++ b/src/tests/presale/test_orders.py @@ -1076,7 +1076,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=2, time=None, minutes=None + base_date_name='event__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,