mirror of
https://github.com/pretix/pretix.git
synced 2026-05-05 15:14:04 +00:00
Allow to manually bump carts blocking a voucher
This commit is contained in:
@@ -10,14 +10,26 @@
|
||||
<div class="alert alert-warning">
|
||||
{% trans "This voucher already has been used. It is not recommended to modify it." %}
|
||||
<ul>
|
||||
{% for order in voucher.distinct_orders %}
|
||||
<li><a href="{% url "control:event.order" event=request.event.slug organizer=request.event.organizer.slug code=order.code %}">
|
||||
{% blocktrans with code=order.code %}Order {{ code }}{% endblocktrans %}
|
||||
</a></li>
|
||||
{% endfor %}
|
||||
{% for order in voucher.distinct_orders %}
|
||||
<li><a href="{% url "control:event.order" event=request.event.slug organizer=request.event.organizer.slug code=order.code %}">
|
||||
{% blocktrans with code=order.code %}Order {{ code }}{% endblocktrans %}
|
||||
</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if redeemed_in_carts %}
|
||||
<div class="alert alert-warning">
|
||||
{% 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 %}
|
||||
<p class="text-right">
|
||||
<a href="{% url "control:event.voucher.deletecarts" organizer=request.event.organizer.slug event=request.event.slug voucher=voucher.id %}" class="btn btn-default"><i class="fa fa-trash"></i> {% trans "Remove cart positions" %}</a>
|
||||
</p>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<form action="" method="post" class="form-horizontal">
|
||||
{% csrf_token %}
|
||||
{% bootstrap_form_errors form %}
|
||||
|
||||
@@ -276,6 +276,8 @@ urlpatterns = [
|
||||
re_path(r'^vouchers/(?P<voucher>\d+)/$', vouchers.VoucherUpdate.as_view(), name='event.voucher'),
|
||||
re_path(r'^vouchers/(?P<voucher>\d+)/delete$', vouchers.VoucherDelete.as_view(),
|
||||
name='event.voucher.delete'),
|
||||
re_path(r'^vouchers/(?P<voucher>\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'),
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user