diff --git a/src/pretix/base/models/items.py b/src/pretix/base/models/items.py index e3fb587a26..2c6a76038f 100644 --- a/src/pretix/base/models/items.py +++ b/src/pretix/base/models/items.py @@ -889,7 +889,6 @@ class Item(LoggedModel): check_quotas = set(getattr( self, '_subevent_quotas', # Utilize cache in product list self.quotas.filter(subevent=subevent).select_related('subevent') - if subevent else self.quotas.all() )) if ignored_quotas: check_quotas -= set(ignored_quotas) @@ -1298,7 +1297,6 @@ class ItemVariation(models.Model): check_quotas = set(getattr( self, '_subevent_quotas', # Utilize cache in product list self.quotas.filter(subevent=subevent).select_related('subevent') - if subevent else self.quotas.all() )) if ignored_quotas: check_quotas -= set(ignored_quotas) diff --git a/src/tests/api/test_cart.py b/src/tests/api/test_cart.py index 5bf7c3ad17..17ac92dd5d 100644 --- a/src/tests/api/test_cart.py +++ b/src/tests/api/test_cart.py @@ -293,14 +293,6 @@ def test_cartpos_cart_id_optional(token_client, organizer, event, item, quota, q def test_cartpos_create_subevent_validation(token_client, organizer, event, item, subevent, subevent2, quota, question): res = copy.deepcopy(CARTPOS_CREATE_PAYLOAD) res['item'] = item.pk - resp = token_client.post( - '/api/v1/organizers/{}/events/{}/cartpositions/'.format( - organizer.slug, event.slug - ), format='json', data=res - ) - assert resp.status_code == 400 - assert resp.data == {'subevent': ['You need to set a subevent.']} - res['subevent'] = subevent2.pk resp = token_client.post( '/api/v1/organizers/{}/events/{}/cartpositions/'.format( diff --git a/src/tests/api/test_items.py b/src/tests/api/test_items.py index aef2ef31fc..e6949a1e4b 100644 --- a/src/tests/api/test_items.py +++ b/src/tests/api/test_items.py @@ -2323,20 +2323,6 @@ def test_quota_create_with_subevent(token_client, organizer, event, event3, item ) assert resp.status_code == 201 - resp = token_client.post( - '/api/v1/organizers/{}/events/{}/quotas/'.format(organizer.slug, event.slug), - { - "name": "Ticket Quota", - "size": 200, - "items": [item.pk], - "variations": [variations[0].pk], - "subevent": None - }, - format='json' - ) - assert resp.status_code == 400 - assert resp.content.decode() == '{"non_field_errors":["Subevent cannot be null for event series."]}' - resp = token_client.post( '/api/v1/organizers/{}/events/{}/quotas/'.format(organizer.slug, event.slug), { diff --git a/src/tests/api/test_order_change.py b/src/tests/api/test_order_change.py index 4cff389cfa..c48532c727 100644 --- a/src/tests/api/test_order_change.py +++ b/src/tests/api/test_order_change.py @@ -1859,23 +1859,6 @@ def test_position_add_subevent(token_client, organizer, event, order, quota, ite assert op.subevent == subevent -@pytest.mark.django_db -def test_position_add_subevent_required(token_client, organizer, event, order, quota, item, subevent): - with scopes_disabled(): - assert order.positions.count() == 1 - payload = { - 'order': order.code, - 'item': item.pk, - } - resp = token_client.post( - '/api/v1/organizers/{}/events/{}/orderpositions/'.format( - organizer.slug, event.slug, - ), format='json', data=payload - ) - assert resp.status_code == 400 - assert 'subevent' in str(resp.data) - - @pytest.mark.django_db def test_position_add_quota_empty(token_client, organizer, event, order, quota, item): with scopes_disabled(): diff --git a/src/tests/api/test_order_create.py b/src/tests/api/test_order_create.py index e055231b17..fddd3c2b6a 100644 --- a/src/tests/api/test_order_create.py +++ b/src/tests/api/test_order_create.py @@ -1164,14 +1164,6 @@ def test_order_create_subevent_validation(token_client, organizer, event, item, res = copy.deepcopy(ORDER_CREATE_PAYLOAD) res['positions'][0]['item'] = item.pk res['positions'][0]['answers'][0]['question'] = question.pk - resp = token_client.post( - '/api/v1/organizers/{}/events/{}/orders/'.format( - organizer.slug, event.slug - ), format='json', data=res - ) - assert resp.status_code == 400 - assert resp.data == {'positions': [{'subevent': ['You need to set a subevent.']}]} - res['positions'][0]['subevent'] = subevent2.pk resp = token_client.post( '/api/v1/organizers/{}/events/{}/orders/'.format( diff --git a/src/tests/base/test_models.py b/src/tests/base/test_models.py index 349c8c37b5..bf540d5da7 100644 --- a/src/tests/base/test_models.py +++ b/src/tests/base/test_models.py @@ -638,8 +638,10 @@ class QuotaTestCase(BaseQuotaTestCase): self.event.save() se1 = self.event.subevents.create(date_from=now(), name="SE 1") se2 = self.event.subevents.create(date_from=now(), name="SE 2") + q0 = self.event.quotas.create(name="Q0", subevent=None, size=50) q1 = self.event.quotas.create(name="Q1", subevent=se1, size=50) q2 = self.event.quotas.create(name="Q2", subevent=se2, size=50) + q0.items.add(self.item1) q1.items.add(self.item1) q2.items.add(self.item1) @@ -659,11 +661,17 @@ class QuotaTestCase(BaseQuotaTestCase): OrderPosition.objects.create(order=order, item=self.item1, subevent=se1, price=2) OrderPosition.objects.create(order=order, item=self.item1, subevent=se1, price=2) OrderPosition.objects.create(order=order, item=self.item1, subevent=se2, price=2) + order = Order.objects.create(event=self.event, status=Order.STATUS_PENDING, + sales_channel=self.event.organizer.sales_channels.get(identifier="web"), + expires=now() + timedelta(days=3), + total=2) + OrderPosition.objects.create(order=order, item=self.item1, subevent=None, price=2) Voucher.objects.create(item=self.item1, event=self.event, valid_until=now() + timedelta(days=5), block_quota=True, max_usages=6, subevent=se1) Voucher.objects.create(item=self.item1, event=self.event, valid_until=now() + timedelta(days=5), block_quota=True, max_usages=4, subevent=se2) + # TODO how to deal with subevent=None? for i in range(8): CartPosition.objects.create(event=self.event, item=self.item1, price=2, subevent=se1, @@ -673,6 +681,10 @@ class QuotaTestCase(BaseQuotaTestCase): CartPosition.objects.create(event=self.event, item=self.item1, price=2, subevent=se2, expires=now() + timedelta(days=3)) + for i in range(2): + CartPosition.objects.create(event=self.event, item=self.item1, price=2, subevent=None, + expires=now() + timedelta(days=3)) + for i in range(16): WaitingListEntry.objects.create( event=self.event, item=self.item1, email='foo@bar.com', subevent=se1 @@ -683,11 +695,15 @@ class QuotaTestCase(BaseQuotaTestCase): event=self.event, item=self.item1, email='foo@bar.com', subevent=se2 ) - with self.assertRaises(TypeError): - self.item1.check_quotas() + for i in range(6): + WaitingListEntry.objects.create( + event=self.event, item=self.item1, email='foo@bar.com', subevent=None + ) self.assertEqual(self.item1.check_quotas(subevent=se1), (Quota.AVAILABILITY_OK, 50 - 5 - 6 - 8 - 16)) self.assertEqual(self.item1.check_quotas(subevent=se2), (Quota.AVAILABILITY_OK, 50 - 2 - 4 - 5 - 13)) + self.assertEqual(self.item1.check_quotas(subevent=None), (Quota.AVAILABILITY_OK, 50 - 1 - 2 - 6)) + self.assertEqual(q0.availability(), (Quota.AVAILABILITY_OK, 50 - 1 - 2 - 6)) self.assertEqual(q1.availability(), (Quota.AVAILABILITY_OK, 50 - 5 - 6 - 8 - 16)) self.assertEqual(q2.availability(), (Quota.AVAILABILITY_OK, 50 - 2 - 4 - 5 - 13)) self.event.has_subevents = False diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 4e91e26f19..204657d17e 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -2466,13 +2466,6 @@ class OrderChangeManagerTests(BaseOrderChangeManagerTestCase, TestCase): with self.assertRaises(OrderError): self.ocm.add_position(self.shirt, None, Decimal('13.00'), None) - @classscope(attr='o') - def test_add_item_subevent_required(self): - self.event.has_subevents = True - self.event.save() - with self.assertRaises(OrderError): - self.ocm.add_position(self.ticket, None, None, None) - @classscope(attr='o') def test_add_item_subevent_price(self): self.event.has_subevents = True diff --git a/src/tests/presale/test_cart.py b/src/tests/presale/test_cart.py index 72eb9661f3..5a8d6cfc46 100644 --- a/src/tests/presale/test_cart.py +++ b/src/tests/presale/test_cart.py @@ -323,6 +323,8 @@ class CartTest(CartTestMixin, TestCase): se = self.event.subevents.create(name='Foo', date_from=now(), active=True) self.quota_tickets.subevent = se self.quota_tickets.save() + self.quota_all.subevent = se + self.quota_all.save() q = se.quotas.create(name="foo", size=None, event=self.event) q.items.add(self.ticket) self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { diff --git a/src/tests/presale/test_event.py b/src/tests/presale/test_event.py index 053a5eff49..ae3fe0dec7 100644 --- a/src/tests/presale/test_event.py +++ b/src/tests/presale/test_event.py @@ -1274,6 +1274,8 @@ class WaitingListTest(EventTestMixin, SoupTest): self.event.save() with scopes_disabled(): se1 = self.event.subevents.create(name="Foo", date_from=now(), active=False) + self.q.subevent = se1 + self.q.save() response = self.client.get( '/%s/%s/waitinglist/?item=%d' % (self.orga.slug, self.event.slug, self.item.pk) )