From 00783f514695ab08679d11a3abae8afe0b311190 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 27 Jul 2026 21:28:53 +0200 Subject: [PATCH] Replace quota widgets --- .../event/dashboard_partial_quotas.html | 4 ++ .../templates/pretixcontrol/event/index.html | 25 +++++++++- .../templates/pretixcontrol/events/index.html | 2 +- .../pretixcontrol/fragment_quota_box.html | 18 ++++--- .../fragment_quota_box_paid.html | 17 ------- .../pretixcontrol/subevents/index.html | 2 +- src/pretix/control/urls.py | 1 + src/pretix/control/views/dashboards.py | 50 +++++++------------ src/pretix/control/views/main.py | 16 +----- src/pretix/control/views/subevents.py | 15 +----- src/pretix/control/views/utils.py | 22 ++++++++ .../static/pretixcontrol/scss/_dashboard.scss | 8 +-- .../static/pretixcontrol/scss/main.scss | 35 +++++++++++-- 13 files changed, 120 insertions(+), 95 deletions(-) create mode 100644 src/pretix/control/templates/pretixcontrol/event/dashboard_partial_quotas.html delete mode 100644 src/pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html create mode 100644 src/pretix/control/views/utils.py diff --git a/src/pretix/control/templates/pretixcontrol/event/dashboard_partial_quotas.html b/src/pretix/control/templates/pretixcontrol/event/dashboard_partial_quotas.html new file mode 100644 index 000000000..ff10069c7 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/event/dashboard_partial_quotas.html @@ -0,0 +1,4 @@ +{% load i18n %} +{% for q in quotas %} + {% include "pretixcontrol/fragment_quota_box.html" with quota=q full=1 %} +{% endfor %} diff --git a/src/pretix/control/templates/pretixcontrol/event/index.html b/src/pretix/control/templates/pretixcontrol/event/index.html index dc02754eb..dc3af2df7 100644 --- a/src/pretix/control/templates/pretixcontrol/event/index.html +++ b/src/pretix/control/templates/pretixcontrol/event/index.html @@ -75,8 +75,30 @@ {% if not request.event.has_subevents %} {% include "pretixcontrol/event/fragment_timeline.html" %} +
+
+
+ {% for i in "12" %} + + + + +
+
+ +
+
+ {% endfor %} +
+
+
+ Checkin-lists +
+
+ {% endif %} - {% if widgets_override %} + {% if widgets_override and 0 %} {{ widgets_override|safe }} {% endif %} {% if widgets %} @@ -112,7 +134,6 @@ {% endfor %} {% endif %} -

 

{% if "event.orders:read" in request.eventpermset or "event.orders:write" in request.eventpermset or "event.settings.general:write" in request.eventpermset or "event.items:write" in request.eventpermset %}
diff --git a/src/pretix/control/templates/pretixcontrol/events/index.html b/src/pretix/control/templates/pretixcontrol/events/index.html index 4ef033f7f..067b7afaa 100644 --- a/src/pretix/control/templates/pretixcontrol/events/index.html +++ b/src/pretix/control/templates/pretixcontrol/events/index.html @@ -151,7 +151,7 @@ {% for q in e.first_quotas|slice:":3" %} - {% include "pretixcontrol/fragment_quota_box_paid.html" with quota=q %} + {% include "pretixcontrol/fragment_quota_box.html" with quota=q %} {% endfor %} {% if e.first_quotas|length > 3 %} {% blocktrans with date=q.cached_availability_time|date:"SHORT_DATETIME_FORMAT" %}Numbers as of {{ date }}{% endblocktrans %}"> +{% blocktrans with num=q.cached_avail.1 %}Currently available: {{ num }}{% endblocktrans %}{% endif %}" + href="{% url "control:event.items.quotas.show" event=q.event.slug organizer=q.event.organizer.slug quota=q.pk %}"> + {% if full %} + {{ q.name }} + {% endif %} {% if q.size|default_if_none:"NONE" == "NONE" %}
-
-
{% else %}
-
+
+
+
{% endif %}
- {{ q.cached_avail.1|default_if_none:"∞" }} / {{ q.size|default_if_none:"∞" }} + {{ q.cached_availability_paid_orders|default_if_none:"?" }} / {{ q.size|default_if_none:"∞" }}
-
+
diff --git a/src/pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html b/src/pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html deleted file mode 100644 index 1878965a5..000000000 --- a/src/pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html +++ /dev/null @@ -1,17 +0,0 @@ -{% load i18n %} -{% blocktrans with num=q.cached_avail.1 %}Currently available: {{ num }}{% endblocktrans %}{% endif %}" - href="{% url "control:event.items.quotas.show" event=q.event.slug organizer=q.event.organizer.slug quota=q.pk %}"> - {% if q.size|default_if_none:"NONE" == "NONE" %} -
-
- {% else %} -
-
-
-
- {% endif %} -
- {{ q.cached_availability_paid_orders|default_if_none:"?" }} / {{ q.size|default_if_none:"∞" }} -
-
diff --git a/src/pretix/control/templates/pretixcontrol/subevents/index.html b/src/pretix/control/templates/pretixcontrol/subevents/index.html index 60c235dcb..377c395ba 100644 --- a/src/pretix/control/templates/pretixcontrol/subevents/index.html +++ b/src/pretix/control/templates/pretixcontrol/subevents/index.html @@ -155,7 +155,7 @@ {% for q in s.first_quotas|slice:":3" %} - {% include "pretixcontrol/fragment_quota_box_paid.html" with quota=q %} + {% include "pretixcontrol/fragment_quota_box.html" with quota=q %} {% endfor %} {% if s.first_quotas|length > 3 %} 0 else 100 - ) + prepare_quotas_for_boxes(quotas) return ctx @cached_property diff --git a/src/pretix/control/views/subevents.py b/src/pretix/control/views/subevents.py index ae11b77c5..12022c78c 100644 --- a/src/pretix/control/views/subevents.py +++ b/src/pretix/control/views/subevents.py @@ -84,6 +84,7 @@ from pretix.control.permissions import EventPermissionRequiredMixin from pretix.control.signals import subevent_forms from pretix.control.views import PaginationMixin from pretix.control.views.event import MetaDataEditorMixin +from pretix.control.views.utils import prepare_quotas_for_boxes from pretix.helpers import GroupConcat from pretix.helpers.compat import CompatDeleteView from pretix.helpers.i18n import get_format_without_seconds @@ -145,19 +146,7 @@ class SubEventList(EventPermissionRequiredMixin, PaginationMixin, SubEventQueryM s.first_quotas = s.first_quotas[:4] quotas += list(s.first_quotas) - qa = QuotaAvailability(early_out=False) - for q in quotas: - qa.queue(q) - qa.compute() - - for q in quotas: - q.cached_avail = qa.results[q] - q.cached_availability_paid_orders = qa.count_paid_orders.get(q, 0) - if q.size is not None: - q.percent_paid = min( - 100, - round(q.cached_availability_paid_orders / q.size * 100) if q.size > 0 else 100 - ) + prepare_quotas_for_boxes(quotas) return ctx diff --git a/src/pretix/control/views/utils.py b/src/pretix/control/views/utils.py new file mode 100644 index 000000000..5f3968132 --- /dev/null +++ b/src/pretix/control/views/utils.py @@ -0,0 +1,22 @@ +from pretix.base.services.quotas import QuotaAvailability + + +def prepare_quotas_for_boxes(quotas): + qa = QuotaAvailability(early_out=False) + for q in quotas: + qa.queue(q) + qa.compute() + + for q in quotas: + q.cached_avail = qa.results[q] + q.cached_availability_paid_orders = qa.count_paid_orders.get(q, 0) + if q.size is not None: + other_blocked = q.size - q.cached_availability_paid_orders - q.cached_avail[1] + q.percent_paid = min( + 100, + round(q.cached_availability_paid_orders / q.size * 100) if q.size > 0 else 100 + ) + q.percent_other = min( + 100, + round(other_blocked / q.size * 100) if q.size > 0 else 100 + ) diff --git a/src/pretix/static/pretixcontrol/scss/_dashboard.scss b/src/pretix/static/pretixcontrol/scss/_dashboard.scss index cf0446f0c..b20aea5b6 100644 --- a/src/pretix/static/pretixcontrol/scss/_dashboard.scss +++ b/src/pretix/static/pretixcontrol/scss/_dashboard.scss @@ -20,10 +20,7 @@ } .loading-mock { - display: inline-block; background: #eee; - border-radius: $border-radius-base; - height: 1em; animation: loading-mock-pulse 3s infinite; background-size: 200% 100%; background-image: linear-gradient( @@ -43,6 +40,11 @@ width: 200px; } } +span.loading-mock { + display: inline-block; + border-radius: $border-radius-base; + height: 1em; +} .dashboard { diff --git a/src/pretix/static/pretixcontrol/scss/main.scss b/src/pretix/static/pretixcontrol/scss/main.scss index 955fd7059..587dd3629 100644 --- a/src/pretix/static/pretixcontrol/scss/main.scss +++ b/src/pretix/static/pretixcontrol/scss/main.scss @@ -530,18 +530,45 @@ table td ul:last-child { display: inline-block; vertical-align: top; width: 50px; + text-align: center; + margin-bottom: 5px; + strong { + display: block; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } .progress { - height: 7px; + height: 10px; margin-bottom: 2px; } .numbers { font-size: 10px; color: $text-muted; display: block; - text-align: center; } - &.availability .progress-bar-success { - background: var(--pretix-brand-success-lighten-20); + .progress-bar-unconfirmed { + opacity: 0.7; + } + + &.quotabox-full { + width: 100px; + padding: 0 2px; + + strong { + font-size: 12px; + } + + .progress { + height: 16px; + width: 80px; + margin: auto; + } + + .numbers { + font-size: 12px; + } } } .quotabox-more {