forked from CGM_Public/pretix_original
Statistics: Add subevent selection
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
{% load i18n %}
|
||||
<p>
|
||||
<select name="subevent" class="form-control">
|
||||
<option value="">{% trans "All dates" context "subevent" %}</option>
|
||||
{% for se in request.event.subevents.all %}
|
||||
<option value="{{ se.id }}"
|
||||
{% if request.GET.subevent|add:0 == se.id %}selected="selected"{% endif %}>
|
||||
{{ se.name }} – {{ se.get_date_range_display }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<button class="btn btn-primary" type="submit">{% trans "Filter" %}</button>
|
||||
</p>
|
||||
@@ -14,20 +14,7 @@
|
||||
<h1>{% trans "Order overview" %}</h1>
|
||||
{% if request.event.has_subevents %}
|
||||
<form class="form-inline helper-display-inline" action="" method="get">
|
||||
<p>
|
||||
{% if request.event.has_subevents %}
|
||||
<select name="subevent" class="form-control">
|
||||
<option value="">{% trans "All dates" context "subevent" %}</option>
|
||||
{% for se in request.event.subevents.all %}
|
||||
<option value="{{ se.id }}"
|
||||
{% if request.GET.subevent|add:0 == se.id %}selected="selected"{% endif %}>
|
||||
{{ se.name }} – {{ se.get_date_range_display }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
{% endif %}
|
||||
<button class="btn btn-primary" type="submit">{% trans "Filter" %}</button>
|
||||
</p>
|
||||
{% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %}
|
||||
</form>
|
||||
{% endif %}
|
||||
{% if subevent_warning %}
|
||||
|
||||
@@ -6,6 +6,11 @@
|
||||
{% block title %}{% trans "Statistics" %}{% endblock %}
|
||||
{% block content %}
|
||||
<h1>{% trans "Statistics" %}</h1>
|
||||
{% if request.event.has_subevents %}
|
||||
<form class="form-inline helper-display-inline" action="" method="get">
|
||||
{% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %}
|
||||
</form>
|
||||
{% endif %}
|
||||
{% if has_orders %}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
@@ -21,6 +26,14 @@
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div id="rev_chart" class="chart"></div>
|
||||
{% if request.GET.subevent %}
|
||||
<div class="alert alert-info">
|
||||
{% 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 %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel panel-default">
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user