diff --git a/src/pretix/control/forms/subevents.py b/src/pretix/control/forms/subevents.py index 389894ec0..db5afb264 100644 --- a/src/pretix/control/forms/subevents.py +++ b/src/pretix/control/forms/subevents.py @@ -2,7 +2,6 @@ from datetime import timedelta from urllib.parse import urlencode from django import forms -from django.core.exceptions import ValidationError from django.forms import formset_factory from django.urls import reverse from django.utils.dates import MONTHS, WEEKDAYS @@ -382,12 +381,6 @@ class TimeForm(forms.Form): required=False ) - def clean(self): - d = super().clean() - if d.get('time_from') and d.get('time_to') and d['time_from'] > d['time_to']: - raise ValidationError({'time_to': _('The end of the event has to be later than its start.')}) - return d - TimeFormSet = formset_factory( TimeForm, diff --git a/src/pretix/control/views/subevents.py b/src/pretix/control/views/subevents.py index 12dd2ea39..7ee7a43a9 100644 --- a/src/pretix/control/views/subevents.py +++ b/src/pretix/control/views/subevents.py @@ -1,5 +1,5 @@ import copy -from datetime import datetime +from datetime import datetime, timedelta from dateutil.rrule import DAILY, MONTHLY, WEEKLY, YEARLY, rrule, rruleset from django.contrib import messages @@ -739,11 +739,15 @@ class SubEventBulkCreate(SubEventEditorMixin, EventPermissionRequiredMixin, Crea se = copy.copy(form.instance) se.date_from = make_aware(datetime.combine(rdate, t['time_from']), tz) - se.date_to = ( - make_aware(datetime.combine(rdate, t['time_to']), tz) - if t.get('time_to') - else None - ) + + if t.get('time_to'): + se.date_to = ( + make_aware(datetime.combine(rdate, t['time_to']), tz) + if t.get('time_to') > t.get('time_from') + else make_aware(datetime.combine(rdate + timedelta(days=1), t['time_to']), tz) + ) + else: + se.date_to = None se.date_admission = ( make_aware(datetime.combine(rdate, t['time_admission']), tz) if t.get('time_admission') diff --git a/src/pretix/presale/views/organizer.py b/src/pretix/presale/views/organizer.py index 3f2fce244..8f5fc6cf5 100644 --- a/src/pretix/presale/views/organizer.py +++ b/src/pretix/presale/views/organizer.py @@ -324,7 +324,13 @@ def add_events_for_days(request, baseqs, before, after, ebd, timezones): 'event': event, 'continued': not first, 'time': datetime_from.time().replace(tzinfo=None) if first and event.settings.show_times else None, - 'time_end': datetime_to.time().replace(tzinfo=None) if date_to == date_from and event.settings.show_times else None, + 'time_end': ( + datetime_to.time().replace(tzinfo=None) + if (date_to == date_from or ( + date_to == date_from + timedelta(days=1) and date_to.time() < date_from.time() + )) and event.settings.show_times + else None, + ), 'url': eventreverse(event, 'presale:event.index'), 'timezone': event.settings.timezone, }) @@ -387,7 +393,13 @@ def add_subevents_for_days(qs, before, after, ebd, timezones, event=None, cart_n 'continued': not first, 'timezone': settings.timezone, 'time': datetime_from.time().replace(tzinfo=None) if first and settings.show_times else None, - 'time_end': datetime_to.time().replace(tzinfo=None) if date_to == date_from and settings.show_times else None, + 'time_end': ( + datetime_to.time().replace(tzinfo=None) + if (date_to == date_from or ( + date_to == date_from + timedelta(days=1) and date_to.time() < date_from.time() + )) and event.settings.show_times + else None, + ), 'event': se, 'url': eventreverse(se.event, 'presale:event.index', kwargs=kwargs) })