diff --git a/src/pretix/base/reldate.py b/src/pretix/base/reldate.py index 2f8289f89..c945a9377 100644 --- a/src/pretix/base/reldate.py +++ b/src/pretix/base/reldate.py @@ -33,6 +33,27 @@ class RelativeDateWrapper: def __init__(self, data: Union[datetime.datetime, RelativeDate]): self.data = data + def date(self, event) -> datetime.datetime: + from .models import SubEvent + + if isinstance(self.data, datetime.date): + return self.data + elif isinstance(self.data, datetime.datetime): + return self.data.date() + else: + tz = pytz.timezone(event.settings.timezone) + if isinstance(event, SubEvent): + base_date = ( + getattr(event, self.data.base_date_name) + or getattr(event.event, self.data.base_date_name) + or event.date_from + ) + 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) + return new_date.date() + def datetime(self, event) -> datetime.datetime: from .models import SubEvent diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index b6aef4925..91ffa9e81 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -381,9 +381,8 @@ class PaymentSettingsForm(SettingsForm): def clean(self): cleaned_data = super().clean() payment_term_last = cleaned_data.get('payment_term_last') - print(payment_term_last) if payment_term_last and self.obj.presale_end: - if payment_term_last.datetime(self.obj).date() < self.obj.presale_end.date(): + if payment_term_last.date(self.obj) < self.obj.presale_end.date(): self.add_error( 'payment_term_last', _('The last payment date cannot be before the end of presale.'), diff --git a/src/tests/control/test_events.py b/src/tests/control/test_events.py index cc920e067..14b900f5b 100644 --- a/src/tests/control/test_events.py +++ b/src/tests/control/test_events.py @@ -178,6 +178,24 @@ class EventsTest(SoupTest): self.event1.presale_end = None self.event1.save(update_fields=['presale_end']) + def test_payment_settings_relative_date_payment_after_presale_end(self): + self.event1.presale_end = self.event1.date_from - datetime.timedelta(days=5) + self.event1.save(update_fields=['presale_end']) + doc = self.post_doc('/control/event/%s/%s/settings/payment' % (self.orga1.slug, self.event1.slug), { + 'payment_banktransfer__enabled': 'true', + 'payment_banktransfer__fee_abs': '12.23', + 'payment_banktransfer_bank_details_0': 'Test', + 'settings-payment_term_days': '2', + 'settings-payment_term_last_0': 'relative', + 'settings-payment_term_last_1': '', + 'settings-payment_term_last_2': '10', + 'settings-payment_term_last_3': 'date_from', + 'settings-tax_rate_default': '19.00', + }) + assert doc.select('.alert-danger') + self.event1.presale_end = None + self.event1.save(update_fields=['presale_end']) + def test_invoice_settings(self): doc = self.get_doc('/control/event/%s/%s/settings/invoice' % (self.orga1.slug, self.event1.slug)) data = extract_form_fields(doc.select("form")[0])