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