From e6a1d96c4fbe698066449204144dd452751d461f Mon Sep 17 00:00:00 2001 From: Paulo Date: Tue, 29 Dec 2015 16:43:12 -0500 Subject: [PATCH 1/2] adds fix for #4856 --- cms/models/pluginmodel.py | 2 +- cms/utils/copy_plugins.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cms/models/pluginmodel.py b/cms/models/pluginmodel.py index 37f90d30e25..c684aaec2bc 100644 --- a/cms/models/pluginmodel.py +++ b/cms/models/pluginmodel.py @@ -238,7 +238,7 @@ def save(self, no_signals=False, *args, **kwargs): placeholder_id=self.placeholder_id).count() self.add_root(instance=self) return - super(CMSPlugin, self).save() + super(CMSPlugin, self).save(*args, **kwargs) def reload(self): return CMSPlugin.objects.get(pk=self.pk) diff --git a/cms/utils/copy_plugins.py b/cms/utils/copy_plugins.py index 6e316e511f8..6bff53b0e85 100644 --- a/cms/utils/copy_plugins.py +++ b/cms/utils/copy_plugins.py @@ -29,7 +29,7 @@ def copy_plugins_to(old_plugins, to_placeholder, for idx, plugin in enumerate(new_plugins): if plugin.parent_id is None: plugin.parent_id = parent_plugin_id - plugin.save() + plugin.save(update_fields=['parent']) new_plugins[idx] = plugin.move(parent_plugin, pos="last-child") plugins_ziplist = list(zip(new_plugins, old_plugins)) From 7614d51f95a602923789b144749ea78d23e67875 Mon Sep 17 00:00:00 2001 From: Paulo Date: Tue, 29 Dec 2015 16:57:14 -0500 Subject: [PATCH 2/2] small note on why update_fields --- cms/utils/copy_plugins.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cms/utils/copy_plugins.py b/cms/utils/copy_plugins.py index 6bff53b0e85..ea9075cfdc3 100644 --- a/cms/utils/copy_plugins.py +++ b/cms/utils/copy_plugins.py @@ -29,6 +29,11 @@ def copy_plugins_to(old_plugins, to_placeholder, for idx, plugin in enumerate(new_plugins): if plugin.parent_id is None: plugin.parent_id = parent_plugin_id + # Always use update fields to avoid side-effects. + # In this case "plugin" has invalid values for internal fields + # like numchild. + # The invalid value is only in memory because the instance + # was never updated. plugin.save(update_fields=['parent']) new_plugins[idx] = plugin.move(parent_plugin, pos="last-child")