mirror of
https://github.com/pretix/pretix.git
synced 2026-08-22 12:42:00 +00:00
API: Fix creation of embedded variations with explicit sales channels
This commit is contained in:
@@ -76,7 +76,9 @@ class InlineItemVariationSerializer(SalesChannelMigrationMixin, I18nAwareModelSe
|
|||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.fields['require_membership_types'].queryset = lazy(lambda: self.context['event'].organizer.membership_types.all(), QuerySet)
|
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):
|
def validate_meta_data(self, value):
|
||||||
for key in value['meta_data'].keys():
|
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['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['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['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):
|
def validate(self, data):
|
||||||
data = super().validate(data)
|
data = super().validate(data)
|
||||||
@@ -371,10 +374,13 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
|
|||||||
|
|
||||||
for variation_data in variations_data:
|
for variation_data in variations_data:
|
||||||
require_membership_types = variation_data.pop('require_membership_types', [])
|
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', {})
|
var_meta_data = variation_data.pop('meta_data', {})
|
||||||
v = ItemVariation.objects.create(item=item, **variation_data)
|
v = ItemVariation.objects.create(item=item, **variation_data)
|
||||||
if require_membership_types:
|
if require_membership_types:
|
||||||
v.require_membership_types.add(*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:
|
if var_meta_data is not None:
|
||||||
for key, value in var_meta_data.items():
|
for key, value in var_meta_data.items():
|
||||||
|
|||||||
@@ -585,7 +585,7 @@ class CheckinListOrderPositionSerializer(OrderPositionSerializer):
|
|||||||
self.fields['item'] = ItemSerializer(read_only=True, context=self.context)
|
self.fields['item'] = ItemSerializer(read_only=True, context=self.context)
|
||||||
|
|
||||||
if 'variation' in self.context['expand']:
|
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']:
|
if 'answers.question' in self.context['expand']:
|
||||||
self.fields['answers'].child.fields['question'] = QuestionSerializer(read_only=True)
|
self.fields['answers'].child.fields['question'] = QuestionSerializer(read_only=True)
|
||||||
|
|||||||
@@ -590,7 +590,28 @@ def test_item_create_with_variation(token_client, organizer, event, item, catego
|
|||||||
"meta_data": {
|
"meta_data": {
|
||||||
"day": "Wednesday",
|
"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'
|
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 new_item.variations.first().all_sales_channels is True
|
||||||
assert not new_item.variations.first().limit_sales_channels.exists()
|
assert not new_item.variations.first().limit_sales_channels.exists()
|
||||||
assert new_item.variations.first().meta_data == {"day": "Wednesday"}
|
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
|
@pytest.mark.django_db
|
||||||
|
|||||||
Reference in New Issue
Block a user