diff --git a/doc/api/resources/events.rst b/doc/api/resources/events.rst index 0a4caae790..80d8f86149 100644 --- a/doc/api/resources/events.rst +++ b/doc/api/resources/events.rst @@ -343,8 +343,8 @@ Endpoints Creates a new event with properties as set in the request body. The properties that are copied are: ``is_public``, ``testmode``, ``has_subevents``, settings, plugin settings, items, variations, add-ons, quotas, categories, tax rules, questions. - If the ``plugins``, ``has_subevents`` and/or ``is_public`` fields are present in the post body this will determine their - value. Otherwise their value will be copied from the existing event. + If the ``plugins``, ``has_subevents``, ``meta_data`` and/or ``is_public`` fields are present in the post body this will + determine their value. Otherwise their value will be copied from the existing event. Please note that you can only copy from events under the same organizer this way. Use the ``clone_from`` parameter when creating a new event for this instead. diff --git a/src/pretix/api/serializers/event.py b/src/pretix/api/serializers/event.py index d087de736c..abac72ff89 100644 --- a/src/pretix/api/serializers/event.py +++ b/src/pretix/api/serializers/event.py @@ -424,7 +424,7 @@ class CloneEventSerializer(EventSerializer): 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) + new_event.copy_data_from(event, skip_meta_data='meta_data' in validated_data) if plugins is not None: new_event.set_active_plugins(plugins) diff --git a/src/pretix/api/views/event.py b/src/pretix/api/views/event.py index 08a516fd6a..f1c26aaf5b 100644 --- a/src/pretix/api/views/event.py +++ b/src/pretix/api/views/event.py @@ -254,7 +254,7 @@ class EventViewSet(viewsets.ModelViewSet): new_event = serializer.save(organizer=self.request.organizer) if copy_from: - new_event.copy_data_from(copy_from) + new_event.copy_data_from(copy_from, skip_meta_data='meta_data' in serializer.validated_data) if plugins is not None: new_event.set_active_plugins(plugins) diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index 0d8b0e2c91..86c3aa0d2f 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -775,7 +775,7 @@ class Event(EventMixin, LoggedModel): time(hour=23, minute=59, second=59) ), tz) - def copy_data_from(self, other): + def copy_data_from(self, other, skip_meta_data=False): from pretix.presale.style import regenerate_css from ..signals import event_copy_data @@ -798,10 +798,11 @@ class Event(EventMixin, LoggedModel): self.save() self.log_action('pretix.object.cloned', data={'source': other.slug, 'source_id': other.pk}) - for emv in EventMetaValue.objects.filter(event=other): - emv.pk = None - emv.event = self - emv.save(force_insert=True) + if not skip_meta_data: + for emv in EventMetaValue.objects.filter(event=other): + emv.pk = None + emv.event = self + emv.save(force_insert=True) for fl in EventFooterLink.objects.filter(event=other): fl.pk = None diff --git a/src/tests/api/test_events.py b/src/tests/api/test_events.py index 5903071eaa..892c1b362e 100644 --- a/src/tests/api/test_events.py +++ b/src/tests/api/test_events.py @@ -416,7 +416,7 @@ def test_event_create_with_clone(token_client, organizer, event, meta_prop, urls "location": None, "slug": "2030", "meta_data": { - "type": "Conference" + "type": "Workshop" }, "plugins": [ "pretix.plugins.ticketoutputpdf" @@ -434,7 +434,7 @@ def test_event_create_with_clone(token_client, organizer, event, meta_prop, urls assert cloned_event.testmode assert cloned_event.date_admission.isoformat() == "2018-12-27T08:00:00+00:00" assert organizer.events.get(slug="2030").meta_values.filter( - property__name=meta_prop.name, value="Conference" + property__name=meta_prop.name, value="Workshop" ).exists() assert cloned_event.settings.timezone == "Europe/Vienna" @@ -454,9 +454,6 @@ def test_event_create_with_clone(token_client, organizer, event, meta_prop, urls "presale_end": None, "location": None, "slug": "2031", - "meta_data": { - "type": "Conference" - } }, format='json' )