From 7ebefa7b85ea8e61dd462005e67c435c893a4188 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 30 Aug 2021 15:57:28 +0200 Subject: [PATCH] Allow to manually bump carts blocking a voucher --- .../pretixcontrol/vouchers/detail.html | 22 +++++++--- src/pretix/control/urls.py | 2 + src/pretix/control/views/vouchers.py | 42 +++++++++++++++++++ 3 files changed, 61 insertions(+), 5 deletions(-) diff --git a/src/pretix/control/templates/pretixcontrol/vouchers/detail.html b/src/pretix/control/templates/pretixcontrol/vouchers/detail.html index e8262f8ef8..7ff30fd983 100644 --- a/src/pretix/control/templates/pretixcontrol/vouchers/detail.html +++ b/src/pretix/control/templates/pretixcontrol/vouchers/detail.html @@ -10,14 +10,26 @@
{% trans "This voucher already has been used. It is not recommended to modify it." %}
{% endif %} + {% if redeemed_in_carts %} +
+ {% blocktrans trimmed with number=redeemed_in_carts %} + This voucher is currently used in {{ number }} cart sessions and there might not be free to use until the cart sessions + expire. + {% endblocktrans %} +

+ {% trans "Remove cart positions" %} +

+
+
+ {% endif %}
{% csrf_token %} {% bootstrap_form_errors form %} diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 99a62dd44a..56d13049c4 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -276,6 +276,8 @@ urlpatterns = [ re_path(r'^vouchers/(?P\d+)/$', vouchers.VoucherUpdate.as_view(), name='event.voucher'), re_path(r'^vouchers/(?P\d+)/delete$', vouchers.VoucherDelete.as_view(), name='event.voucher.delete'), + re_path(r'^vouchers/(?P\d+)/deletecarts$', vouchers.VoucherDeleteCarts.as_view(), + name='event.voucher.deletecarts'), re_path(r'^vouchers/add$', vouchers.VoucherCreate.as_view(), name='event.vouchers.add'), re_path(r'^vouchers/go$', vouchers.VoucherGo.as_view(), name='event.vouchers.go'), re_path(r'^vouchers/bulk_add$', vouchers.VoucherBulkCreate.as_view(), name='event.vouchers.bulk'), diff --git a/src/pretix/control/views/vouchers.py b/src/pretix/control/views/vouchers.py index 1fae627bc1..3676a0e48f 100644 --- a/src/pretix/control/views/vouchers.py +++ b/src/pretix/control/views/vouchers.py @@ -50,6 +50,7 @@ from django.urls import resolve, reverse from django.utils.functional import cached_property from django.utils.html import format_html from django.utils.safestring import mark_safe +from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from django.views.generic import ( CreateView, DeleteView, ListView, TemplateView, UpdateView, View, @@ -181,6 +182,38 @@ class VoucherTags(EventPermissionRequiredMixin, TemplateView): return VoucherTagFilterForm(data=self.request.GET, event=self.request.event) +class VoucherDeleteCarts(EventPermissionRequiredMixin, DeleteView): + model = Voucher + template_name = 'pretixcontrol/vouchers/delete_carts.html' + permission = 'can_change_vouchers' + context_object_name = 'voucher' + + def get_object(self, queryset=None) -> Voucher: + try: + return self.request.event.vouchers.get( + id=self.kwargs['voucher'] + ) + except Voucher.DoesNotExist: + raise Http404(_("The requested voucher does not exist.")) + + @transaction.atomic + def delete(self, request, *args, **kwargs): + self.object = self.get_object() + success_url = self.get_success_url() + + self.object.log_action('pretix.voucher.carts.deleted', user=self.request.user) + CartPosition.objects.filter(addon_to__voucher=self.object).delete() + self.object.cartposition_set.all().delete() + messages.success(request, _('The selected cart positions have been removed.')) + return HttpResponseRedirect(success_url) + + def get_success_url(self) -> str: + return reverse('control:event.vouchers', kwargs={ + 'organizer': self.request.event.organizer.slug, + 'event': self.request.event.slug, + }) + + class VoucherDelete(EventPermissionRequiredMixin, DeleteView): model = Voucher template_name = 'pretixcontrol/vouchers/delete.html' @@ -262,6 +295,15 @@ class VoucherUpdate(EventPermissionRequiredMixin, UpdateView): 'event': self.request.event.slug, }) + def get_context_data(self, **kwargs): + ctx = super().get_context_data(**kwargs) + redeemed_in_carts = CartPosition.objects.filter( + voucher=self.object, event=self.request.event, + expires__gte=now() + ).count() + ctx['redeemed_in_carts'] = redeemed_in_carts + return ctx + class VoucherCreate(EventPermissionRequiredMixin, CreateView): model = Voucher