diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index 5267073b5..97e0c1ec5 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -1084,6 +1084,7 @@ class Event(EventMixin, LoggedModel): s.product = item_map[s.product_id] s.save(force_insert=True) + valid_sales_channel_identifers = set(self.organizer.sales_channels.values_list("identifier", flat=True)) skip_settings = ( 'ticket_secrets_pretix_sig1_pubkey', 'ticket_secrets_pretix_sig1_privkey', @@ -1119,6 +1120,11 @@ class Event(EventMixin, LoggedModel): settings_to_save.append(s) except ValueError: pass + elif s.key.startswith('payment_') and s.key.endswith('__restrict_to_sales_channels'): + data = other.settings._unserialize(s.value, as_type=list) + data = [ident for ident in data if ident in valid_sales_channel_identifers] + s.value = other.settings._serialize(data) + settings_to_save.append(s) else: settings_to_save.append(s) other.settings._objects.bulk_create(settings_to_save) diff --git a/src/tests/base/test_event_clone.py b/src/tests/base/test_event_clone.py index 6464e8467..7f81478a1 100644 --- a/src/tests/base/test_event_clone.py +++ b/src/tests/base/test_event_clone.py @@ -225,8 +225,11 @@ def test_full_clone_cross_organizer_differences(): organizer2 = Organizer.objects.create(name='Dummy2', slug='dummy2') membership_type = organizer.membership_types.create(name="Membership") plan = SeatingPlan.objects.create(name="Plan", organizer=organizer, layout="{}") - sc = organizer.sales_channels.get(identifier="web") - sc2 = organizer2.sales_channels.get(identifier="web") + sc1_a = organizer.sales_channels.get(identifier="web") + sc1_b = organizer.sales_channels.create(identifier="b") + sc1_c = organizer.sales_channels.create(identifier="c") + sc2_a = organizer2.sales_channels.get(identifier="web") + sc2_c = organizer2.sales_channels.create(identifier="c") event = Event.objects.create( organizer=organizer, name='Dummy', slug='dummy', @@ -237,15 +240,20 @@ def test_full_clone_cross_organizer_differences(): seating_plan=plan, all_sales_channels=False, ) - event.limit_sales_channels.add(sc) + event.limit_sales_channels.add(sc1_a) + event.limit_sales_channels.add(sc1_b) + event.limit_sales_channels.add(sc1_c) item1 = event.items.create(name="Ticket", default_price=23, grant_membership_type=membership_type, all_sales_channels=False) - item1.limit_sales_channels.add(sc) + item1.limit_sales_channels.add(sc1_a) item2 = event.items.create(name="T-shirt", default_price=15) item2.require_membership_types.add(membership_type) + event.settings.payment_giftcard__enabled = True + event.settings.payment_giftcard__restrict_to_sales_channels = ['web', 'b', 'c'] + copied_event = Event.objects.create( organizer=organizer2, name='Dummy2', slug='dummy2', date_from=datetime.datetime(2022, 4, 15, 9, 0, 0, tzinfo=datetime.timezone.utc), @@ -257,11 +265,14 @@ def test_full_clone_cross_organizer_differences(): assert organizer2.seating_plans.count() == 1 assert organizer2.seating_plans.get().layout == plan.layout assert copied_event.seating_plan.organizer == organizer2 - assert copied_event.limit_sales_channels.get() == sc2 + assert set(copied_event.limit_sales_channels.all()) == {sc2_a, sc2_c} assert event.seating_plan.organizer == organizer copied_item1 = copied_event.items.get(name=item1.name) copied_item2 = copied_event.items.get(name=item2.name) assert copied_item1.grant_membership_type is None assert copied_item2.require_membership_types.count() == 0 - assert copied_item1.limit_sales_channels.get() == sc2 + assert copied_item1.limit_sales_channels.get() == sc2_a + + assert event.settings.get('payment_giftcard__restrict_to_sales_channels', as_type=list) == ['web', 'b', 'c'] + assert copied_event.settings.get('payment_giftcard__restrict_to_sales_channels', as_type=list) == ['web', 'c']