From 13c40f9bb7f4238e16e3816e5adc376028a18f2b Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 20 Dec 2024 14:08:39 +0100 Subject: [PATCH] API: Fix sales channels when copying events (Z#23177154, Z#23169537) --- src/pretix/api/serializers/__init__.py | 2 +- src/pretix/api/serializers/event.py | 9 ++++-- src/tests/api/test_events.py | 45 ++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/pretix/api/serializers/__init__.py b/src/pretix/api/serializers/__init__.py index a0c83e3de3..f6651425a8 100644 --- a/src/pretix/api/serializers/__init__.py +++ b/src/pretix/api/serializers/__init__.py @@ -103,7 +103,7 @@ class SalesChannelMigrationMixin: ] }) - if data["sales_channels"] == all_channels: + if set(data["sales_channels"]) == all_channels: data["all_sales_channels"] = True data["limit_sales_channels"] = [] else: diff --git a/src/pretix/api/serializers/event.py b/src/pretix/api/serializers/event.py index c231c04bab..530166370b 100644 --- a/src/pretix/api/serializers/event.py +++ b/src/pretix/api/serializers/event.py @@ -437,21 +437,24 @@ class CloneEventSerializer(EventSerializer): testmode = validated_data.pop('testmode', None) has_subevents = validated_data.pop('has_subevents', None) tz = validated_data.pop('timezone', None) - sales_channels = validated_data.pop('sales_channels', None) + all_sales_channels = validated_data.pop('all_sales_channels', None) + limit_sales_channels = validated_data.pop('limit_sales_channels', None) date_admission = validated_data.pop('date_admission', None) new_event = super().create({**validated_data, 'plugins': None}) event = Event.objects.filter(slug=self.context['event'], organizer=self.context['organizer'].pk).first() new_event.copy_data_from(event, skip_meta_data='meta_data' in validated_data) + print("s", all_sales_channels, limit_sales_channels) if plugins is not None: new_event.set_active_plugins(plugins) if is_public is not None: new_event.is_public = is_public if testmode is not None: new_event.testmode = testmode - if sales_channels is not None: - new_event.sales_channels = sales_channels + if all_sales_channels is not None or limit_sales_channels is not None: + new_event.all_sales_channels = all_sales_channels + new_event.limit_sales_channels.set(limit_sales_channels) if has_subevents is not None: new_event.has_subevents = has_subevents if has_subevents is not None: diff --git a/src/tests/api/test_events.py b/src/tests/api/test_events.py index 6f416dfb77..2a390f0781 100644 --- a/src/tests/api/test_events.py +++ b/src/tests/api/test_events.py @@ -497,6 +497,51 @@ def test_event_create_with_clone(token_client, organizer, event, meta_prop, urls assert cloned_event.plugins == "" +@pytest.mark.django_db +@pytest.mark.parametrize("urlstyle", [ + '/api/v1/organizers/{}/events/{}/clone/', + '/api/v1/organizers/{}/events/?clone_from={}', +]) +def test_event_create_with_clone_migrate_sales_channels(token_client, organizer, event, meta_prop, urlstyle): + with scopes_disabled(): + all_channels = list(organizer.sales_channels.values_list("identifier", flat=True)) + resp = token_client.post( + urlstyle.format(organizer.slug, event.slug), + { + "name": { + "de": "Demo Konference 2020 Test", + "en": "Demo Conference 2020 Test" + }, + "live": False, + "testmode": True, + "currency": "EUR", + "date_from": "2018-12-27T10:00:00Z", + "date_to": "2018-12-28T10:00:00Z", + "date_admission": "2018-12-27T08:00:00Z", + "is_public": False, + "presale_start": None, + "presale_end": None, + "location": None, + "slug": "2030", + "sales_channels": all_channels, + "meta_data": { + "type": "Workshop" + }, + "plugins": [ + "pretix.plugins.ticketoutputpdf" + ], + "timezone": "Europe/Vienna" + }, + format='json' + ) + + assert resp.status_code == 201 + with scopes_disabled(): + cloned_event = Event.objects.get(organizer=organizer.pk, slug='2030') + assert cloned_event.all_sales_channels + assert not cloned_event.limit_sales_channels.exists() + + @pytest.mark.django_db def test_event_create_with_clone_unknown_source(user, user_client, organizer, event): with scopes_disabled():