diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index dd5947c4e..5d1d61153 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -2114,8 +2114,8 @@ class OrderChangeManager: or (a.variation and not a.variation.all_sales_channels and not a.variation.limit_sales_channels.contains(self.order.sales_channel)) or a.item.unavailability_reason(has_voucher=True, subevent=a.subevent) or ( - not item.all_sales_channels and - not item.limit_sales_channels.contains(self.order.sales_channel) + not a.item.all_sales_channels and + not a.item.limit_sales_channels.contains(self.order.sales_channel) ) ) if is_unavailable: diff --git a/src/tests/presale/test_order_change.py b/src/tests/presale/test_order_change.py index 0bcafeb4e..24c110c38 100644 --- a/src/tests/presale/test_order_change.py +++ b/src/tests/presale/test_order_change.py @@ -1015,7 +1015,8 @@ class OrderChangeAddonsTest(BaseOrdersTest): '/%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' not in response.content.decode() + assert '
  • 1x Workshop 1
  • ' in response.content.decode() + assert f'cp_{self.ticket_pos.pk}_item_{self.workshop1.pk}' not in response.content.decode() response = self.client.post( '/%s/%s/order/%s/%s/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), @@ -1035,6 +1036,39 @@ class OrderChangeAddonsTest(BaseOrdersTest): with scopes_disabled(): assert self.ticket_pos.addons.count() == 2 + def test_do_not_overbook_unavailable_on_adding(self): + self.iao.max_count = 1 + self.iao.save() + self.workshop1.available_until = now() - datetime.timedelta(days=1) + self.workshop1.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 '
  • 1x Workshop 1
  • ' in response.content.decode() + assert f'cp_{self.ticket_pos.pk}_item_{self.workshop1.pk}' not in response.content.decode() + + response = self.client.post( + '/%s/%s/order/%s/%s/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), + { + f'cp_{self.ticket_pos.pk}_variation_{self.workshop2.pk}_{self.workshop2a.pk}': '1' + }, + follow=True + ) + assert 'alert-danger' in response.content.decode() + def test_remove_addon_checked_in(self): with scopes_disabled(): self.event.settings.change_allow_user_if_checked_in = True