diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index 16072911df..7c11c7beac 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -877,6 +877,8 @@ class Event(EventMixin, LoggedModel): ItemProgramTime, ItemVariationMetaValue, Question, Quota, ) + is_cross_organizer = other.organizer_id != self.organizer_id + # Note: avoid self.set_active_plugins(), it causes trouble e.g. for the badges plugin. # Plugins can create data in installed() hook based on existing data of the event. # Calling set_active_plugins() results in defaults being created while actually data @@ -905,6 +907,15 @@ class Event(EventMixin, LoggedModel): for emv in EventMetaValue.objects.filter(event=other): emv.pk = None emv.event = self + if is_cross_organizer: + try: + emv.property = self.organizer.meta_properties.get(name=emv.property.name) + except EventMetaProperty.DoesNotExist: + meta_prop = emv.property + meta_prop.pk = None + meta_prop.organizer = self.organizer + meta_prop.save(force_insert=True) + emv.property = meta_prop emv.save(force_insert=True) for fl in EventFooterLink.objects.filter(event=other): @@ -958,13 +969,13 @@ class Event(EventMixin, LoggedModel): if i.tax_rule_id: i.tax_rule = tax_map[i.tax_rule_id] - if i.grant_membership_type and other.organizer_id != self.organizer_id: + if i.grant_membership_type and is_cross_organizer: i.grant_membership_type = None i.save() # no force_insert since i.picture.save could have already inserted i.log_action('pretix.object.cloned') - if require_membership_types and other.organizer_id == self.organizer_id: + if require_membership_types and not is_cross_organizer: i.require_membership_types.set(require_membership_types) if not i.all_sales_channels: @@ -979,7 +990,7 @@ class Event(EventMixin, LoggedModel): v._prefetched_objects_cache = {} v.save(force_insert=True) - if require_membership_types and other.organizer_id == self.organizer_id: + if require_membership_types and not is_cross_organizer: v.require_membership_types.set(require_membership_types) if not v.all_sales_channels: v.limit_sales_channels.set(self.organizer.sales_channels.filter(identifier__in=[s.identifier for s in limit_sales_channels]))