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 0000000000..d119d88cc0
--- /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" %}
+
+{% 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 1627a781a8..25701f8a6d 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 bf281cf91b..a78beee375 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 8af6a56cd4..1d73d8240c 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 9da69d6483..15676e0f9f 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])