Fix crash on too old time machine date (Z#23245824) (#6599)

* Fix crash on too old time machine date (Z#23245824)

dateutil.parser seems to reject dates with second-precision timezone-offsets, which datetime produces for some dates aroung the year 200. datetime.fromisoformat has no problem parsing them

* Review comments

* Add min date
This commit is contained in:
pajowu
2026-09-28 17:28:26 +02:00
committed by GitHub
parent 2ebdd048c2
commit c875d758f9
2 changed files with 12 additions and 9 deletions
+2 -2
View File
@@ -21,8 +21,8 @@
#
import contextvars
from contextlib import contextmanager
from datetime import datetime
from dateutil.parser import parse
from django.utils.timezone import now
from pretix.base.auth import has_event_access_permission
@@ -34,7 +34,7 @@ timemachine_now_var = contextvars.ContextVar('timemachine_now', default=None)
def time_machine_now_assigned_from_request(request):
if hasattr(request, 'event') and f'timemachine_now_dt:{request.event.pk}' in request.session and \
request.event.testmode and has_event_access_permission(request):
request.now_dt = parse(request.session[f'timemachine_now_dt:{request.event.pk}'])
request.now_dt = datetime.fromisoformat(request.session[f'timemachine_now_dt:{request.event.pk}'])
request.now_dt_is_fake = True
else:
request.now_dt = now()
+10 -7
View File
@@ -41,7 +41,6 @@ from importlib import import_module
from urllib.parse import urlencode
import isoweek
from dateutil import parser
from django import forms
from django.conf import settings
from django.contrib import messages
@@ -589,7 +588,9 @@ class EventAuth(View):
class TimemachineForm(forms.Form):
now_dt = forms.SplitDateTimeField(
label=_('Fake date time'),
widget=SplitDateTimePickerWidget(),
widget=SplitDateTimePickerWidget(
min_date=date(2000, 1, 1),
),
initial=lambda: now().astimezone(get_current_timezone()),
)
@@ -603,12 +604,14 @@ class EventTimeMachine(EventViewMixin, TemplateView):
raise PermissionDenied(_('You are not allowed to access time machine mode.'))
if not request.event.testmode:
raise PermissionDenied(_('This feature is only available in test mode.'))
initial = {}
if now_dt := request.session.get(f'timemachine_now_dt:{request.event.pk}', None):
initial['now_dt'] = datetime.fromisoformat(now_dt)
self.timemachine_form = TimemachineForm(
data=request.method == 'POST' and request.POST or None,
initial=(
{'now_dt': parser.parse(request.session.get(f'timemachine_now_dt:{request.event.pk}', None))}
if request.session.get(f'timemachine_now_dt:{request.event.pk}', None) else {}
)
initial=initial
)
def get_context_data(self, **kwargs):
@@ -622,7 +625,7 @@ class EventTimeMachine(EventViewMixin, TemplateView):
messages.success(self.request, _('Time machine disabled!'))
return redirect(self.get_success_url())
elif self.timemachine_form.is_valid():
request.session[f'timemachine_now_dt:{request.event.pk}'] = str(self.timemachine_form.cleaned_data['now_dt'])
request.session[f'timemachine_now_dt:{request.event.pk}'] = self.timemachine_form.cleaned_data['now_dt'].isoformat()
return redirect(eventreverse(request.event, "presale:event.index"))
else:
return self.get(request)