Allow to hide a product unless a specific quota is sold out (#1351)

* Allow to hide a product unless a specific quota is sold out

* Fix required property

* Add API property and copy between events
This commit is contained in:
Raphael Michel
2019-07-25 16:14:24 +02:00
committed by GitHub
parent 2dd75ea252
commit e83e8cdcc0
16 changed files with 250 additions and 8 deletions

View File

@@ -234,6 +234,7 @@ TEST_ITEM_RES = {
"allow_cancel": True,
"min_per_order": None,
"max_per_order": None,
"hidden_if_available": None,
"checkin_attention": False,
"has_variations": False,
"require_approval": False,

View File

@@ -660,10 +660,14 @@ class EventsTest(SoupTest):
tr = self.event1.tax_rules.create(
rate=19, name="VAT"
)
q1 = self.event1.quotas.create(
name='Foo',
size=0,
)
self.event1.items.create(
name='Early-bird ticket',
category=None, default_price=23, tax_rule=tr,
admission=True
admission=True, hidden_if_available=q1
)
self.event1.settings.tax_rate_default = tr
doc = self.get_doc('/control/events/add')
@@ -724,6 +728,10 @@ class EventsTest(SoupTest):
assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
assert ev.tax_rules.filter(rate=Decimal('19.00')).count() == 1
i = ev.items.get()
assert i.hidden_if_available.name == "Foo"
assert i.hidden_if_available.event == ev
assert i.hidden_if_available.pk != q1.pk
def test_create_event_clone_success(self):
with scopes_disabled():

View File

@@ -1781,6 +1781,53 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
assert 'Workshop 1' in response.rendered_content
assert '€12.00' not in response.rendered_content
def test_set_addons_hide_sold_out(self):
with scopes_disabled():
self.workshopquota.size = 0
self.workshopquota.save()
ItemAddOn.objects.create(base_item=self.ticket, addon_category=self.workshopcat, min_count=1)
CartPosition.objects.create(
event=self.event, cart_id=self.session_key, item=self.ticket,
price=23, expires=now() - timedelta(minutes=10)
)
response = self.client.get('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), follow=True)
self.assertRedirects(response, '/%s/%s/checkout/addons/' % (self.orga.slug, self.event.slug),
target_status_code=200)
assert 'Workshop 1' in response.rendered_content
self.event.settings.hide_sold_out = True
response = self.client.get('/%s/%s/checkout/addons/' % (self.orga.slug, self.event.slug), follow=True)
assert 'Workshop 1' not in response.rendered_content
def test_set_addons_hidden_if_available(self):
with scopes_disabled():
self.workshopquota2 = Quota.objects.create(event=self.event, name='Workshop 1', size=5)
self.workshopquota2.items.add(self.workshop2)
self.workshopquota2.variations.add(self.workshop2a)
self.workshop2.hidden_if_available = self.workshopquota
self.workshop2.save()
ItemAddOn.objects.create(base_item=self.ticket, addon_category=self.workshopcat, min_count=1)
CartPosition.objects.create(
event=self.event, cart_id=self.session_key, item=self.ticket,
price=23, expires=now() - timedelta(minutes=10)
)
response = self.client.get('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), follow=True)
self.assertRedirects(response, '/%s/%s/checkout/addons/' % (self.orga.slug, self.event.slug),
target_status_code=200)
assert 'Workshop 1' in response.rendered_content
assert 'Workshop 2' not in response.rendered_content
self.workshopquota.size = 0
self.workshopquota.save()
response = self.client.get('/%s/%s/checkout/addons/' % (self.orga.slug, self.event.slug), follow=True)
assert 'Workshop 1' in response.rendered_content
assert 'Workshop 2' in response.rendered_content
def test_set_addons_subevent(self):
with scopes_disabled():
self.event.has_subevents = True

View File

@@ -364,6 +364,30 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
self.assertNotIn("Early-bird", doc.select("section:nth-of-type(1) div:nth-of-type(1)")[0].text)
self.assertNotIn("SOLD OUT", doc.select("section:nth-of-type(1)")[0].text)
def test_hidden_if_available(self):
with scopes_disabled():
q = Quota.objects.create(event=self.event, name='Early-bird', size=10)
q2 = Quota.objects.create(event=self.event, name='Late-bird', size=10)
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=12)
item2 = Item.objects.create(event=self.event, name='Late-bird ticket', default_price=12,
hidden_if_available=q)
q.items.add(item)
q2.items.add(item2)
self.event.settings.hide_sold_out = True
doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug))
self.assertIn("Early-bird", doc.select("section:nth-of-type(1)")[0].text)
self.assertNotIn("SOLD OUT", doc.select("section:nth-of-type(1)")[0].text)
self.assertNotIn("Late-bird", doc.select("section:nth-of-type(1)")[0].text)
q.size = 0
q.save()
doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug))
self.assertNotIn("Early-bird", doc.select("section:nth-of-type(1)")[0].text)
self.assertNotIn("SOLD OUT", doc.select("section:nth-of-type(1)")[0].text)
self.assertIn("Late-bird", doc.select("section:nth-of-type(1)")[0].text)
def test_bundle_sold_out(self):
with scopes_disabled():
q = Quota.objects.create(event=self.event, name='Quota', size=2)