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')
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')
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()
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"))
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