{% if request.event.has_subevents %}
{% endif %}
{% if subevent_warning %}
diff --git a/src/pretix/plugins/statistics/templates/pretixplugins/statistics/index.html b/src/pretix/plugins/statistics/templates/pretixplugins/statistics/index.html
index a87eb49e4a..5435728375 100644
--- a/src/pretix/plugins/statistics/templates/pretixplugins/statistics/index.html
+++ b/src/pretix/plugins/statistics/templates/pretixplugins/statistics/index.html
@@ -6,6 +6,11 @@
{% block title %}{% trans "Statistics" %}{% endblock %}
{% block content %}
{% trans "Statistics" %}
+ {% if request.event.has_subevents %}
+
+ {% endif %}
{% if has_orders %}
@@ -21,6 +26,14 @@
+ {% if request.GET.subevent %}
+
+ {% blocktrans trimmed context "subevent" %}
+ If you select a single date, payment method fees will not be listed here as it might not be clear which
+ date they belong to.
+ {% endblocktrans %}
+
+ {% endif %}
diff --git a/src/pretix/plugins/statistics/views.py b/src/pretix/plugins/statistics/views.py
index cf03f99bb3..ca8e1b8407 100644
--- a/src/pretix/plugins/statistics/views.py
+++ b/src/pretix/plugins/statistics/views.py
@@ -7,7 +7,7 @@ from django.db.models import Count
from django.utils import timezone
from django.views.generic import TemplateView
-from pretix.base.models import Item, Order, OrderPosition
+from pretix.base.models import Item, Order, OrderPosition, SubEvent
from pretix.control.permissions import EventPermissionRequiredMixin
from pretix.control.views import ChartContainingView
from pretix.plugins.statistics.signals import clear_cache
@@ -24,18 +24,30 @@ class IndexView(EventPermissionRequiredMixin, ChartContainingView, TemplateView)
if 'latest' in self.request.GET:
clear_cache(self.request.event)
+ subevent = None
+ if self.request.GET.get("subevent", "") != "" and self.request.event.has_subevents:
+ i = self.request.GET.get("subevent", "")
+ try:
+ subevent = self.request.event.subevents.get(pk=i)
+ except SubEvent.DoesNotExist:
+ pass
+
cache = self.request.event.get_cache()
+ ckey = str(subevent.pk) if subevent else 'all'
# Orders by day
- ctx['obd_data'] = cache.get('statistics_obd_data')
+ ctx['obd_data'] = cache.get('statistics_obd_data' + ckey)
if not ctx['obd_data']:
+ oqs = Order.objects
+ if subevent:
+ oqs = oqs.filter(positions__subevent_id=subevent).distinct()
+
ordered_by_day = {}
- for o in Order.objects.filter(event=self.request.event).values('datetime'):
+ for o in oqs.filter(event=self.request.event).values('datetime'):
day = o['datetime'].astimezone(tz).date()
ordered_by_day[day] = ordered_by_day.get(day, 0) + 1
paid_by_day = {}
- for o in Order.objects.filter(event=self.request.event,
- payment_date__isnull=False).values('payment_date'):
+ for o in oqs.filter(event=self.request.event, payment_date__isnull=False).values('payment_date'):
day = o['payment_date'].astimezone(tz).date()
paid_by_day[day] = paid_by_day.get(day, 0) + 1
@@ -55,21 +67,24 @@ class IndexView(EventPermissionRequiredMixin, ChartContainingView, TemplateView)
})
ctx['obd_data'] = json.dumps(data)
- cache.set('statistics_obd_data', ctx['obd_data'])
+ cache.set('statistics_obd_data' + ckey, ctx['obd_data'])
# Orders by product
- ctx['obp_data'] = cache.get('statistics_obp_data')
+ ctx['obp_data'] = cache.get('statistics_obp_data' + ckey)
if not ctx['obp_data']:
+ opqs = OrderPosition.objects
+ if subevent:
+ opqs = opqs.filter(subevent=subevent)
num_ordered = {
p['item']: p['cnt']
- for p in (OrderPosition.objects
+ for p in (opqs
.filter(order__event=self.request.event)
.values('item')
.annotate(cnt=Count('id')).order_by())
}
num_paid = {
p['item']: p['cnt']
- for p in (OrderPosition.objects
+ for p in (opqs
.filter(order__event=self.request.event, order__status=Order.STATUS_PAID)
.values('item')
.annotate(cnt=Count('id')).order_by())
@@ -85,16 +100,24 @@ class IndexView(EventPermissionRequiredMixin, ChartContainingView, TemplateView)
'paid': num_paid.get(item, 0)
} for item, cnt in num_ordered.items()
])
- cache.set('statistics_obp_data', ctx['obp_data'])
+ cache.set('statistics_obp_data' + ckey, ctx['obp_data'])
- ctx['rev_data'] = cache.get('statistics_rev_data')
+ ctx['rev_data'] = cache.get('statistics_rev_data' + ckey)
if not ctx['rev_data']:
rev_by_day = {}
- for o in Order.objects.filter(event=self.request.event,
- status=Order.STATUS_PAID,
- payment_date__isnull=False).values('payment_date', 'total'):
- day = o['payment_date'].astimezone(tz).date()
- rev_by_day[day] = rev_by_day.get(day, 0) + o['total']
+ if subevent:
+ for o in OrderPosition.objects.filter(order__event=self.request.event,
+ subevent=subevent,
+ order__status=Order.STATUS_PAID,
+ order__payment_date__isnull=False).values('order__payment_date', 'price'):
+ day = o['order__payment_date'].astimezone(tz).date()
+ rev_by_day[day] = rev_by_day.get(day, 0) + o['price']
+ else:
+ for o in Order.objects.filter(event=self.request.event,
+ status=Order.STATUS_PAID,
+ payment_date__isnull=False).values('payment_date', 'total'):
+ day = o['payment_date'].astimezone(tz).date()
+ rev_by_day[day] = rev_by_day.get(day, 0) + o['total']
data = []
total = 0
@@ -109,7 +132,7 @@ class IndexView(EventPermissionRequiredMixin, ChartContainingView, TemplateView)
'revenue': round(total, 2),
})
ctx['rev_data'] = json.dumps(data)
- cache.set('statistics_rev_data', ctx['rev_data'])
+ cache.set('statistics_rev_data' + ckey, ctx['rev_data'])
ctx['has_orders'] = self.request.event.orders.exists()