From a056ee732a3b565f2c6990323292ffb5efd81c8b Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 5 Aug 2016 10:31:41 +0200 Subject: [PATCH] Added voucher list download as CSV --- src/pretix/control/forms/vouchers.py | 3 +- .../pretixcontrol/vouchers/index.html | 1 + src/pretix/control/views/vouchers.py | 45 ++++++++++++++++++- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/pretix/control/forms/vouchers.py b/src/pretix/control/forms/vouchers.py index c34ede6ee..e13f8ee33 100644 --- a/src/pretix/control/forms/vouchers.py +++ b/src/pretix/control/forms/vouchers.py @@ -3,6 +3,7 @@ import copy from django import forms from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ + from pretix.base.forms import I18nModelForm from pretix.base.models import Item, ItemVariation, Quota, Voucher @@ -47,7 +48,7 @@ class VoucherForm(I18nModelForm): else: choices.append((str(i.pk), i.name)) for q in self.instance.event.quotas.all(): - choices.append(('q-%d' % q.pk, 'Any product in quota "{quota}"'.format(quota=q))) + choices.append(('q-%d' % q.pk, _('Any product in quota "{quota}"').format(quota=q))) self.fields['itemvar'].choices = choices def clean(self): diff --git a/src/pretix/control/templates/pretixcontrol/vouchers/index.html b/src/pretix/control/templates/pretixcontrol/vouchers/index.html index 2d3f7fa6d..1739ec1fb 100644 --- a/src/pretix/control/templates/pretixcontrol/vouchers/index.html +++ b/src/pretix/control/templates/pretixcontrol/vouchers/index.html @@ -21,6 +21,7 @@ +

{% if vouchers|length == 0 %} diff --git a/src/pretix/control/views/vouchers.py b/src/pretix/control/views/vouchers.py index 15685d39a..3a085fe0e 100644 --- a/src/pretix/control/views/vouchers.py +++ b/src/pretix/control/views/vouchers.py @@ -1,9 +1,13 @@ +import csv +import io + from django.conf import settings from django.contrib import messages from django.core.urlresolvers import resolve, reverse from django.db import transaction from django.db.models import Count, Q, Sum -from django.http import Http404, HttpResponseRedirect +from django.http import Http404, HttpResponse, HttpResponseRedirect +from django.utils.formats import date_format from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ from django.views.generic import ( @@ -41,6 +45,45 @@ class VoucherList(EventPermissionRequiredMixin, ListView): qs = qs.filter(Q(valid_until__isnull=False) & Q(valid_until__lt=now())).filter(redeemed=False) return qs + def get(self, request, *args, **kwargs): + if request.GET.get("download", "") == "yes": + return self._download_csv() + return super().get(request, *args, **kwargs) + + def _download_csv(self): + output = io.StringIO() + writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC, delimiter=",") + + headers = [ + _('Voucher code'), _('Valid until'), _('Product'), _('Reserve quota'), _('Bypass quota'), + _('Price'), _('Tag'), _('Redeemed') + ] + writer.writerow(headers) + + for v in self.get_queryset(): + if v.item: + if v.variation: + prod = '%s – %s' % (str(v.item.name), str(v.variation.name)) + else: + prod = '%s' % str(v.item.name) + elif v.quota: + prod = _('Any product in quota "{quota}"').format(quota=str(v.quota.name)) + row = [ + v.code, + v.valid_until.isoformat() if v.valid_until else "", + prod, + _("Yes") if v.block_quota else _("No"), + _("Yes") if v.allow_ignore_quota else _("No"), + str(v.price) if v.price else "", + v.tag, + _("Yes") if v.redeemed else _("No"), + ] + writer.writerow(row) + + r = HttpResponse(output.getvalue().encode("utf-8"), content_type='text/csv') + r['Content-Disposition'] = 'attachment; filename="vouchers.csv"' + return r + class VoucherTags(EventPermissionRequiredMixin, TemplateView): template_name = 'pretixcontrol/vouchers/tags.html'