mirror of
https://github.com/pretix/pretix.git
synced 2026-05-05 15:14:04 +00:00
Allow to explicitly disable products for certain subevents
This commit is contained in:
@@ -2276,6 +2276,64 @@ def test_order_create_item_validation(token_client, organizer, event, item, item
|
||||
assert resp.data == {'positions': [{'variation': ['You should specify a variation for this item.']}]}
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_create_subevent_disabled(token_client, organizer, event, item, subevent, quota, question):
|
||||
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
|
||||
res['positions'][0]['item'] = item.pk
|
||||
res['positions'][0]['answers'][0]['question'] = question.pk
|
||||
res['positions'][0]['subevent'] = subevent.pk
|
||||
s = item.subeventitem_set.create(subevent=subevent, disabled=True)
|
||||
quota.subevent = subevent
|
||||
quota.save()
|
||||
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': [{'item': ['The product "Budget Ticket" is not available on this date.']}]}
|
||||
|
||||
s.delete()
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_create_subevent_variation_disabled(token_client, organizer, event, item, subevent, quota, question):
|
||||
with scopes_disabled():
|
||||
item2 = event.items.create(name="Budget Ticket", default_price=23)
|
||||
var = item2.variations.create(default_price=12, value="XS")
|
||||
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
|
||||
res['positions'][0]['item'] = item2.pk
|
||||
res['positions'][0]['variation'] = var.pk
|
||||
res['positions'][0]['answers'][0]['question'] = question.pk
|
||||
res['positions'][0]['subevent'] = subevent.pk
|
||||
s = var.subeventitemvariation_set.create(subevent=subevent, disabled=True)
|
||||
quota.subevent = subevent
|
||||
quota.items.add(item2)
|
||||
quota.variations.add(var)
|
||||
quota.save()
|
||||
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': [{'item': ['The product "Budget Ticket" is not available on this date.']}]}
|
||||
|
||||
s.delete()
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_create_positionids_addons(token_client, organizer, event, item, quota):
|
||||
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
|
||||
|
||||
@@ -477,6 +477,22 @@ class CartTest(CartTestMixin, TestCase):
|
||||
objs = list(CartPosition.objects.filter(cart_id=self.session_key, event=self.event))
|
||||
self.assertEqual(len(objs), 0)
|
||||
|
||||
def test_subevent_disabled(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
with scopes_disabled():
|
||||
se = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
q = se.quotas.create(name="foo", size=None, event=self.event)
|
||||
q.items.add(self.ticket)
|
||||
SubEventItem.objects.create(subevent=se, item=self.ticket, price=42, disabled=True)
|
||||
self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
|
||||
'item_%d' % self.ticket.id: '1',
|
||||
'subevent': se.pk
|
||||
}, follow=False)
|
||||
with scopes_disabled():
|
||||
objs = list(CartPosition.objects.filter(cart_id=self.session_key, event=self.event))
|
||||
self.assertEqual(len(objs), 0)
|
||||
|
||||
def test_subevent_price(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
@@ -613,6 +629,22 @@ class CartTest(CartTestMixin, TestCase):
|
||||
self.assertEqual(objs[0].variation, self.shirt_red)
|
||||
self.assertEqual(objs[0].price, 16)
|
||||
|
||||
def test_subevent_variation_disabled(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
with scopes_disabled():
|
||||
se = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
q = se.quotas.create(name="foo", size=None, event=self.event)
|
||||
q.variations.add(self.shirt_red)
|
||||
SubEventItemVariation.objects.create(subevent=se, variation=self.shirt_red, price=42, disabled=True)
|
||||
self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
|
||||
'variation_%d_%d' % (self.shirt.id, self.shirt_red.id): '1',
|
||||
'subevent': se.pk
|
||||
}, follow=False)
|
||||
with scopes_disabled():
|
||||
objs = list(CartPosition.objects.filter(cart_id=self.session_key, event=self.event))
|
||||
self.assertEqual(len(objs), 0)
|
||||
|
||||
def test_subevent_variation_price(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
|
||||
@@ -22,7 +22,7 @@ from pretix.base.models import (
|
||||
SeatingPlan, Voucher,
|
||||
)
|
||||
from pretix.base.models.items import (
|
||||
ItemAddOn, ItemBundle, ItemVariation, SubEventItem,
|
||||
ItemAddOn, ItemBundle, ItemVariation, SubEventItem, SubEventItemVariation,
|
||||
)
|
||||
from pretix.base.services.orders import OrderError, _perform_order
|
||||
from pretix.testutils.scope import classscope
|
||||
@@ -1465,6 +1465,43 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
|
||||
cr1 = CartPosition.objects.get(id=cr1.id)
|
||||
self.assertEqual(cr1.price, 24)
|
||||
|
||||
def test_subevent_disabled(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
with scopes_disabled():
|
||||
se = self.event.subevents.create(name='Foo', date_from=now())
|
||||
q = se.quotas.create(name="foo", size=None, event=self.event)
|
||||
q.items.add(self.ticket)
|
||||
SubEventItem.objects.create(subevent=se, item=self.ticket, price=24, disabled=True)
|
||||
cr1 = CartPosition.objects.create(
|
||||
event=self.event, cart_id=self.session_key, item=self.ticket,
|
||||
price=23, expires=now() - timedelta(minutes=10), subevent=se
|
||||
)
|
||||
self._set_session('payment', 'banktransfer')
|
||||
|
||||
self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True)
|
||||
with scopes_disabled():
|
||||
assert not CartPosition.objects.filter(id=cr1.id).exists()
|
||||
|
||||
def test_subevent_variation_disabled(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
with scopes_disabled():
|
||||
se = self.event.subevents.create(name='Foo', date_from=now())
|
||||
q = se.quotas.create(name="foo", size=None, event=self.event)
|
||||
q.items.add(self.workshop2)
|
||||
q.variations.add(self.workshop2b)
|
||||
SubEventItemVariation.objects.create(subevent=se, variation=self.workshop2b, price=24, disabled=True)
|
||||
cr1 = CartPosition.objects.create(
|
||||
event=self.event, cart_id=self.session_key, item=self.workshop2, variation=self.workshop2b,
|
||||
price=23, expires=now() - timedelta(minutes=10), subevent=se
|
||||
)
|
||||
self._set_session('payment', 'banktransfer')
|
||||
|
||||
self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True)
|
||||
with scopes_disabled():
|
||||
assert not CartPosition.objects.filter(id=cr1.id).exists()
|
||||
|
||||
def test_addon_price_included(self):
|
||||
with scopes_disabled():
|
||||
ItemAddOn.objects.create(base_item=self.ticket, addon_category=self.workshopcat, min_count=1,
|
||||
|
||||
@@ -255,6 +255,24 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
resp = self.client.get('/%s/%s/%d/' % (self.orga.slug, self.event.slug, se2.pk))
|
||||
self.assertNotIn("Early-bird", resp.rendered_content)
|
||||
|
||||
def test_subevent_disabled(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
with scopes_disabled():
|
||||
se1 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=15)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
q.items.add(item)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se2)
|
||||
q.items.add(item)
|
||||
SubEventItem.objects.create(subevent=se1, item=item, price=12, disabled=True)
|
||||
|
||||
resp = self.client.get('/%s/%s/%d/' % (self.orga.slug, self.event.slug, se1.pk))
|
||||
self.assertNotIn("Early-bird", resp.rendered_content)
|
||||
resp = self.client.get('/%s/%s/%d/' % (self.orga.slug, self.event.slug, se2.pk))
|
||||
self.assertIn("Early-bird", resp.rendered_content)
|
||||
|
||||
def test_subevent_prices(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
@@ -300,6 +318,27 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
self.assertNotIn("12.00", resp.rendered_content)
|
||||
self.assertNotIn("15.00", resp.rendered_content)
|
||||
|
||||
def test_variations_subevent_disabled(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
with scopes_disabled():
|
||||
se1 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=15)
|
||||
v = ItemVariation.objects.create(item=item, value='Blue')
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
q.items.add(item)
|
||||
q.variations.add(v)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se2)
|
||||
q.items.add(item)
|
||||
q.variations.add(v)
|
||||
SubEventItemVariation.objects.create(subevent=se1, variation=v, disabled=True)
|
||||
|
||||
resp = self.client.get('/%s/%s/%d/' % (self.orga.slug, self.event.slug, se1.pk))
|
||||
self.assertNotIn("Early-bird", resp.rendered_content)
|
||||
resp = self.client.get('/%s/%s/%d/' % (self.orga.slug, self.event.slug, se2.pk))
|
||||
self.assertIn("Early-bird", resp.rendered_content)
|
||||
|
||||
def test_no_variations_in_quota(self):
|
||||
with scopes_disabled():
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
|
||||
Reference in New Issue
Block a user