def copy_plugins(self, request):
        """
        POST request should have the following data:

        - source_language
        - source_placeholder_id
        - source_plugin_id (optional)
        - target_language
        - target_placeholder_id
        - target_plugin_id (optional, new parent)
        """
        source_language = request.POST['source_language']
        source_placeholder_id = request.POST['source_placeholder_id']
        source_plugin_id = request.POST.get('source_plugin_id', None)
        target_language = request.POST['target_language']
        target_placeholder_id = request.POST['target_placeholder_id']
        target_plugin_id = request.POST.get('target_plugin_id', None)
        source_placeholder = get_object_or_404(Placeholder, pk=source_placeholder_id)
        target_placeholder = get_object_or_404(Placeholder, pk=target_placeholder_id)
        if not target_language or not target_language in get_language_list():
            return HttpResponseBadRequest(_("Language must be set to a supported language!"))
        if source_plugin_id:
            source_plugin = get_object_or_404(CMSPlugin, pk=source_plugin_id)
            reload_required = requires_reload(PLUGIN_COPY_ACTION, [source_plugin])
            plugins = list(
                source_placeholder.cmsplugin_set.filter(tree_id=source_plugin.tree_id, lft__gte=source_plugin.lft,
                                                        rght__lte=source_plugin.rght).order_by('tree_id', 'level', 'position'))
        else:
            plugins = list(
                source_placeholder.cmsplugin_set.filter(language=source_language).order_by('tree_id', 'level', 'position'))
            reload_required = requires_reload(PLUGIN_COPY_ACTION, plugins)
        if not self.has_copy_plugin_permission(request, source_placeholder, target_placeholder, plugins):
            return HttpResponseForbidden(_('You do not have permission to copy these plugins.'))
        copy_plugins.copy_plugins_to(plugins, target_placeholder, target_language, target_plugin_id)
        plugin_list = CMSPlugin.objects.filter(language=target_language, placeholder=target_placeholder).order_by(
            'tree_id', 'level', 'position')
        reduced_list = []
        for plugin in plugin_list:
            reduced_list.append(
                {'id': plugin.pk, 'type': plugin.plugin_type, 'parent': plugin.parent_id, 'position': plugin.position,
                    'desc': force_unicode(plugin.get_short_description())})
        self.post_copy_plugins(request, source_placeholder, target_placeholder, plugins)
        json_response = {'plugin_list': reduced_list, 'reload': reload_required}
        return HttpResponse(simplejson.dumps(json_response), content_type='application/json')
 def move_plugin(self, request):
     """
     POST request with following parameters:
     -plugin_id
     -placeholder_id
     -plugin_language (optional)
     -plugin_parent (optional)
     -plugin_order (array, optional)
     """
     plugin = CMSPlugin.objects.get(pk=int(request.POST['plugin_id']))
     placeholder = Placeholder.objects.get(pk=request.POST['placeholder_id'])
     parent_id = request.POST.get('plugin_parent', None)
     language = request.POST.get('plugin_language', plugin.language)
     if not parent_id:
         parent_id = None
     else:
         parent_id = int(parent_id)
     order = request.POST.getlist("plugin_order[]")
     if not self.has_move_plugin_permission(request, plugin, placeholder):
         return HttpResponseForbidden(_("You have no permission to move this plugin"))
     if plugin.parent_id != parent_id:
         if parent_id:
             parent = CMSPlugin.objects.get(pk=parent_id)
             if parent.placeholder_id != placeholder.pk:
                 return HttpResponseBadRequest('parent must be in the same placeholder')
             if parent.language != language:
                 return HttpResponseBadRequest('parent must be in the same language as plugin_language')
         else:
             parent = None
         plugin.move_to(parent, position='last-child')
     try:
         template = self.get_placeholder_template(request, placeholder)
         has_reached_plugin_limit(placeholder, plugin.plugin_type, plugin.language, template=template)
     except PluginLimitReached as er:
         return HttpResponseBadRequest(er)
     plugin.save()
     for child in plugin.get_descendants(include_self=True):
         child.placeholder = placeholder
         child.language = language
         child.save()
     plugins = CMSPlugin.objects.filter(parent=parent_id, placeholder=placeholder)
     for level_plugin in plugins:
         x = 0
         for pk in order:
             if level_plugin.pk == int(pk):
                 level_plugin.position = x
                 level_plugin.save()
                 break
             x += 1
     self.post_move_plugin(request, plugin)
     json_response = {'reload': requires_reload(PLUGIN_MOVE_ACTION, [plugin])}
     return HttpResponse(simplejson.dumps(json_response), content_type='application/json')
 def move_plugin(self, request):
     """
     POST request with following parameters:
     -plugin_id
     -placeholder_id
     -plugin_language (optional)
     -plugin_parent (optional)
     -plugin_order (array, optional)
     """
     plugin = CMSPlugin.objects.get(pk=int(request.POST['plugin_id']))
     placeholder = Placeholder.objects.get(
         pk=request.POST['placeholder_id'])
     parent_id = request.POST.get('plugin_parent', None)
     language = request.POST.get('plugin_language', plugin.language)
     if not parent_id:
         parent_id = None
     else:
         parent_id = int(parent_id)
     order = request.POST.getlist("plugin_order[]")
     if not self.has_move_plugin_permission(request, plugin, placeholder):
         return HttpResponseForbidden(
             _("You have no permission to move this plugin"))
     if plugin.parent_id != parent_id:
         if parent_id:
             parent = CMSPlugin.objects.get(pk=parent_id)
             if parent.placeholder_id != placeholder.pk:
                 return HttpResponseBadRequest(
                     'parent must be in the same placeholder')
             if parent.language != language:
                 return HttpResponseBadRequest(
                     'parent must be in the same language as plugin_language'
                 )
         else:
             parent = None
         plugin.move_to(parent, position='last-child')
     try:
         template = self.get_placeholder_template(request, placeholder)
         has_reached_plugin_limit(placeholder,
                                  plugin.plugin_type,
                                  plugin.language,
                                  template=template)
     except PluginLimitReached as er:
         return HttpResponseBadRequest(er)
     plugin.save()
     for child in plugin.get_descendants(include_self=True):
         child.placeholder = placeholder
         child.language = language
         child.save()
     plugins = CMSPlugin.objects.filter(parent=parent_id,
                                        placeholder=placeholder)
     for level_plugin in plugins:
         x = 0
         for pk in order:
             if level_plugin.pk == int(pk):
                 level_plugin.position = x
                 level_plugin.save()
                 break
             x += 1
     self.post_move_plugin(request, plugin)
     json_response = {
         'reload': requires_reload(PLUGIN_MOVE_ACTION, [plugin])
     }
     return HttpResponse(simplejson.dumps(json_response),
                         content_type='application/json')
    def copy_plugins(self, request):
        """
        POST request should have the following data:

        - source_language
        - source_placeholder_id
        - source_plugin_id (optional)
        - target_language
        - target_placeholder_id
        - target_plugin_id (optional, new parent)
        """
        source_language = request.POST['source_language']
        source_placeholder_id = request.POST['source_placeholder_id']
        source_plugin_id = request.POST.get('source_plugin_id', None)
        target_language = request.POST['target_language']
        target_placeholder_id = request.POST['target_placeholder_id']
        target_plugin_id = request.POST.get('target_plugin_id', None)
        source_placeholder = get_object_or_404(Placeholder,
                                               pk=source_placeholder_id)
        target_placeholder = get_object_or_404(Placeholder,
                                               pk=target_placeholder_id)
        if not target_language or not target_language in get_language_list():
            return HttpResponseBadRequest(
                _("Language must be set to a supported language!"))
        if source_plugin_id:
            source_plugin = get_object_or_404(CMSPlugin, pk=source_plugin_id)
            reload_required = requires_reload(PLUGIN_COPY_ACTION,
                                              [source_plugin])
            plugins = list(
                source_placeholder.cmsplugin_set.filter(
                    tree_id=source_plugin.tree_id,
                    lft__gte=source_plugin.lft,
                    rght__lte=source_plugin.rght).order_by(
                        'tree_id', 'level', 'position'))
        else:
            plugins = list(
                source_placeholder.cmsplugin_set.filter(
                    language=source_language).order_by('tree_id', 'level',
                                                       'position'))
            reload_required = requires_reload(PLUGIN_COPY_ACTION, plugins)
        if not self.has_copy_plugin_permission(request, source_placeholder,
                                               target_placeholder, plugins):
            return HttpResponseForbidden(
                _('You do not have permission to copy these plugins.'))
        copy_plugins.copy_plugins_to(plugins, target_placeholder,
                                     target_language, target_plugin_id)
        plugin_list = CMSPlugin.objects.filter(
            language=target_language,
            placeholder=target_placeholder).order_by('tree_id', 'level',
                                                     'position')
        reduced_list = []
        for plugin in plugin_list:
            reduced_list.append({
                'id':
                plugin.pk,
                'type':
                plugin.plugin_type,
                'parent':
                plugin.parent_id,
                'position':
                plugin.position,
                'desc':
                force_unicode(plugin.get_short_description())
            })
        self.post_copy_plugins(request, source_placeholder, target_placeholder,
                               plugins)
        json_response = {
            'plugin_list': reduced_list,
            'reload': reload_required
        }
        return HttpResponse(simplejson.dumps(json_response),
                            content_type='application/json')