diff --git a/doc/api/resources/exporters.rst b/doc/api/resources/exporters.rst index ed934d7b41..ae10256918 100644 --- a/doc/api/resources/exporters.rst +++ b/doc/api/resources/exporters.rst @@ -111,7 +111,7 @@ Listing available exporters "input_parameters": [ { "name": "events", - "required": true + "required": false }, { "name": "_format", diff --git a/src/pretix/api/serializers/exporters.py b/src/pretix/api/serializers/exporters.py index f1fe60434a..3e2fd835a5 100644 --- a/src/pretix/api/serializers/exporters.py +++ b/src/pretix/api/serializers/exporters.py @@ -93,7 +93,7 @@ class JobRunSerializer(serializers.Serializer): if events is not None and not isinstance(ex, OrganizerLevelExportMixin): self.fields["events"] = serializers.SlugRelatedField( queryset=events, - required=True, + required=False, allow_empty=False, slug_field='slug', many=True @@ -156,8 +156,9 @@ class JobRunSerializer(serializers.Serializer): def to_internal_value(self, data): if isinstance(data, QueryDict): data = data.copy() + for k, v in self.fields.items(): - if isinstance(v, serializers.ManyRelatedField) and k not in data: + if isinstance(v, serializers.ManyRelatedField) and k not in data and k != "events": data[k] = [] for fk in self.fields.keys(): diff --git a/src/tests/api/test_exporters.py b/src/tests/api/test_exporters.py index 4463d81242..1ae07fd6dc 100644 --- a/src/tests/api/test_exporters.py +++ b/src/tests/api/test_exporters.py @@ -102,7 +102,7 @@ def test_org_list(token_client, organizer, event): c = copy.deepcopy(SAMPLE_EXPORTER_CONFIG) c['input_parameters'].insert(0, { "name": "events", - "required": True + "required": False }) resp = token_client.get('/api/v1/organizers/{}/exporters/'.format(organizer.slug)) assert resp.status_code == 200 @@ -131,6 +131,12 @@ def test_org_validate_events(token_client, organizer, team, event): resp = token_client.post('/api/v1/organizers/{}/exporters/orderlist/run/'.format(organizer.slug), data={ '_format': 'xlsx', }, format='json') + assert resp.status_code == 202 + + resp = token_client.post('/api/v1/organizers/{}/exporters/orderlist/run/'.format(organizer.slug), data={ + '_format': 'xlsx', + 'events': [] + }, format='json') assert resp.status_code == 400 assert resp.data == {"events": ["This list may not be empty."]} @@ -158,6 +164,41 @@ def test_org_validate_events(token_client, organizer, team, event): assert resp.data == {"events": [f"Object with slug={event.slug} does not exist."]} +@pytest.mark.django_db +def test_org_run_limit_events(token_client, organizer, team, event, event2): + resp = token_client.post('/api/v1/organizers/{}/exporters/eventdata/run/'.format(organizer.slug), data={ + '_format': 'default', + }, format='json') + assert resp.status_code == 202 + assert "download" in resp.data + resp = token_client.get("/" + resp.data["download"].split("/", 3)[3]) + assert resp.status_code == 200 + assert resp.getvalue().strip().count(b"\n") == 2 + + resp = token_client.post('/api/v1/organizers/{}/exporters/eventdata/run/'.format(organizer.slug), data={ + '_format': 'default', + 'events': [event.slug], + }, format='json') + assert resp.status_code == 202 + assert "download" in resp.data + resp = token_client.get("/" + resp.data["download"].split("/", 3)[3]) + assert resp.status_code == 200 + assert resp.getvalue().strip().count(b"\n") == 1 + + team.all_events = False + team.limit_events.add(event) + team.save() + + resp = token_client.post('/api/v1/organizers/{}/exporters/eventdata/run/'.format(organizer.slug), data={ + '_format': 'default', + }, format='json') + assert resp.status_code == 202 + assert "download" in resp.data + resp = token_client.get("/" + resp.data["download"].split("/", 3)[3]) + assert resp.status_code == 200 + assert resp.getvalue().strip().count(b"\n") == 1 + + @pytest.mark.django_db def test_run_success(token_client, organizer, team, event): resp = token_client.post('/api/v1/organizers/{}/events/{}/exporters/orderlist/run/'.format(organizer.slug, event.slug), data={