diff --git a/src/pretix/api/serializers/exporters.py b/src/pretix/api/serializers/exporters.py index 9e864a6e2a..53ec563e08 100644 --- a/src/pretix/api/serializers/exporters.py +++ b/src/pretix/api/serializers/exporters.py @@ -53,6 +53,13 @@ class ExporterSerializer(serializers.Serializer): input_parameters = SerializerDescriptionField(source='_serializer') +class PrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField): + def to_representation(self, value): + if isinstance(value, int): + return value + return super().to_representation(value) + + class JobRunSerializer(serializers.Serializer): def __init__(self, *args, **kwargs): ex = kwargs.pop('exporter') @@ -78,7 +85,7 @@ class JobRunSerializer(serializers.Serializer): break if isinstance(v, forms.ModelMultipleChoiceField): - self.fields[k] = serializers.PrimaryKeyRelatedField( + self.fields[k] = PrimaryKeyRelatedField( queryset=v.queryset, required=v.required, allow_empty=not v.required, @@ -86,7 +93,7 @@ class JobRunSerializer(serializers.Serializer): many=True ) elif isinstance(v, forms.ModelChoiceField): - self.fields[k] = serializers.PrimaryKeyRelatedField( + self.fields[k] = PrimaryKeyRelatedField( queryset=v.queryset, required=v.required, allow_null=not v.required, @@ -108,3 +115,10 @@ class JobRunSerializer(serializers.Serializer): ) else: self.fields[k] = FormFieldWrapperField(form_field=v, required=v.required, allow_null=not v.required) + + def to_internal_value(self, data): + for k, v in self.fields.items(): + if isinstance(v, serializers.ManyRelatedField) and k not in data: + data[k] = [] + data = super().to_internal_value(data) + return data diff --git a/src/tests/api/test_exporters.py b/src/tests/api/test_exporters.py index 9a860c80c5..3afdf947c4 100644 --- a/src/tests/api/test_exporters.py +++ b/src/tests/api/test_exporters.py @@ -85,7 +85,7 @@ def test_org_validate_events(token_client, organizer, team, event): '_format': 'xlsx', }, format='json') assert resp.status_code == 400 - assert resp.data == {"events": ["This field is required."]} + assert resp.data == {"events": ["This list may not be empty."]} resp = token_client.post('/api/v1/organizers/{}/exporters/orderlist/run/'.format(organizer.slug), data={ '_format': 'xlsx',