From cf14dcf889c9f0207cda0a61004233acc80166ea Mon Sep 17 00:00:00 2001
From: Martin Gross
Date: Mon, 16 Sep 2019 14:08:23 +0200
Subject: [PATCH] Add Subevent-Filter for Voucher-Tags (#1407)
* Add Subevent-Filter for Voucher-Tags
* Filter Subevent Voucher-Tags with proper Filter
* Apply filter before annotating totals and usage
---
src/pretix/control/forms/filter.py | 37 +++++++++++++++++++
.../pretixcontrol/vouchers/tags.html | 18 +++++++++
src/pretix/control/views/vouchers.py | 28 +++++++++++---
3 files changed, 77 insertions(+), 6 deletions(-)
diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py
index c92f744eec..a1c87926a5 100644
--- a/src/pretix/control/forms/filter.py
+++ b/src/pretix/control/forms/filter.py
@@ -902,6 +902,43 @@ class VoucherFilterForm(FilterForm):
return qs
+class VoucherTagFilterForm(FilterForm):
+ subevent = forms.ModelChoiceField(
+ label=pgettext_lazy('subevent', 'Date'),
+ queryset=SubEvent.objects.none(),
+ required=False,
+ empty_label=pgettext_lazy('subevent', 'All dates')
+ )
+
+ def __init__(self, *args, **kwargs):
+ self.event = kwargs.pop('event')
+ super().__init__(*args, **kwargs)
+
+ if self.event.has_subevents:
+ self.fields['subevent'].queryset = self.event.subevents.all()
+ self.fields['subevent'].widget = Select2(
+ attrs={
+ 'data-model-select2': 'event',
+ 'data-select2-url': reverse('control:event.subevents.select2', kwargs={
+ 'event': self.event.slug,
+ 'organizer': self.event.organizer.slug,
+ }),
+ 'data-placeholder': pgettext_lazy('subevent', 'All dates')
+ }
+ )
+ self.fields['subevent'].widget.choices = self.fields['subevent'].choices
+ elif 'subevent':
+ del self.fields['subevent']
+
+ def filter_qs(self, qs):
+ fdata = self.cleaned_data
+
+ if fdata.get('subevent'):
+ qs = qs.filter(subevent_id=fdata.get('subevent').pk)
+
+ return qs
+
+
class RefundFilterForm(FilterForm):
provider = forms.ChoiceField(
label=_('Payment provider'),
diff --git a/src/pretix/control/templates/pretixcontrol/vouchers/tags.html b/src/pretix/control/templates/pretixcontrol/vouchers/tags.html
index 6787d906f9..007ce81244 100644
--- a/src/pretix/control/templates/pretixcontrol/vouchers/tags.html
+++ b/src/pretix/control/templates/pretixcontrol/vouchers/tags.html
@@ -1,5 +1,6 @@
{% extends "pretixcontrol/event/base.html" %}
{% load i18n %}
+{% load bootstrap3 %}
{% block title %}{% trans "Voucher tags" %}{% endblock %}
{% block content %}
{% trans "Voucher tags" %}
@@ -8,6 +9,23 @@
If you add a "tag" to a voucher, you can here see statistics on their usage.
{% endblocktrans %}
+ {% if request.event.has_subevents %}
+
+ {% endif %}
{% if tags|length == 0 %}
diff --git a/src/pretix/control/views/vouchers.py b/src/pretix/control/views/vouchers.py
index 2177d34e6a..925082a335 100644
--- a/src/pretix/control/views/vouchers.py
+++ b/src/pretix/control/views/vouchers.py
@@ -19,7 +19,7 @@ from django.views.generic import (
from pretix.base.models import CartPosition, LogEntry, OrderPosition, Voucher
from pretix.base.models.vouchers import _generate_random_code
-from pretix.control.forms.filter import VoucherFilterForm
+from pretix.control.forms.filter import VoucherFilterForm, VoucherTagFilterForm
from pretix.control.forms.vouchers import VoucherBulkForm, VoucherForm
from pretix.control.permissions import EventPermissionRequiredMixin
from pretix.control.signals import voucher_form_class
@@ -94,16 +94,27 @@ class VoucherTags(EventPermissionRequiredMixin, TemplateView):
template_name = 'pretixcontrol/vouchers/tags.html'
permission = 'can_view_vouchers'
- def get_context_data(self, **kwargs):
- ctx = super().get_context_data(**kwargs)
-
- tags = self.request.event.vouchers.order_by('tag').filter(
+ def get_queryset(self):
+ qs = self.request.event.vouchers.order_by('tag').filter(
tag__isnull=False,
waitinglistentries__isnull=True
- ).values('tag').annotate(
+ )
+
+ if self.filter_form.is_valid():
+ qs = self.filter_form.filter_qs(qs)
+
+ qs = qs.values('tag').annotate(
total=Sum('max_usages'),
redeemed=Sum('redeemed')
)
+
+ return qs.distinct()
+
+ def get_context_data(self, **kwargs):
+ ctx = super().get_context_data(**kwargs)
+
+ tags = self.get_queryset()
+
for t in tags:
if t['total'] == 0:
t['percentage'] = 0
@@ -111,8 +122,13 @@ class VoucherTags(EventPermissionRequiredMixin, TemplateView):
t['percentage'] = int((t['redeemed'] / t['total']) * 100)
ctx['tags'] = tags
+ ctx['filter_form'] = self.filter_form
return ctx
+ @cached_property
+ def filter_form(self):
+ return VoucherTagFilterForm(data=self.request.GET, event=self.request.event)
+
class VoucherDelete(EventPermissionRequiredMixin, DeleteView):
model = Voucher