Improvements around the waiting list (#2219)

* Waiting list: Support for seated events, pre-fill customer email address

* Allow people to remove themselves

* Update src/pretix/base/settings.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Update src/pretix/control/views/waitinglist.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Update src/pretix/control/views/waitinglist.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Update src/pretix/control/views/waitinglist.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Update src/pretix/presale/views/waiting.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Resolve a review note

* Review notes

* Fix linter issues

* Fix import

Co-authored-by: Richard Schreiber <schreiber@rami.io>
This commit is contained in:
Raphael Michel
2021-09-27 20:48:02 +02:00
committed by GitHub
parent a9a4cf6fca
commit 9f2ffc3276
15 changed files with 359 additions and 62 deletions

View File

@@ -68,6 +68,25 @@ class WaitingListTestCase(TestCase):
with self.assertRaises(WaitingListException):
wle.send_voucher()
@classscope(attr='o')
def test_send_no_seat(self):
self.quota.items.add(self.item1)
self.quota.size = 10
self.quota.save()
self.event.seat_category_mappings.create(
layout_category='Stalls', product=self.item1
)
self.event.seats.create(seat_number="Foo", product=self.item1, seat_guid="Foo", blocked=True)
self.event.seats.create(seat_number="Bar", product=self.item1, seat_guid="Bar", blocked=True)
self.event.seats.create(seat_number="Baz", product=self.item1, seat_guid="Baz", blocked=True)
wle = WaitingListEntry.objects.create(
event=self.event, item=self.item1, email='foo@bar.com'
)
with self.assertRaises(WaitingListException):
wle.send_voucher()
self.event.seats.create(seat_number="Baz", product=self.item1, seat_guid="Baz", blocked=False)
wle.send_voucher()
@classscope(attr='o')
def test_send_double(self):
self.quota.variations.add(self.var1)

View File

@@ -960,7 +960,8 @@ class WaitingListTest(EventTestMixin, SoupTest):
self.assertIn('waiting list', response.rendered_content)
response = self.client.post(
'/%s/%s/waitinglist/?item=%d' % (self.orga.slug, self.event.slug, self.item.pk), {
'email': 'foo@bar.com'
'email': 'foo@bar.com',
'itemvar': str(self.item.pk)
}
)
self.assertEqual(response.status_code, 302)
@@ -989,7 +990,8 @@ class WaitingListTest(EventTestMixin, SoupTest):
self.assertIn('waiting list', response.rendered_content)
response = self.client.post(
'/%s/%s/waitinglist/?item=%d&subevent=%d' % (self.orga.slug, self.event.slug, self.item.pk, se1.pk), {
'email': 'foo@bar.com'
'email': 'foo@bar.com',
'itemvar': str(self.item.pk)
}
)
self.assertEqual(response.status_code, 302)
@@ -1000,10 +1002,14 @@ class WaitingListTest(EventTestMixin, SoupTest):
assert wle.subevent == se1
def test_invalid_item(self):
response = self.client.get(
'/%s/%s/waitinglist/?item=%d' % (self.orga.slug, self.event.slug, self.item.pk + 1)
response = self.client.post(
'/%s/%s/waitinglist/' % (self.orga.slug, self.event.slug),
{
'email': 'foo@bar.com',
'itemvar': str(self.item.pk + 1),
}
)
self.assertEqual(response.status_code, 302)
self.assertEqual(response.status_code, 200)
def test_invalid_subevent(self):
self.event.has_subevents = True
@@ -1028,10 +1034,11 @@ class WaitingListTest(EventTestMixin, SoupTest):
self.q.save()
response = self.client.post(
'/%s/%s/waitinglist/?item=%d' % (self.orga.slug, self.event.slug, self.item.pk), {
'email': 'foo@bar.com'
'email': 'foo@bar.com',
'itemvar': str(self.item.pk)
}
)
self.assertEqual(response.status_code, 302)
self.assertEqual(response.status_code, 200)
with scopes_disabled():
self.assertFalse(WaitingListEntry.objects.filter(email='foo@bar.com').exists())
@@ -1048,12 +1055,48 @@ class WaitingListTest(EventTestMixin, SoupTest):
q2.items.add(self.item)
response = self.client.post(
'/%s/%s/waitinglist/?item=%d&subevent=%d' % (self.orga.slug, self.event.slug, self.item.pk, se1.pk), {
'email': 'foo@bar.com'
'email': 'foo@bar.com',
'itemvar': str(self.item.pk),
}
)
self.assertEqual(response.status_code, 200)
with scopes_disabled():
self.assertFalse(WaitingListEntry.objects.filter(email='foo@bar.com').exists())
def test_remove_valid(self):
with scopes_disabled():
v = self.event.vouchers.create(item=self.item, block_quota=True)
WaitingListEntry.objects.create(
event=self.event, item=self.item, email='bar@bar.com', voucher=v
)
response = self.client.get(
'/%s/%s/waitinglist/remove?voucher=%s' % (self.orga.slug, self.event.slug, v.code), {
}
)
self.assertEqual(response.status_code, 200)
response = self.client.post(
'/%s/%s/waitinglist/remove?voucher=%s' % (self.orga.slug, self.event.slug, v.code), {
}
)
self.assertEqual(response.status_code, 302)
v.refresh_from_db()
assert not v.is_active()
def test_remove_waiting_list_vouchers_only(self):
with scopes_disabled():
self.assertFalse(WaitingListEntry.objects.filter(email='foo@bar.com').exists())
v = self.event.vouchers.create(item=self.item, block_quota=True)
response = self.client.get(
'/%s/%s/waitinglist/remove?voucher=%s' % (self.orga.slug, self.event.slug, v.code), {
}
)
self.assertEqual(response.status_code, 302)
response = self.client.post(
'/%s/%s/waitinglist/remove?voucher=%s' % (self.orga.slug, self.event.slug, v.code), {
}
)
self.assertEqual(response.status_code, 302)
v.refresh_from_db()
assert v.is_active()
class DeadlineTest(EventTestMixin, TestCase):