Example #1
0
    def remove_plugin(self, request):
        if 'history' in request.path:
            return HttpResponseBadRequest('Invalid Request')

        plugin_id = int(request.POST['plugin_id'])
        plugin = get_object_or_404(
                CMSPlugin.objects.select_related('placeholder'), pk=plugin_id)
        item = NewsItem.objects.get(placeholders=plugin.placeholder)

        if not item.has_change_permission(request):
            return HttpResponseForbidden(
                    _("You do not have permission to remove a plugin"))

        plugin.delete()
        comment = "%(plugin_name)s plugin at position %(position)s in " \
                "%(placeholder)s was deleted." % {
                    'plugin_name': unicode(plugin_pool.get_plugin(
                        plugin.plugin_type).name),
                    'position': plugin.position,
                    'placeholder': plugin.placeholder}

        if _REVERSION:
            make_revision_with_plugins(item, request.user, comment)

        return HttpResponse("%s,%s" % (plugin_id, comment),
                content_type='text/plain')
Example #2
0
    def add_plugin(self, request):
        """ Plugins can be added to an item or another plugin """
        # TODO: Enable number limitations from CMS placeholder configs

        if 'history' in request.path or 'recover' in request.path:
            return HttpResponseBadRequest("error")

        plugin_type = request.POST['plugin_type']
        placeholder_id = request.POST.get('placeholder', None)
        parent_id = request.POST.get('parent_id', None)

        if placeholder_id:
            try:
                placeholder_id = int(placeholder_id)
            except ValueError:
                placeholder_id = None
        if parent_id:
            try:
                parent_id = int(parent_id)
            except ValueError:
                parent_id = None

        if placeholder_id:
            placeholder = get_object_or_404(Placeholder, pk=placeholder_id)
            item = NewsItem.objects.get(placeholders=placeholder)
            if not item.has_change_permission(request):
                raise Http404
            plugin = CMSPlugin(language='en', plugin_type=plugin_type,
                    placeholder=placeholder, position=CMSPlugin.objects.filter(
                        placeholder=placeholder).count())
            plugin.save()
            if _REVERSION:
                make_revision_with_plugins(item, request.user,
                        '%(plugin_name)s plugin added to %(placeholder)s' % {
                            'plugin_name':
                                unicode(plugin_pool.get_plugin(plugin_type).name),
                            'placeholder': placeholder.slot})
        elif parent_id:
            parent = CMSPlugin.objects.select_related('placeholder').get(
                    pk=parent_id)
            item = NewsItem.objects.get(placeholders=parent.placeholder)
            if not item.has_change_permission(request):
                raise Http404
            plugin = CMSPlugin(language='en', plugin_type=plugin_type,
                    placeholder=parent.placeholder, parent=parent,
                    position=CMSPlugin.objects.filter(parent=parent).count())
            plugin.save()
            if _REVERSION:
                make_revision_with_plugins(item, request.user,
                        '%(plugin_name)s plugin added to plugin '
                        '%(plugin)s in %(placeholder)s' % {
                            'plugin_name':
                                unicode(plugin_pool.get_plugin(plugin_type).name),
                            'placeholder': parent.placeholder.slot,
                            'plugin': unicode(parent)})
        else:
            return HttpResponseBadRequest(
                    "Either parent of placeholder is required")

        return HttpResponse(unicode(plugin.pk), content_type='text/plain')
Example #3
0
 def change_template(self, request, object_id):
     page = get_object_or_404(NewsItem, pk=object_id)
     if page.has_change_permission(request):
         to_template = request.POST.get("template", None)
         if to_template in dict(settings.NEWSY_TEMPLATES):
             page.template = to_template
             page.save()
             if "reversion" in settings.INSTALLED_APPS:
                 make_revision_with_plugins(page)
             return HttpResponse(str("ok"))
         else:
             return HttpResponseBadRequest("template not valid")
     else:
         return HttpResponseForbidden()
Example #4
0
    def move_plugin(self, request):
        if 'history' in request.path:
            return HttpResponseBadRequest("Cannot move plugins in history view")

        # Moving a plugin to a new slot
        if 'plugin_id' in request.POST:
            plugin = CMSPlugin.objects.select_related(
                    'placeholder').get(pk=int(request.POST['plugin_id']))
            slot = request.POST['placeholder']

            item = NewsItem.objects.get(placeholders=plugin.placeholder)

            if slot not in get_placeholders(item.template):
                return HttpResponseBadRequest("Invalid target placeholder")

            placeholder = item.placeholders.get(slot=slot)

            plugin.placeholder = placeholder
            plugin.position = CMSPlugin.objects.filter(
                    placeholder=placeholder).count()
            plugin.parent = None
            plugin.save()

            for descendant in plugin.get_descendants():
                descendant.placeholder = placeholder
                descendant.save()

        # Reordering plugins in a slot
        if 'ids' in request.POST:
            plugin_ids = request.POST['ids'].split("_")
            item = None
            for position in range(0, len(plugin_ids)):
                plugin = CMSPlugin.objects.select_related(
                        'placeholder').get(pk=int(plugin_ids[position]))
                if item is None:
                    item = NewsItem.objects.get(
                            placeholders=plugin.placeholder)
                if plugin.position != position:
                    plugin.position = position
                    plugin.save()

        if item and _REVERSION:
            make_revision_with_plugins(item, request.user,
                "Plugins where moved")

        return HttpResponse(str("ok"))
Example #5
0
    def edit_plugin(self, request, plugin_id):
        plugin_id = int(plugin_id)
        recovery = 'history' in request.path or 'recover' in request.path
        if not recovery:
            plugin = get_object_or_404(
                    CMSPlugin.objects.select_related('placeholder'),
                    pk=plugin_id)
            item = NewsItem.objects.get(placeholders=plugin.placeholder)

            if not item.has_change_permission(request):
                raise Http404

            plugin_instance, plugin_admin = plugin.get_plugin_instance(self.admin_site)
        else:
            # history view with reversion
            match = re.search(r'/(?P<version_id>\d+)/edit-plugin/\d+',
                    request.path)
            if not match:
                return HttpResponseBadRequest(
                    'Version id missing from history')
            version = get_object_or_404(Version, pk=match.group('version_id'))
            plugin = None
            instance = None
            for version in version.revision.version_set.all():
                try:
                    version = version.object_version.object
                    log.debug('%s loaded from revision' %
                            (unicode(version),))
                    # Check if base_plugin
                    if version.__class__ == CMSPlugin and version.pk == plugin_id:
                        log.debug('CMSPlugin found')
                        plugin = version
                        continue
                    # Check if plugin
                    if isinstance(version, CMSPlugin) and version.pk == plugin_id:
                        log.debug('CMSPlugin implementation found')
                        instance = version
                except models.FieldDoesNotExist:
                    # Model has changed since version was made
                    log.warning('Model has changed since version was made')
                    continue
                if plugin is not None and instance is not None:
                    break

            if not plugin:
                log.error("Unable to find the base plugin")
                raise Http404('This plugin is not saved in a revision')

            inst, plugin_admin = plugin.get_plugin_instance(self.admin_site)

            if plugin.get_plugin_class().model == CMSPlugin:
                instance = plugin
            elif instance is None:
                raise Http404('This plugin is not saved in a revision')

        plugin_admin.cms_plugin_instance = plugin
        try:
            plugin_admin.placeholder = plugin.placeholder # TODO: what for reversion..? should it be inst ...?
        except Placeholder.DoesNotExist:
            pass

        if request.method == "POST":
            # set the continue flag, otherwise will plugin_admin make redirect to list
            # view, which actually does'nt exists
            request.POST['_continue'] = True

        if _REVERSION and recovery:
            # in case of looking to history just render the plugin content
            context = RequestContext(request)
            return render_to_response(plugin_admin.render_template,
                    plugin_admin.render(context, instance,
                        plugin_admin.placeholder))


        if not plugin_instance:
            # instance doesn't exist, call add view
            response = plugin_admin.add_view(request)
        else:
            # already saved before, call change view
            # we actually have the instance here, but since i won't override
            # change_view method, is better if it will be loaded again, so
            # just pass id to plugin_admin
            response = plugin_admin.change_view(request, unicode(plugin_id))

        if request.method == "POST" and plugin_admin.object_successfully_changed:
            # if reversion is installed, save version of the page plugins
            if _REVERSION and item:
                make_revision_with_plugins(item, request.user,
                        "%(plugin_name)s plugin edited at position "
                        "%(position)s in %(placeholder)s" % {
                            'plugin_name': 
                                unicode(plugin_pool.get_plugin(
                                    plugin.plugin_type).name),
                            'position': plugin.position,
                            'placeholder': plugin.placeholder.slot})

            # read the saved object from plugin_admin - ugly but works
            saved_object = plugin_admin.saved_object

            context = {
                'CMS_MEDIA_URL': get_cms_setting('MEDIA_URL'),
                'plugin': saved_object,
                'is_popup': True,
                'name': unicode(saved_object),
                "type": saved_object.get_plugin_name(),
                'plugin_id': plugin_id,
                'icon': force_escape(escapejs(saved_object.get_instance_icon_src())),
                'alt': force_escape(escapejs(saved_object.get_instance_icon_alt())),
            }
            return render_to_response('admin/cms/page/plugin_forms_ok.html',
                    context, RequestContext(request))

        return response