diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index 8a02cf5ebe..d0cb677894 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -870,10 +870,12 @@ class Event(EventMixin, LoggedModel): for i in Item.objects.filter(event=other).prefetch_related( 'variations', 'limit_sales_channels', 'require_membership_types', 'variations__limit_sales_channels', 'variations__require_membership_types', + 'matched_by_cross_selling_categories', ): vars = list(i.variations.all()) require_membership_types = list(i.require_membership_types.all()) limit_sales_channels = list(i.limit_sales_channels.all()) + matched_by_cross_selling_categories = list(i.matched_by_cross_selling_categories.all()) item_map[i.pk] = i i.pk = None i.event = self @@ -911,6 +913,9 @@ class Event(EventMixin, LoggedModel): 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])) + if matched_by_cross_selling_categories: + i.matched_by_cross_selling_categories.set([category_map[c.pk] for c in matched_by_cross_selling_categories]) + for i in self.items.filter(hidden_if_item_available__isnull=False): i.hidden_if_item_available = item_map[i.hidden_if_item_available_id] i.save() @@ -1077,7 +1082,7 @@ class Event(EventMixin, LoggedModel): s.object = self s.pk = None - if s.value.startswith('file://') and settings_hierarkey.get_declared_type(s.key) == File: + if s.value.startswith('file://') and secross_sell_categoryttings_hierarkey.get_declared_type(s.key) == File: fi = default_storage.open(s.value[len('file://'):], 'rb') nonce = get_random_string(length=8) fname_base = clean_filename(os.path.basename(s.value)) diff --git a/src/tests/base/test_event_clone.py b/src/tests/base/test_event_clone.py index 4099342afc..aa235549cc 100644 --- a/src/tests/base/test_event_clone.py +++ b/src/tests/base/test_event_clone.py @@ -65,6 +65,8 @@ def test_full_clone_same_organizer(): item_meta = event.item_meta_properties.create(name="Bla") tax_rule = event.tax_rules.create(name="VAT", rate=19) category = event.categories.create(name="Tickets") + cross_sell_category = event.categories.create(name="Recommendations", cross_selling_mode="only", + cross_selling_condition="products") q1 = event.quotas.create(name="Quota 1", size=5) q2 = event.quotas.create(name="Quota 2", size=0, closed=True) @@ -88,6 +90,7 @@ def test_full_clone_same_organizer(): q1.items.add(item1) q2.items.add(item2) q2.variations.add(item2v) + cross_sell_category.cross_selling_match_products.add(item1) event.discounts.create(internal_name="Fake discount") question1 = event.questions.create(question="Yes or no", type=Question.TYPE_BOOLEAN) @@ -156,7 +159,7 @@ def test_full_clone_same_organizer(): copied_item1 = copied_event.items.get(name=item1.name) copied_item2 = copied_event.items.get(name=item2.name) assert copied_item1.tax_rule == copied_event.tax_rules.get() - assert copied_item1.category == copied_event.categories.get() + assert copied_item1.category == copied_event.categories.get(name='Tickets') assert copied_item1.limit_sales_channels.get() == sc assert copied_item1.meta_data == item1.meta_data assert copied_item2.variations.get().meta_data == item2v.meta_data @@ -166,7 +169,7 @@ def test_full_clone_same_organizer(): assert copied_item2.variations.get().limit_sales_channels.get() == sc assert copied_item2.require_membership_types.count() == 1 assert copied_item2.require_membership_types.get() == membership_type - assert copied_item1.addons.get().addon_category == copied_event.categories.get() + assert copied_item1.addons.get().addon_category == copied_event.categories.get(name='Tickets') assert copied_item1.bundles.get().bundled_item == copied_item2 assert copied_item1.bundles.get().bundled_variation == copied_item2.variations.get() assert copied_item2.hidden_if_item_available == copied_item1 @@ -174,6 +177,9 @@ def test_full_clone_same_organizer(): assert copied_q2.items.get() == copied_item2 assert copied_q2.variations.get() == copied_item2.variations.get() + copied_cross_sell_category = copied_event.categories.get(name=cross_sell_category.name) + assert copied_cross_sell_category.cross_selling_match_products.get() == copied_item1 + copied_question1 = copied_event.questions.get(type=question1.type) copied_question2 = copied_event.questions.get(type=question2.type) assert copied_question2.dependency_question == copied_question1