diff --git a/src/pretix/control/forms/subevents.py b/src/pretix/control/forms/subevents.py index 4b2fb3914..ef741e675 100644 --- a/src/pretix/control/forms/subevents.py +++ b/src/pretix/control/forms/subevents.py @@ -23,6 +23,7 @@ from datetime import datetime from urllib.parse import urlencode from django import forms +from django.core.exceptions import ValidationError from django.forms import formset_factory from django.forms.utils import ErrorDict from django.urls import reverse @@ -273,6 +274,13 @@ class SubEventItemForm(SubEventItemOrVariationFormMixin, forms.ModelForm): 'available_until': SplitDateTimeField, } + def clean(self): + d = super().clean() + if d.get('available_from') and d.get('available_until'): + if d.get('available_from') > d.get('available_until'): + raise ValidationError(_('The end of availability should be after the start of availability.')) + return d + class SubEventItemVariationForm(SubEventItemOrVariationFormMixin, forms.ModelForm): def __init__(self, *args, **kwargs): @@ -293,6 +301,13 @@ class SubEventItemVariationForm(SubEventItemOrVariationFormMixin, forms.ModelFor 'available_until': SplitDateTimeField, } + def clean(self): + d = super().clean() + if d.get('available_from') and d.get('available_until'): + if d.get('available_from') > d.get('available_until'): + raise ValidationError(_('The end of availability should be after the start of availability.')) + return d + class BulkSubEventItemForm(SubEventItemForm): rel_available_from = RelativeDateTimeField( diff --git a/src/pretix/control/templates/pretixcontrol/subevents/bulk.html b/src/pretix/control/templates/pretixcontrol/subevents/bulk.html index e113b6abf..6b58feb5a 100644 --- a/src/pretix/control/templates/pretixcontrol/subevents/bulk.html +++ b/src/pretix/control/templates/pretixcontrol/subevents/bulk.html @@ -487,6 +487,7 @@ {% trans "These settings are optional, if you leave them empty, the default values from the product settings will be used." %}
{% for f in itemvar_forms %} + {% bootstrap_form_errors f %}