From 0663f25208d3608cfee0a251a02bf7e5aa33530b Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 9 Jul 2017 21:19:30 +0800 Subject: [PATCH] Fix #541 -- Allow delete waitinglist entries (#544) Add new action "delete" for each waiting list entries --- .../pretixcontrol/waitinglist/delete.html | 19 +++++++++++ .../pretixcontrol/waitinglist/index.html | 8 +++++ src/pretix/control/urls.py | 1 + src/pretix/control/views/waitinglist.py | 34 +++++++++++++++++++ src/tests/control/test_waitinglist.py | 10 ++++++ 5 files changed, 72 insertions(+) create mode 100644 src/pretix/control/templates/pretixcontrol/waitinglist/delete.html diff --git a/src/pretix/control/templates/pretixcontrol/waitinglist/delete.html b/src/pretix/control/templates/pretixcontrol/waitinglist/delete.html new file mode 100644 index 000000000..d119d88cc --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/waitinglist/delete.html @@ -0,0 +1,19 @@ +{% extends "pretixcontrol/event/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block title %}{% trans "Delete entry" %}{% endblock %} +{% block content %} +

{% trans "Delete entry" %}

+
+ {% csrf_token %} +

{% blocktrans %}Are you sure you want to delete the following waiting list entry {{ entry }}?{% endblocktrans %}

+
+ + {% trans "Cancel" %} + + +
+
+{% endblock %} \ No newline at end of file diff --git a/src/pretix/control/templates/pretixcontrol/waitinglist/index.html b/src/pretix/control/templates/pretixcontrol/waitinglist/index.html index 1627a781a..25701f8a6 100644 --- a/src/pretix/control/templates/pretixcontrol/waitinglist/index.html +++ b/src/pretix/control/templates/pretixcontrol/waitinglist/index.html @@ -96,6 +96,7 @@ {% trans "On the list since" %} {% trans "Status" %} {% trans "Voucher" %} + @@ -133,6 +134,13 @@ {% endif %} + + {% if not e.voucher %} + + {% else %} + + {% endif %} + diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index bf281cf91..a78beee37 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -143,6 +143,7 @@ urlpatterns = [ url(r'^orders/$', orders.OrderList.as_view(), name='event.orders'), url(r'^waitinglist/$', waitinglist.WaitingListView.as_view(), name='event.orders.waitinglist'), url(r'^waitinglist/auto_assign$', waitinglist.AutoAssign.as_view(), name='event.orders.waitinglist.auto'), + url(r'^waitinglist/(?P\d+)/delete$', waitinglist.EntryDelete.as_view(), name='event.orders.waitinglist.delete'), url(r'^checkins/$', checkin.CheckInView.as_view(), name='event.orders.checkins'), ])), ] diff --git a/src/pretix/control/views/waitinglist.py b/src/pretix/control/views/waitinglist.py index 8af6a56cd..1d73d8240 100644 --- a/src/pretix/control/views/waitinglist.py +++ b/src/pretix/control/views/waitinglist.py @@ -1,11 +1,14 @@ from django.contrib import messages +from django.db import transaction from django.db.models import Sum from django.db.models.functions import Coalesce +from django.http import Http404, HttpResponseRedirect from django.shortcuts import redirect from django.urls import reverse from django.utils.translation import ugettext_lazy as _ from django.views import View from django.views.generic import ListView +from django.views.generic.edit import DeleteView from pretix.base.models import Item, WaitingListEntry from pretix.base.models.waitinglist import WaitingListException @@ -125,3 +128,34 @@ class WaitingListView(EventPermissionRequiredMixin, ListView): ) ) return qs['s'] + + +class EntryDelete(EventPermissionRequiredMixin, DeleteView): + model = WaitingListEntry + template_name = 'pretixcontrol/waitinglist/delete.html' + permission = 'can_change_orders' + context_object_name = 'entry' + + def get_object(self, queryset=None) -> WaitingListEntry: + try: + return self.request.event.waitinglistentries.get( + id=self.kwargs['entry'], + voucher__isnull=True, + ) + except WaitingListEntry.DoesNotExist: + raise Http404(_("The requested entry 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.event.orders.waitinglist.delete', user=self.request.user) + self.object.delete() + messages.success(self.request, _('The selected entry has been deleted.')) + return HttpResponseRedirect(success_url) + + def get_success_url(self) -> str: + return reverse('control:event.orders.waitinglist', kwargs={ + 'event': self.request.event.slug, + 'organizer': self.request.event.organizer.slug + }) diff --git a/src/tests/control/test_waitinglist.py b/src/tests/control/test_waitinglist.py index 9da69d648..15676e0f9 100644 --- a/src/tests/control/test_waitinglist.py +++ b/src/tests/control/test_waitinglist.py @@ -74,6 +74,16 @@ def test_assign_single(client, env): assert wle.voucher +@pytest.mark.django_db +def test_delete_single(client, env): + client.login(email='dummy@dummy.dummy', password='dummy') + wle = WaitingListEntry.objects.first() + + client.post('/control/event/dummy/dummy/waitinglist/%s/delete' % (wle.id)) + with pytest.raises(WaitingListEntry.DoesNotExist): + WaitingListEntry.objects.get(id=wle.id) + + @pytest.mark.django_db def test_dashboard(client, env): quota = Quota.objects.create(name="Test", size=2, event=env[0])