def test_delete_with_plugins(self): """ Check that plugins and placeholders get correctly deleted when we delete a page! """ Text = self.get_plugin_model('TextPlugin') home = create_page("home", "nav_playground.html", "en") page = create_page("page", "nav_playground.html", "en") page.rescan_placeholders() # create placeholders placeholder = page.placeholders.all()[0] plugin_base = CMSPlugin( plugin_type='TextPlugin', placeholder=placeholder, position=1, language=settings.LANGUAGES[0][0] ) plugin_base = plugin_base.add_root(instance=plugin_base) plugin = Text(body='') plugin_base.set_base_attr(plugin) plugin.save() self.assertEqual(CMSPlugin.objects.count(), 1) self.assertEqual(Text.objects.count(), 1) self.assertTrue(Placeholder.objects.count() > 2) page.delete() home.delete() self.assertEqual(CMSPlugin.objects.count(), 0) self.assertEqual(Text.objects.count(), 0) self.assertEqual(Placeholder.objects.count(), 0) self.assertEqual(Page.objects.count(), 0)
def test_delete_with_plugins(self): """ Check that plugins and placeholders get correctly deleted when we delete a page! """ home = create_page("home", "nav_playground.html", "en") page = create_page("page", "nav_playground.html", "en") page.rescan_placeholders() # create placeholders placeholder = page.placeholders.all()[0] plugin_base = CMSPlugin( plugin_type='TextPlugin', placeholder=placeholder, position=1, language=settings.LANGUAGES[0][0] ) plugin_base = plugin_base.add_root(instance=plugin_base) plugin = Text(body='') plugin_base.set_base_attr(plugin) plugin.save() self.assertEqual(CMSPlugin.objects.count(), 1) self.assertEqual(Text.objects.count(), 1) self.assertTrue(Placeholder.objects.count() > 2) page.delete() home.delete() self.assertEqual(CMSPlugin.objects.count(), 0) self.assertEqual(Text.objects.count(), 0) self.assertEqual(Placeholder.objects.count(), 0) self.assertEqual(Page.objects.count(), 0)
def copy_plugins_to_placeholder(plugins, placeholder, language=None, root_plugin=None): plugin_pairs = [] plugins_by_id = {} for source_plugin in get_bound_plugins(plugins): parent = plugins_by_id.get(source_plugin.parent_id, root_plugin) plugin_model = get_plugin_model(source_plugin.plugin_type) if plugin_model != CMSPlugin: new_plugin = deepcopy(source_plugin) new_plugin.pk = None new_plugin.id = None new_plugin._state.adding = True new_plugin.language = language or new_plugin.language new_plugin.placeholder = placeholder new_plugin.parent = parent new_plugin.numchild = 0 else: new_plugin = plugin_model( language=(language or source_plugin.language), parent=parent, plugin_type=source_plugin.plugin_type, placeholder=placeholder, position=source_plugin.position, ) if parent: new_plugin = parent.add_child(instance=new_plugin) else: new_plugin = CMSPlugin.add_root(instance=new_plugin) if plugin_model != CMSPlugin: new_plugin.copy_relations(source_plugin) plugin_pairs.append((new_plugin, source_plugin)) plugins_by_id[source_plugin.pk] = new_plugin # Backwards compatibility # This magic is needed for advanced plugins like Text Plugins that can have # nested plugins and need to update their content based on the new plugins. for new_plugin, old_plugin in plugin_pairs: new_plugin.post_copy(old_plugin, plugin_pairs) return [pair[0] for pair in plugin_pairs]
def add_plugin(placeholder, plugin_type, language, position='last-child', target=None, **data): """ Add a plugin to a placeholder See docs/extending_cms/api_reference.rst for more info """ # validate placeholder assert isinstance(placeholder, Placeholder) # validate and normalize plugin type plugin_model, plugin_type = _verify_plugin_type(plugin_type) if target: if position == 'last-child': if CMSPlugin.node_order_by: position = 'sorted-child' new_pos = CMSPlugin.objects.filter(parent=target).count() parent_id = target.pk elif position == 'first-child': new_pos = 0 if CMSPlugin.node_order_by: position = 'sorted-child' parent_id = target.pk elif position == 'left': new_pos = target.position if CMSPlugin.node_order_by: position = 'sorted-sibling' parent_id = target.parent_id elif position == 'right': new_pos = target.position + 1 if CMSPlugin.node_order_by: position = 'sorted-sibling' parent_id = target.parent_id else: raise Exception('position not supported: %s' % position) if position == 'last-child' or position == 'first-child': qs = CMSPlugin.objects.filter(language=language, parent=target, position__gte=new_pos, placeholder=placeholder) else: qs = CMSPlugin.objects.filter(language=language, parent=target.parent_id, position__gte=new_pos, placeholder=placeholder) for pl in qs: pl.position += 1 pl.save() else: if position == 'last-child': new_pos = CMSPlugin.objects.filter(language=language, parent__isnull=True, placeholder=placeholder).count() else: new_pos = 0 for pl in CMSPlugin.objects.filter(language=language, parent__isnull=True, position__gte=new_pos, placeholder=placeholder): pl.position += 1 pl.save() parent_id = None plugin_base = CMSPlugin( plugin_type=plugin_type, placeholder=placeholder, position=new_pos, language=language, parent_id=parent_id, ) plugin_base = plugin_base.add_root(instance=plugin_base) if target: plugin_base = plugin_base.move(target, pos=position) plugin = plugin_model(**data) plugin_base.set_base_attr(plugin) plugin.save() return plugin