diff --git a/src/pretix/control/templates/pretixcontrol/event/live.html b/src/pretix/control/templates/pretixcontrol/event/live.html index 10a718539..571ddff36 100644 --- a/src/pretix/control/templates/pretixcontrol/event/live.html +++ b/src/pretix/control/templates/pretixcontrol/event/live.html @@ -124,6 +124,28 @@
+
+
+ {% trans "Time machine" %} +
+
+
+ {% csrf_token %} + {% bootstrap_form_errors timemachine_form %} + +

{% trans "Test your shop as if it were a different date and time." %}

+ + {% bootstrap_field timemachine_form.now_dt layout="control" show_label=False field_class="col-md-6" %} +
+ +
+
+ +
+
+
diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index 47a1feab7..ccff6fc6f 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -46,6 +46,8 @@ from zoneinfo import ZoneInfo import bleach import qrcode import qrcode.image.svg +from dateutil import parser +from django import forms from django.apps import apps from django.conf import settings from django.contrib import messages @@ -63,7 +65,7 @@ from django.shortcuts import get_object_or_404, redirect from django.urls import reverse from django.utils.functional import cached_property from django.utils.http import url_has_allowed_host_and_scheme -from django.utils.timezone import now +from django.utils.timezone import now, get_current_timezone from django.utils.translation import gettext, gettext_lazy as _, gettext_noop from django.views.generic import FormView, ListView from django.views.generic.base import TemplateView, View @@ -91,9 +93,10 @@ from pretix.control.permissions import EventPermissionRequiredMixin from pretix.control.views.mailsetup import MailSettingsSetupView from pretix.control.views.user import RecentAuthenticationRequiredMixin from pretix.helpers.database import rolledback_transaction -from pretix.multidomain.urlreverse import build_absolute_uri, get_event_domain +from pretix.multidomain.urlreverse import build_absolute_uri, get_event_domain, eventreverse from pretix.plugins.stripe.payment import StripeSettingsHolder from pretix.presale.style import regenerate_css +from ...base.forms.widgets import SplitDateTimePickerWidget from ...base.i18n import language from ...base.models.items import ( @@ -950,18 +953,40 @@ class EventPermissions(EventSettingsViewMixin, EventPermissionRequiredMixin, Tem template_name = 'pretixcontrol/event/permissions.html' +class TimemachineForm(forms.Form): + now_dt = forms.SplitDateTimeField( + label=_('Fake date time'), + widget=SplitDateTimePickerWidget(), + initial=lambda: now().astimezone(get_current_timezone()) + ) + + class EventLive(EventPermissionRequiredMixin, TemplateView): permission = 'can_change_event_settings' template_name = 'pretixcontrol/event/live.html' + def setup(self, request, *args, **kwargs): + super().setup(request, *args, **kwargs) + self.timemachine_form = TimemachineForm( + data=request.method == 'POST' and request.POST or None, + initial={'now_dt':parser.parse(request.session.get('timemachine_now_dt', None))} if request.session.get('timemachine_now_dt', None) else {} + ) + def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) ctx['issues'] = self.request.event.live_issues ctx['actual_orders'] = self.request.event.orders.filter(testmode=False).exists() + ctx['timemachine_form'] = self.timemachine_form return ctx def post(self, request, *args, **kwargs): - if request.POST.get("live") == "true" and not self.request.event.live_issues: + if self.timemachine_form.is_valid(): + request.session['timemachine_now_dt'] = str(self.timemachine_form.cleaned_data['now_dt']) + return redirect(eventreverse(request.event, "presale:event.index")) + elif request.POST.get("timemachine_disable"): + request.session['timemachine_now_dt'] = None + messages.success(self.request, _('Time machine disabled!')) + elif request.POST.get("live") == "true" and not self.request.event.live_issues: with transaction.atomic(): request.event.live = True request.event.save() diff --git a/src/pretix/presale/templates/pretixpresale/event/base.html b/src/pretix/presale/templates/pretixpresale/event/base.html index f65b811ce..bfceac2b0 100644 --- a/src/pretix/presale/templates/pretixpresale/event/base.html +++ b/src/pretix/presale/templates/pretixpresale/event/base.html @@ -36,11 +36,15 @@ {% if request.now_dt_is_fake %}
{% endif %} diff --git a/src/pretix/presale/timemachine.py b/src/pretix/presale/timemachine.py index 1df78a165..800708be3 100644 --- a/src/pretix/presale/timemachine.py +++ b/src/pretix/presale/timemachine.py @@ -46,16 +46,16 @@ class TimeMachineMiddleware: def __call__(self, request): if hasattr(request, 'event') and hasattr(request, '_namespace') and request._namespace == 'presale' and \ - 'time_machine' in request.COOKIES and \ + 'timemachine_now_dt' in request.session and \ request.user.has_event_permission(request.organizer, request.event, 'can_change_event_settings', request): print("setting now_dt from cookie") - request.now_dt = parse(request.COOKIES['time_machine']) + request.now_dt = parse(request.session['timemachine_now_dt']) request.now_dt_is_fake = True else: print("setting now_dt to now", "hasevent?",hasattr(request, 'event') , "namespace?",hasattr(request, '_namespace') and request._namespace, - "cookies?",request.COOKIES) + "cookies?",request.session) request.now_dt = now() request.now_dt_is_fake = False