diff --git a/src/pretix/control/forms/waitinglist.py b/src/pretix/control/forms/waitinglist.py index 831309aa8d..8a0d30baf0 100644 --- a/src/pretix/control/forms/waitinglist.py +++ b/src/pretix/control/forms/waitinglist.py @@ -82,8 +82,10 @@ class WaitingListEntryEditForm(I18nModelForm): items = self.event.items.prefetch_related('variations').prefetch_related('quotas') for item in items: - if not item.allow_waitinglist | item.quotas.exists(): # don't offer items in the selection if they don't allow waitinglists or aren't on sale at all - if not self.instance.item.pk == item.pk: # except if they are currently set in the waitinglist, this will be then caught on submit in the clean step + # don't offer items in the selection if they don't allow waitinglists or aren't on sale at all + if not item.allow_waitinglist | item.quotas.exists(): + # except if they are currently set in the waitinglist, this will be then caught on submit in the clean step + if not self.instance.item.pk == item.pk: continue if len(item.variations.all()) > 0: diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 64a2af31f9..359673da6a 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -478,7 +478,7 @@ urlpatterns = [ name='event.orders.waitinglist.delete'), re_path(r'^waitinglist/(?P\d+)/edit$', waitinglist.EntryEdit.as_view(), name='event.orders.waitinglist.edit'), - re_path(r'^waitinglist/(?P\d+)/transfer$', waitinglist.EntryEdit.as_view(), # alias of /edit + re_path(r'^waitinglist/(?P\d+)/transfer$', waitinglist.EntryEdit.as_view(), # alias of /edit name='event.orders.waitinglist.edit'), re_path(r'^checkins/$', checkin.CheckinListView.as_view(), name='event.orders.checkins'), re_path(r'^checkinlists/$', checkin.CheckinListList.as_view(), name='event.orders.checkinlists'), diff --git a/src/pretix/control/views/waitinglist.py b/src/pretix/control/views/waitinglist.py index 080117219d..6239223d7b 100644 --- a/src/pretix/control/views/waitinglist.py +++ b/src/pretix/control/views/waitinglist.py @@ -53,9 +53,7 @@ from pretix.base.models import Item, LogEntry, Quota, WaitingListEntry from pretix.base.models.waitinglist import WaitingListException from pretix.base.services.waitinglist import assign_automatically from pretix.base.views.tasks import AsyncAction -from pretix.control.forms.waitinglist import ( - WaitingListEntryEditForm, -) +from pretix.control.forms.waitinglist import WaitingListEntryEditForm from pretix.control.permissions import EventPermissionRequiredMixin from pretix.control.views import PaginationMixin @@ -401,6 +399,7 @@ class EntryDelete(EventPermissionRequiredMixin, CompatDeleteView): 'organizer': self.request.event.organizer.slug }) + class EntryEdit(EventPermissionRequiredMixin, UpdateView): model = WaitingListEntry template_name = 'pretixcontrol/waitinglist/edit.html' diff --git a/src/tests/control/test_waitinglist.py b/src/tests/control/test_waitinglist.py index fea9d50bbe..50286b20f5 100644 --- a/src/tests/control/test_waitinglist.py +++ b/src/tests/control/test_waitinglist.py @@ -56,11 +56,8 @@ def env(): event.settings.set('waiting_list_names_asked', False) event.settings.set('waiting_list_names_required', False) user = User.objects.create_user('dummy@dummy.dummy', 'dummy') - item1 = Item.objects.create(event=event, name="Ticket", default_price=23, - admission=True, allow_waitinglist=True) - item2 = Item.objects.create(event=event, name="Ticket", default_price=23, - admission=True) - + item1 = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True, allow_waitinglist=True) + item2 = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True) for i in range(5): WaitingListEntry.objects.create( @@ -198,8 +195,7 @@ def test_delete_bulk(client, env): @pytest.mark.django_db def test_edit(client, env): event = env[0] - item = Item.objects.create(event=event, name="Ticket", default_price=23, - admission=True, allow_waitinglist=True) + item = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True, allow_waitinglist=True) quota = Quota.objects.create(event=event) quota.items.add(item) @@ -221,12 +217,12 @@ def test_edit(client, env): ) assert response.wsgi_request.path == '/control/event/dummy/dummy/waitinglist/' + @pytest.mark.django_db def test_edit_itemvariation(client, env): event = env[0] - item = Item.objects.create(event=event, name="Ticket", default_price=23, - admission=True, allow_waitinglist=True) + item = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True, allow_waitinglist=True) variation = ItemVariation.objects.create(item=item) quota = Quota.objects.create(event=event) quota.items.add(item) @@ -257,8 +253,7 @@ def test_edit_itemvariation(client, env): def test_edit_voucher_send_out(client, env): event = env[0] - item = Item.objects.create(event=event, name="Ticket", default_price=23, - admission=True, allow_waitinglist=True) + item = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True, allow_waitinglist=True) quota = Quota.objects.create(event=event, size=100) quota.items.add(item) @@ -281,13 +276,12 @@ def test_edit_voucher_send_out(client, env): ) assert response.status_code == 404 + @pytest.mark.django_db def test_edit_item_without_waitinglist(client, env): event = env[0] - item = Item.objects.create(event=event, name="Ticket", default_price=23, - admission=True, allow_waitinglist=True) - item_without_waitinglist = Item.objects.create(event=event, name="Ticket", default_price=23, - admission=True, allow_waitinglist=False) + item = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True, allow_waitinglist=True) + item_without_waitinglist = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True, allow_waitinglist=False) quota = Quota.objects.create(event=event) quota.items.add(item) quota.items.add(item_without_waitinglist) @@ -310,17 +304,15 @@ def test_edit_item_without_waitinglist(client, env): ) assert response.context['form'].errors == {'itemvar': ["The selected product does not allow waiting list entries."]} + @pytest.mark.django_db def test_edit_item_without_quota(client, env): event = env[0] - item = Item.objects.create(event=event, name="Ticket", default_price=23, - admission=True, allow_waitinglist=True) - item_without_waitinglist = Item.objects.create(event=event, name="Ticket", default_price=23, - admission=True, allow_waitinglist=True) + item = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True, allow_waitinglist=True) + item_without_waitinglist = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True, allow_waitinglist=True) quota = Quota.objects.create(event=event) quota.items.add(item) - client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): wle = WaitingListEntry.objects.create( @@ -339,6 +331,7 @@ def test_edit_item_without_quota(client, env): ) assert response.context['form'].errors == {'itemvar': ["The selected product is not on sale because there is no quota configured for it."]} + @pytest.mark.django_db def test_dashboard(client, env): with scopes_disabled():