From 0254788124442bb89124f7fcfcb2da5dcb966146 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 24 Jul 2026 19:27:41 +0200 Subject: [PATCH] Event-dashboard: Lazy-load warnings I don't like this, it's not pretty, but we have no quick way of fixing the overpaid orders check otherwise and a slow query on the event dashboard feels really bad, because even if you don't wanna see the dashboard ou are always going through it in navigation and that can get very annoying very quickly. --- ...embed.html => dashboard_partial_logs.html} | 0 .../event/dashboard_partial_warnings.html | 48 +++++++++++++ .../templates/pretixcontrol/event/index.html | 59 +-------------- src/pretix/control/urls.py | 3 +- src/pretix/control/views/dashboards.py | 72 +++++++++++-------- .../static/pretixcontrol/js/ui/dashboard.js | 10 ++- 6 files changed, 101 insertions(+), 91 deletions(-) rename src/pretix/control/templates/pretixcontrol/event/{logs_embed.html => dashboard_partial_logs.html} (100%) create mode 100644 src/pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html diff --git a/src/pretix/control/templates/pretixcontrol/event/logs_embed.html b/src/pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html similarity index 100% rename from src/pretix/control/templates/pretixcontrol/event/logs_embed.html rename to src/pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html diff --git a/src/pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html b/src/pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html new file mode 100644 index 0000000000..c3585e76b5 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html @@ -0,0 +1,48 @@ +{% load i18n %} +{% if has_pending_refunds %} +
+ {% blocktrans trimmed %} + This event contains pending refunds that you should take care of. + {% endblocktrans %} + {% trans "Show pending refunds" %} +
+{% endif %} +{% if has_cancellation_requests %} +
+ {% blocktrans trimmed %} + This event contains requested cancellations that you should take care of. + {% endblocktrans %} + {% trans "Show orders requesting cancellation" %} +
+{% endif %} +{% if has_pending_approvals %} +
+ {% blocktrans trimmed %} + This event contains pending approvals that you should take care of. + {% endblocktrans %} + {% trans "Show orders pending approval" %} +
+{% endif %} +{% if has_pending_orders_with_full_payment %} +
+ {% blocktrans trimmed %} + This event contains fully paid orders that are not marked as paid, probably + because no quota was left at the time their payment arrived. You should review the cases and consider + either refunding the customer or creating more space. + {% endblocktrans %} + {% trans "Show affected orders" %} +
+{% endif %} +{% if has_sync_problems %} +
+ {% blocktrans trimmed %} + Orders in this event could not be synced to an external system as configured. + {% endblocktrans %} + {% trans "Show sync problems" %} +
+{% endif %} diff --git a/src/pretix/control/templates/pretixcontrol/event/index.html b/src/pretix/control/templates/pretixcontrol/event/index.html index a8d04040de..42941b2349 100644 --- a/src/pretix/control/templates/pretixcontrol/event/index.html +++ b/src/pretix/control/templates/pretixcontrol/event/index.html @@ -14,6 +14,7 @@ {% else %} {{ request.event.get_date_range_display }} {% endif %} +
@@ -31,63 +32,7 @@
- {% if has_overpaid_orders %} -
- {% blocktrans trimmed %} - This event contains overpaid orders, for example due to duplicate payment attempts. - You should review the cases and consider refunding the overpaid amount to the user. - {% endblocktrans %} - {% trans "Show overpaid orders" %} -
- {% endif %} - {% if has_pending_refunds %} -
- {% blocktrans trimmed %} - This event contains pending refunds that you should take care of. - {% endblocktrans %} - {% trans "Show pending refunds" %} -
- {% endif %} - {% if has_cancellation_requests %} -
- {% blocktrans trimmed %} - This event contains requested cancellations that you should take care of. - {% endblocktrans %} - {% trans "Show orders requesting cancellation" %} -
- {% endif %} - {% if has_pending_approvals %} -
- {% blocktrans trimmed %} - This event contains pending approvals that you should take care of. - {% endblocktrans %} - {% trans "Show orders pending approval" %} -
- {% endif %} - {% if has_pending_orders_with_full_payment %} -
- {% blocktrans trimmed %} - This event contains fully paid orders that are not marked as paid, probably - because no quota was left at the time their payment arrived. You should review the cases and consider - either refunding the customer or creating more space. - {% endblocktrans %} - {% trans "Show affected orders" %} -
- {% endif %} - {% if has_sync_problems %} -
- {% blocktrans trimmed %} - Orders in this event could not be synced to an external system as configured. - {% endblocktrans %} - {% trans "Show sync problems" %} -
- {% endif %} +
{% eventsignal request.event "pretix.control.signals.event_dashboard_top" request=request %} {% if request.event.has_subevents %} diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index edc7edf82f..c59aa26c34 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -273,7 +273,8 @@ urlpatterns = [ re_path(r'^$', dashboards.event_index, name='event.index'), re_path(r'^qrcode.(?P(png|jpeg|gif|svg))$', event.EventQRCode.as_view(), name='event.qrcode'), re_path(r'^widgets.json$', dashboards.event_index_widgets_lazy, name='event.index.widgets'), - re_path(r'^logs/embed$', dashboards.event_index_log_lazy, name='event.index.logs'), + re_path(r'^dashboard/partials/logs$', dashboards.event_index_log_lazy, name='event.index.logs'), + re_path(r'^dashboard/partials/warnings$', dashboards.event_index_warnings_lazy, name='event.index.warnings'), re_path(r'^live/$', event.EventLive.as_view(), name='event.live'), re_path(r'^transfer_session/$', event.EventTransferSession.as_view(), name='event.transfer_session'), re_path(r'^logs/$', event.EventLog.as_view(), name='event.log'), diff --git a/src/pretix/control/views/dashboards.py b/src/pretix/control/views/dashboards.py index eaa3ca2d19..cfa98a5622 100644 --- a/src/pretix/control/views/dashboards.py +++ b/src/pretix/control/views/dashboards.py @@ -379,6 +379,42 @@ def event_index(request, organizer, event): 'comment_form': CommentForm(initial={'comment': request.event.comment}, readonly=not can_change_event_settings), } + ctx['timeline'] = [ + { + 'date': t.datetime.astimezone(request.event.timezone).date(), + 'entry': t, + 'time': t.datetime.astimezone(request.event.timezone) + } + for t in timeline_for_event(request.event, subevent) + ] + ctx['today'] = now().astimezone(request.event.timezone).date() + ctx['nearly_now'] = now().astimezone(request.event.timezone) - timedelta(seconds=20) + resp = render(request, 'pretixcontrol/event/index.html', ctx) + return resp + + +def event_index_widgets_lazy(request, organizer, event): + subevent = None + if request.GET.get("subevent", "") != "" and request.event.has_subevents: + i = request.GET.get("subevent", "") + try: + subevent = request.event.subevents.get(pk=i) + except SubEvent.DoesNotExist: + pass + + widgets = [] + for r, result in event_dashboard_widgets.send(sender=request.event, subevent=subevent, lazy=False): + widgets.extend(result) + + return build_json_response(widgets) + + +def event_index_warnings_lazy(request, organizer, event): + can_view_orders = request.user.has_event_permission(request.organizer, request.event, 'event.orders:read', + request=request) + can_change_event_settings = request.user.has_event_permission(request.organizer, request.event, + 'event.settings.general:write', request=request) + ctx = {} ctx['has_overpaid_orders'] = can_view_orders and Order.annotate_overpayments(request.event.orders).filter( Q(~Q(status=Order.STATUS_CANCELED) & Q(pending_sum_t__lt=0)) | Q(Q(status=Order.STATUS_CANCELED) & Q(pending_sum_rc__lt=0)) @@ -402,35 +438,11 @@ def event_index(request, organizer, event): | Q(failed_attempts__gt=0) ).exists() - ctx['timeline'] = [ - { - 'date': t.datetime.astimezone(request.event.timezone).date(), - 'entry': t, - 'time': t.datetime.astimezone(request.event.timezone) - } - for t in timeline_for_event(request.event, subevent) - ] - ctx['today'] = now().astimezone(request.event.timezone).date() - ctx['nearly_now'] = now().astimezone(request.event.timezone) - timedelta(seconds=20) - resp = render(request, 'pretixcontrol/event/index.html', ctx) - # resp['Content-Security-Policy'] = "style-src 'unsafe-inline'" - return resp - - -def event_index_widgets_lazy(request, organizer, event): - subevent = None - if request.GET.get("subevent", "") != "" and request.event.has_subevents: - i = request.GET.get("subevent", "") - try: - subevent = request.event.subevents.get(pk=i) - except SubEvent.DoesNotExist: - pass - - widgets = [] - for r, result in event_dashboard_widgets.send(sender=request.event, subevent=subevent, lazy=False): - widgets.extend(result) - - return build_json_response(widgets) + return render( + request, + 'pretixcontrol/event/dashboard_partial_warnings.html', + ctx + ) def event_index_log_lazy(request, organizer, event): @@ -465,7 +477,7 @@ def event_index_log_lazy(request, organizer, event): return render( request, - 'pretixcontrol/event/logs_embed.html', + 'pretixcontrol/event/dashboard_partial_logs.html', { 'logs': qs[:5] } diff --git a/src/pretix/static/pretixcontrol/js/ui/dashboard.js b/src/pretix/static/pretixcontrol/js/ui/dashboard.js index 22c1b95931..b0b95ae553 100644 --- a/src/pretix/static/pretixcontrol/js/ui/dashboard.js +++ b/src/pretix/static/pretixcontrol/js/ui/dashboard.js @@ -15,8 +15,12 @@ $(function () { if ($("#logs_target").length == 0) { return; } - $.get("logs/embed", function (data) { - $("#logs_target").html(data) - add_log_expand_handlers($("#logs_target")) + $.get("dashboard/partials/logs", function (data) { + $("#logs_target").html(data) + add_log_expand_handlers($("#logs_target")) + }); + $.get("dashboard/partials/warnings", function (data) { + $("#warnings_loading").remove() + $("#warnings_target").html(data) }); });