From a773531003876a96a8259872486e7632ccd787e3 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 24 Aug 2017 12:53:59 +0200 Subject: [PATCH] Statistics: Add subevent selection --- .../fragment_subevent_choice_simple.html | 13 +++++ .../pretixcontrol/orders/overview.html | 15 +---- .../pretixplugins/statistics/index.html | 13 +++++ src/pretix/plugins/statistics/views.py | 57 +++++++++++++------ 4 files changed, 67 insertions(+), 31 deletions(-) create mode 100644 src/pretix/control/templates/pretixcontrol/event/fragment_subevent_choice_simple.html diff --git a/src/pretix/control/templates/pretixcontrol/event/fragment_subevent_choice_simple.html b/src/pretix/control/templates/pretixcontrol/event/fragment_subevent_choice_simple.html new file mode 100644 index 0000000000..a47dff1b84 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/event/fragment_subevent_choice_simple.html @@ -0,0 +1,13 @@ +{% load i18n %} +

+ + +

diff --git a/src/pretix/control/templates/pretixcontrol/orders/overview.html b/src/pretix/control/templates/pretixcontrol/orders/overview.html index bb90cc0f80..6224dccdb6 100644 --- a/src/pretix/control/templates/pretixcontrol/orders/overview.html +++ b/src/pretix/control/templates/pretixcontrol/orders/overview.html @@ -14,20 +14,7 @@

{% trans "Order overview" %}

{% if request.event.has_subevents %}
-

- {% if request.event.has_subevents %} - - {% endif %} - -

+ {% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %}
{% 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 %} +
+ {% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %} +
+ {% 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()