Search code examples
pythondjangopython-2.7django-cmsdjango-management-command

Wrote a command that creates a Django-CMS plugin from an existing one


I have a plugin (PodcastPlugin) that contains two ManyToManyField (podcasts and custom_podcasts). I want to create a Django command that creates a new plugin on the same page and placeholder with the old instances. Old Pluguin[![Old Pluguin screenshot] I can create a new plugin but it does not copy the old instances of podcasts and custom_podcasts into the newly created PodcastPlugin. Created Plugin Here is my code:

from cms.models.pagemodel import Page
from cms.api import add_plugin


for page in Page.objects.all():
    for placeholder in page.placeholders.filter(page=263):
        for plugin in placeholder.get_plugins_list():
            if plugin.plugin_type == 'PodcastPlugin':
                for custom_ids in plugin.get_plugin_instance()[0].custom_podcasts.values_list('id'):
                        for podcasts_ids in plugin.get_plugin_instance()[0].podcasts.values_list('id'):
                            add_plugin(
                                placeholder=placeholder,
                                plugin_type='PodcastPlugin',
                                podcasts=[podcasts_ids[0]],
                                cmsplugin_ptr_id=plugin.id,
                                custom_podcasts=[custom_ids[0]],
                                title='New Podcast',
                                language='de'
                            )

Solution

  • I solved the problem by looping through the instances of both foreign keys (podcasts and custom_podcasts) and then using notation and to save it.

    Here is my solution in case anyone come across this:

        for page in Page.objects.all():
            for placeholder in page.placeholders.all():
                for plugin in placeholder.get_plugins_list():
                    if plugin.plugin_type == PodcastPlugin:
                        for podcasts_ids in plugin.get_plugin_instance()[0].podcasts.values_list('id'):
                            podcast_ids_list.append(podcasts_ids[0])
                        for custom_ids in plugin.get_plugin_instance()[0].custom_podcasts.values_list('id'):
                            custom_ids_list.append(custom_ids[0])
    
                        new_plugin = add_plugin(
                            placeholder=placeholder,
                            plugin_type=pluginname,
                            cmsplugin_ptr_id=plugin.id,
                            created_at=plugin.get_plugin_instance()[0].created_at,
                            podcasts_by_topic=plugin.get_plugin_instance()[0].podcasts_by_topic,
                            publication_date=plugin.get_plugin_instance()[0].publication_date,
                            publication_end_date=plugin.get_plugin_instance()[0].publication_end_date,
                            limit=plugin.get_plugin_instance()[0].limit,
                            collapse=plugin.get_plugin_instance()[0].collapse,
                            title=plugin.get_short_description() + ' (NEW)',
                            language='de'
                        )
                        for values in podcast_ids_list:
                            new_plugin.podcasts.add(values)
                        for values in custom_ids_list:
                            new_plugin.custom_podcasts.add(values)
                        new_plugin.save()