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 %} +
+
+
+ {% bootstrap_field filter_form.subevent layout='inline' %} +
+
+ +
+
+
+ {% 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