diff --git a/src/pretix/api/serializers/item.py b/src/pretix/api/serializers/item.py index 596f86f960..f9ff35deb5 100644 --- a/src/pretix/api/serializers/item.py +++ b/src/pretix/api/serializers/item.py @@ -76,7 +76,9 @@ class InlineItemVariationSerializer(SalesChannelMigrationMixin, I18nAwareModelSe def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['require_membership_types'].queryset = lazy(lambda: self.context['event'].organizer.membership_types.all(), QuerySet) - self.fields['limit_sales_channels'].child_relation.queryset = lazy(lambda: self.context['event'].organizer.sales_channels.all(), QuerySet) + self.fields['limit_sales_channels'].child_relation.queryset = ( + self.context['event'].organizer.sales_channels() if 'event' in self.context else SalesChannel.objects.none() + ) def validate_meta_data(self, value): for key in value['meta_data'].keys(): @@ -284,6 +286,7 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer): self.fields['require_membership_types'].queryset = self.context['event'].organizer.membership_types.all() self.fields['grant_membership_type'].queryset = self.context['event'].organizer.membership_types.all() self.fields['limit_sales_channels'].child_relation.queryset = self.context['event'].organizer.sales_channels.all() + self.fields['variations'].child.fields['limit_sales_channels'].child_relation.queryset = self.context['event'].organizer.sales_channels.all() def validate(self, data): data = super().validate(data) @@ -371,10 +374,13 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer): for variation_data in variations_data: require_membership_types = variation_data.pop('require_membership_types', []) + limit_sales_channels = variation_data.pop('limit_sales_channels', []) var_meta_data = variation_data.pop('meta_data', {}) v = ItemVariation.objects.create(item=item, **variation_data) if require_membership_types: v.require_membership_types.add(*require_membership_types) + if limit_sales_channels: + v.limit_sales_channels.add(*limit_sales_channels) if var_meta_data is not None: for key, value in var_meta_data.items(): diff --git a/src/pretix/api/serializers/order.py b/src/pretix/api/serializers/order.py index 410d7b3a24..e9f183604b 100644 --- a/src/pretix/api/serializers/order.py +++ b/src/pretix/api/serializers/order.py @@ -585,7 +585,7 @@ class CheckinListOrderPositionSerializer(OrderPositionSerializer): self.fields['item'] = ItemSerializer(read_only=True, context=self.context) if 'variation' in self.context['expand']: - self.fields['variation'] = InlineItemVariationSerializer(read_only=True) + self.fields['variation'] = InlineItemVariationSerializer(read_only=True, context=self.context) if 'answers.question' in self.context['expand']: self.fields['answers'].child.fields['question'] = QuestionSerializer(read_only=True) diff --git a/src/tests/api/test_items.py b/src/tests/api/test_items.py index a0a606a851..e1d4224e51 100644 --- a/src/tests/api/test_items.py +++ b/src/tests/api/test_items.py @@ -590,7 +590,28 @@ def test_item_create_with_variation(token_client, organizer, event, item, catego "meta_data": { "day": "Wednesday", }, - } + }, + { + "value": { + "de": "web", + "en": "web" + }, + "active": True, + "require_approval": True, + "checkin_attention": False, + "checkin_text": None, + "require_membership": False, + "require_membership_hidden": False, + "require_membership_types": [], + "description": None, + "position": 0, + "default_price": None, + "sales_channels": ["web"], + "price": "23.00", + "meta_data": { + "day": "Wednesday", + }, + }, ] }, format='json' @@ -604,6 +625,8 @@ def test_item_create_with_variation(token_client, organizer, event, item, catego assert new_item.variations.first().all_sales_channels is True assert not new_item.variations.first().limit_sales_channels.exists() assert new_item.variations.first().meta_data == {"day": "Wednesday"} + assert new_item.variations.last().all_sales_channels is False + assert new_item.variations.last().limit_sales_channels.exists() @pytest.mark.django_db