From 223b160c0c22ac2b6dc77cbd963bb2a732ae4ce0 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 5 Jan 2022 17:58:21 +0100 Subject: [PATCH] Fix booked add-ons being hidden in order change due to hide_sold_out --- src/pretix/presale/views/event.py | 9 ++++++--- src/pretix/presale/views/order.py | 1 + src/tests/presale/test_order_change.py | 24 ++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index cdc2c7fa38..860ad0360d 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -101,7 +101,8 @@ def item_group_by_category(items): def get_grouped_items(event, subevent=None, voucher=None, channel='web', require_seat=0, base_qs=None, allow_addons=False, - quota_cache=None, filter_items=None, filter_categories=None, memberships=None): + quota_cache=None, filter_items=None, filter_categories=None, memberships=None, + ignore_hide_sold_out_for_item_ids=None): base_qs_set = base_qs is not None base_qs = base_qs if base_qs is not None else event.items @@ -273,7 +274,9 @@ def get_grouped_items(event, subevent=None, voucher=None, channel='web', require item.check_quotas(subevent=subevent, _cache=quota_cache, include_bundled=True) ) - if event.settings.hide_sold_out and item.cached_availability[0] < Quota.AVAILABILITY_RESERVED: + if not ( + ignore_hide_sold_out_for_item_ids and item.pk in ignore_hide_sold_out_for_item_ids + ) and event.settings.hide_sold_out and item.cached_availability[0] < Quota.AVAILABILITY_RESERVED: item._remove = True continue @@ -359,7 +362,7 @@ def get_grouped_items(event, subevent=None, voucher=None, channel='web', require ) and not getattr(v, '_remove', False) ] - if event.settings.hide_sold_out: + if not (ignore_hide_sold_out_for_item_ids and item.pk in ignore_hide_sold_out_for_item_ids) and event.settings.hide_sold_out: item.available_variations = [v for v in item.available_variations if v.cached_availability[0] >= Quota.AVAILABILITY_RESERVED] diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index 495e3f1ee1..eb6b828507 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -1238,6 +1238,7 @@ class OrderChange(EventViewMixin, OrderDetailMixin, TemplateView): ) if self.order.customer else None ), + ignore_hide_sold_out_for_item_ids={k[0] for k in current_addon_products.keys()} ) item_cache[ckey] = items else: diff --git a/src/tests/presale/test_order_change.py b/src/tests/presale/test_order_change.py index 5883d46e15..6cf850aac1 100644 --- a/src/tests/presale/test_order_change.py +++ b/src/tests/presale/test_order_change.py @@ -818,6 +818,30 @@ class OrderChangeAddonsTest(BaseOrdersTest): with scopes_disabled(): assert self.ticket_pos.addons.count() == 0 + def test_quota_hide_sold_out_do_not_hide_initial(self): + self.event.settings.hide_sold_out = True + self.workshopquota.size = 1 + self.workshopquota.save() + + with scopes_disabled(): + OrderPosition.objects.create( + order=self.order, + item=self.workshop1, + variation=None, + price=Decimal("12"), + addon_to=self.ticket_pos, + attendee_name_parts={'full_name': "Peter"} + ) + self.order.total += Decimal("12") + self.order.save() + + response = self.client.get( + '/%s/%s/order/%s/%s/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret) + ) + assert response.status_code == 200 + assert 'Workshop 1' in response.content.decode() + assert 'Workshop 2' not in response.content.decode() + def test_quota_sold_out_replace(self): self.workshopquota.size = 1 self.workshopquota.save()