def delete_view(self, request, object_id, extra_context=None): "The 'delete' admin view for this model." opts = self.model._meta app_label = opts.app_label try: obj = self.queryset(request).get(pk=unquote(object_id)) except self.model.DoesNotExist: # Don't raise Http404 just yet, because we haven't checked # permissions yet. We don't want an unauthenticated user to be able # to determine whether a given object exists. obj = None if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. deleted_objects = [mark_safe(u'%s: <a href="../../%s/">%s</a>' % (escape(force_unicode(capfirst(opts.verbose_name))), object_id, escape(obj))), []] perms_needed = set() get_deleted_objects(deleted_objects, perms_needed, request.user, obj, opts, 1, self.admin_site) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) obj.delete() self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)}) if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../../") return HttpResponseRedirect("../../") context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": opts, "root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) context_instance = template.RequestContext(request, current_app=self.admin_site.name) return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, context_instance=context_instance)
def delete_view(self, request, object_id, extra_context=None): "The 'delete' admin view for this model." opts = self.model._meta app_label = opts.app_label try: obj = self.model._default_manager.get(pk=object_id) except self.model.DoesNotExist: # Don't raise Http404 just yet, because we haven't checked # permissions yet. We don't want an unauthenticated user to be able # to determine whether a given object exists. obj = None if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. deleted_objects = [mark_safe(u'%s: <a href="../../%s/">%s</a>' % (escape(force_unicode(capfirst(opts.verbose_name))), quote(object_id), escape(obj))), []] perms_needed = set() get_deleted_objects(deleted_objects, perms_needed, request.user, obj, opts, 1, self.admin_site) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) obj.delete() self.log_deletion(request, obj, obj_display) self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)}) if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../../") return HttpResponseRedirect("../../") context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": opts, "root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, context_instance=template.RequestContext(request))
def get_delete_view_context(self, request, object_id): opts = self.model._meta app_label = opts.app_label try: obj = self.queryset(request).get(pk=unquote(object_id)) except self.model.DoesNotExist: # Don't raise Http404 just yet, because we haven't checked # permissions yet. We don't want an unauthenticated user to be able # to determine whether a given object exists. obj = None if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. # FIXME <a href=""> tags hardcoded into get_deleted_objects() handled in template via template tag. deleted_objects = [mark_safe(u'%s: <a href="../../%s/">%s</a>' % (escape(force_unicode(capfirst(opts.verbose_name))), object_id, escape(obj))), []] perms_needed = set() get_deleted_objects(deleted_objects, perms_needed, request.user, obj, opts, 1, self.admin_site) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) obj.delete() msg = _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)} self.message_user(request, msg) if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../") return HttpResponseRedirect("../") context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": opts, "root_path": self.admin_site.root_path, "app_label": app_label, } return context
def ajaxdelete_view(self, request, object_id): "The 'delete' admin view for this model." opts = self.model._meta app_label = opts.app_label obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404( _('%(name)s object with primary key %(key)r does not exist.') % {'name': force_text(opts.verbose_name), 'key': escape(object_id)} ) using = router.db_for_write(self.model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed, protected) = get_deleted_objects( [obj], opts, request.user, self.admin_site, using) if perms_needed: return PermissionDenied obj_display = force_text(obj) self.log_deletion(request, obj, obj_display) self.delete_model(request, obj) return HttpResponse('<html><body>OK</body></html>')
def uninstall_form(self, request, queryset): """ The delete view for this model. """ opts = self.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not self.has_delete_permission(request): raise PermissionDenied # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, perms_needed = get_deleted_objects(queryset, opts, request.user, self.admin_site, levels_to_root=2) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.method == 'POST': if perms_needed: raise PermissionDenied n = queryset.count() if n: for obj in queryset: obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) obj.delete() self.message_user(request, _("Desinstalados com sucesso: %(count)d %(items)s.") % { "count": n, "items": model_ngettext(self.opts, n) }) return None
def fh_cancel_audit(modeladmin, request, queryset): """ """ opts = modeladmin.model._meta app_label = opts.app_label # Populate modifiable_objects, a data structure of all related objects that will also be deleted. modifiable_objects, perms_needed = get_deleted_objects(queryset, opts, request.user, modeladmin.admin_site, levels_to_root=2) can_audit = validate_false_paper_have_type(queryset, [enums.FW_PAPER_TYPE, enums.BMW_PAPER_TYPE]) if can_audit == False: messages.error(request, msg_paper_not_belong_fht) return None paper_st_right = validate_false_paper_status(request, queryset, [enums.PAPER_STATUS_FINISH], u'独立复核团队取消终审') if paper_st_right == False: return None # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): user = request.user # 权限判定 if not has_fh_end_audit_perm(user) and not has_manage_perm(user): raise PermissionDenied n = queryset.count() if n: for obj in queryset : obj_display = force_unicode(obj) #remove paper FW audit info audits = PaperAudit.objects.filter(paper=obj, new_status=obj.status) for au in audits: au.delete() obj.status = enums.FH_PAPER_STATUS_WAIT_AUDIT_2 obj.save() # change modeladmin.log_change(request, obj, obj_display) modeladmin.message_user(request, u'成功 取消 %(count)d %(items)s 复核终审.' % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "modifiable_objects": modifiable_objects, 'queryset': queryset, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return render_to_response('fh_cancel_audit_confirmation.html', context, context_instance=template.RequestContext(request))
def delete_view(self, request, object_id, extra_context={}): if request.POST and not "_popup" in request.POST: opts = self.model._meta obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) using = router.db_for_write(self.model) (deleted_objects, perms_needed, protected) = get_deleted_objects( [obj], opts, request.user, self.admin_site, using) if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) self.delete_model(request, obj) self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)}) if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../../") return HttpResponseRedirect("../../../%s/" % self.parent.__name__.lower()) if self.parent: extra_context['parent'] = self.parent.__name__.lower() return super(MarshallingAdmin, self).delete_view(request, object_id, extra_context=extra_context)
def delete_view(self, request, object_id, extra_context=None): if request.method == 'POST': # The user has already confirmed the deletion. opts = self.model._meta obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_text(opts.verbose_name), 'key': re.escape(object_id)}) using = router.db_for_write(self.model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, model_count, perms_needed, protected) = get_deleted_objects( [obj], opts, request.user, self.admin_site, using) if perms_needed: raise PermissionDenied obj_display = force_text(obj) self.log_deletion(request, obj, obj_display) self.delete_model(request, obj) self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_text(opts.verbose_name), 'obj': force_text(obj_display)}) if not self.has_change_permission(request, None): return HttpResponseRedirect(reverse('admin:index', current_app=self.admin_site.name)) return HttpResponseRedirect("../../../") else: # Show confirmation page return super(MenuItemAdmin, self).delete_view(request, object_id, extra_context)
def delete_view(self, request, object_id, extra_context=None): "The 'delete' admin view for this model." opts = self.model._meta app_label = opts.app_label obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj) and not self.has_permission(request, self.delete_permission): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_text(opts.verbose_name), 'key': escape(object_id)}) using = router.db_for_write(self.model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed, protected) = get_deleted_objects( [obj], opts, request.user, self.admin_site, using) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_text(obj) self.log_deletion(request, obj, obj_display) self.delete_model(request, obj) self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_text(opts.verbose_name), 'obj': force_text(obj_display)}) if not self.has_change_permission(request, None) and not self.has_permission(request, self.change_permission): return HttpResponseRedirect(reverse('admin:index', current_app=self.admin_site.name)) return HttpResponseRedirect(reverse('admin:%s_%s_changelist' % (opts.app_label, opts.module_name), current_app=self.admin_site.name)) object_name = force_text(opts.verbose_name) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": object_name} else: title = _("Are you sure?") context = { "title": title, "object_name": object_name, "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": app_label, } context.update(extra_context or {}) return TemplateResponse(request, self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, current_app=self.admin_site.name)
def delete_view(self, request, object_id, extra_context=None): # overrided delete_view method opts = self.model._meta obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404( _('%(name)s object with primary key %(key)r does not exist.') % { 'name': force_unicode(opts.verbose_name), 'key': escape(object_id) }) using = router.db_for_write(self.model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed, protected) = get_deleted_objects([obj], opts, request.user, self.admin_site, using) new_deletable_objects = parse_deletable_list(deleted_objects) extra_context = {'deleted_objects': [new_deletable_objects]} return super(DideAdmin, self).delete_view(request, object_id, extra_context)
def delete_selected(modeladmin, request, queryset): """ Default action which deletes the selected objects. This action first displays a confirmation page whichs shows all the deleteable objects, or, if the user has no permission one of the related childs (foreignkeys), a "permission denied" message. Next, it delets all selected objects and redirects back to the change list. """ opts = modeladmin.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not modeladmin.has_delete_permission(request): raise PermissionDenied using = router.db_for_write(modeladmin.model) # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, perms_needed = get_deleted_objects( queryset, opts, request.user, modeladmin.admin_site, using) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): if perms_needed: raise PermissionDenied n = queryset.count() if n: for obj in queryset: obj_display = force_unicode(obj) modeladmin.log_deletion(request, obj, obj_display) queryset.delete() modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "deletable_objects": [deletable_objects], 'queryset': queryset, "perms_lacking": perms_needed, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return render_to_response(modeladmin.delete_selected_confirmation_template or [ "admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_selected_confirmation.html" % app_label, "admin/delete_selected_confirmation.html" ], context, context_instance=template.RequestContext(request))
def delete_view(self, request, object_id): "The 'delete' admin view for this model." from django.contrib.contenttypes.models import ContentType from django.contrib.admin.models import LogEntry, DELETION opts = self.model._meta app_label = opts.app_label try: obj = self.model._default_manager.get(pk=object_id) except self.model.DoesNotExist: # Don't raise Http404 just yet, because we haven't checked # permissions yet. We don't want an unauthenticated user to be able # to determine whether a given object exists. obj = None if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404('%s object with primary key %r does not exist.' % (opts.verbose_name, escape(object_id))) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. deleted_objects = [mark_safe(u'%s: <a href="../../%s/">%s</a>' % (escape(force_unicode(capfirst(opts.verbose_name))), force_unicode(object_id), escape(obj))), []] perms_needed = sets.Set() get_deleted_objects(deleted_objects, perms_needed, request.user, obj, opts, 1, self.admin_site) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = str(obj) obj.delete() LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(self.model).id, object_id, obj_display, DELETION) request.user.message_set.create(message=_('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)}) return HttpResponseRedirect("../../") extra_context = { "title": _("Are you sure?"), "object_name": opts.verbose_name, "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": opts, } return render_to_response(["admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower() ), "admin/%s/delete_confirmation.html" % app_label , "admin/delete_confirmation.html"], extra_context, context_instance=template.RequestContext(request))
def delete_view(self, request, object_id, extra_context=None): try: opts = self.model._meta app_label = opts.app_label obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404( _("'%(name)s' object with primary key %(key)r does not exist." ) % { 'name': force_unicode(opts.verbose_name), 'key': escape(object_id) }) using = router.db_for_write(self.model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed, protected) = get_deleted_objects([obj], opts, request.user, self.api_site, using) object_name = force_unicode(opts.verbose_name) if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) self.delete_model(request, obj) if perms_needed or protected: raise PermissionDenied( "Cannot delete '%(name)s' with primary key %(key)r.") % { "name": object_name, "key": escape(object_id) } else: json = { "status": True, "sucess": "Object '%(name)s' with primary key %(key)r deleted." % { "name": object_name, "key": escape(object_id) }, } except Exception as error: json = { 'status': False, 'error': type(error).__name__, 'error_message': u'%s' % error, } return HttpResponse(simplejson.dumps(json, ensure_ascii=False), mimetype='text/javascript; charset=utf-8')
def gen_report_bentch(modeladmin, request, queryset): """ """ opts = modeladmin.model._meta app_label = opts.app_label # Populate modifiable_objects, a data structure of all related objects that will also be deleted. modifiable_objects, perms_needed = get_deleted_objects(queryset, opts, request.user, modeladmin.admin_site, levels_to_root=2) # can_audit = validate_false_paper_have_type(queryset, [enums.BMW_PAPER_TYPE, enums.FH_PAPER_TYPE]) # if can_audit == False: # messages.error(request, u'FW团队终审问卷才能生成单店报告') # return None # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): user = request.user # 权限判定 #督导,终审,管理员可用 if not has_fh_end_audit_perm(user) and not has_end_audit_perm(user) and not has_manage_perm(user) and not has_dd_audit_perm(user): raise PermissionDenied n = queryset.count() if n: from mc import gen_report perm = enums.PAPER_STATUS_FINISH for obj in queryset : if obj.status == perm: obj_display = force_unicode(obj) #统计得 gen_report(obj, user) # change modeladmin.log_change(request, obj, obj_display) else: n -= 1 modeladmin.message_user(request, u'生成 %(count)d %(items)s EXCEL单店报告.' % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "modifiable_objects": modifiable_objects, 'queryset': queryset, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return render_to_response('gen_report_bentch_confirmation.html', context, context_instance=template.RequestContext(request))
def merge(self, request, queryset): opts = self.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not self.has_delete_permission(request): raise PermissionDenied using = router.db_for_write(self.model) # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, perms_needed, protected = get_deleted_objects( queryset, opts, request.user, self.admin_site, using) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): if perms_needed: raise PermissionDenied n = queryset.count() if n: self.merge_detail(queryset) message_bit = "%s items were" % n self.message_user(request, "%s successfully merged." % message_bit) # Return None to display the change list page again. return None if len(queryset) == 1: objects_name = force_text(opts.verbose_name) else: objects_name = force_text(opts.verbose_name_plural) #print objects_name if perms_needed or protected: title = _("Cannot merge %(name)s") % {"name": objects_name} else: title = _("Are you sure?") context = { "title": title, "objects_name": objects_name, "deletable_objects": [deletable_objects], 'queryset': queryset, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return TemplateResponse(request, self.delete_selected_confirmation_template or [ "admin/%s/generic_confirm_merge.html" % app_label, "admin/generic_confirm_merge.html" ], context, current_app=self.admin_site.name)
def delete_selected(modeladmin, request, queryset): """ Default action which deletes the selected objects. This action first displays a confirmation page whichs shows all the deleteable objects, or, if the user has no permission one of the related childs (foreignkeys), a "permission denied" message. Next, it delets all selected objects and redirects back to the change list. """ opts = modeladmin.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not modeladmin.has_delete_permission(request): raise PermissionDenied # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, perms_needed = get_deleted_objects(queryset, opts, request.user, modeladmin.admin_site) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): if perms_needed: raise PermissionDenied n = queryset.count() if n: for obj in queryset: obj_display = force_unicode(obj) modeladmin.log_deletion(request, obj, obj_display) queryset.delete() modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "deletable_objects": [deletable_objects], 'queryset': queryset, "perms_lacking": perms_needed, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return render_to_response(modeladmin.delete_selected_confirmation_template or [ "admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_selected_confirmation.html" % app_label, "admin/delete_selected_confirmation.html" ], context, context_instance=template.RequestContext(request))
def delete_plugin(self, request, plugin_id): plugin = get_object_or_404(CMSPlugin.objects.select_related('placeholder'), pk=plugin_id) if not self.has_delete_plugin_permission(request, plugin): return HttpResponseForbidden(force_text(_("You do not have permission to delete this plugin"))) plugin_cms_class = plugin.get_plugin_class() plugin_class = plugin_cms_class.model opts = plugin_class._meta using = router.db_for_write(plugin_class) app_label = opts.app_label if DJANGO_1_7: deleted_objects, perms_needed, protected = get_deleted_objects( [plugin], opts, request.user, self.admin_site, using) else: deleted_objects, __, perms_needed, protected = get_deleted_objects( [plugin], opts, request.user, self.admin_site, using) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied(_("You do not have permission to delete this plugin")) obj_display = force_text(plugin) self.log_deletion(request, plugin, obj_display) plugin.delete() self.message_user(request, _('The %(name)s plugin "%(obj)s" was deleted successfully.') % { 'name': force_text(opts.verbose_name), 'obj': force_text(obj_display)}) self.post_delete_plugin(request, plugin) return HttpResponseRedirect(admin_reverse('index', current_app=self.admin_site.name)) plugin_name = force_text(plugin_pool.get_plugin(plugin.plugin_type).name) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": plugin_name} else: title = _("Are you sure?") context = { "title": title, "object_name": plugin_name, "object": plugin, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": app_label, } return TemplateResponse(request, "admin/cms/page/plugin/delete_confirmation.html", context, current_app=self.admin_site.name)
def get_delete_view_context(self, request, object_id): opts = self.model._meta app_label = opts.app_label try: obj = self.queryset(request).get(pk=unquote(object_id)) except self.model.DoesNotExist: # Don't raise Http404 just yet, because we haven't checked # permissions yet. We don't want an unauthenticated user to be able # to determine whether a given object exists. obj = None if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. # FIXME <a href=""> tags hardcoded into get_deleted_objects() handled in template via template tag. #deleted_objects = [mark_safe(u'%s: <a href="../../%s/">%s</a>' % (escape(force_unicode(capfirst(opts.verbose_name))), object_id, escape(obj))), []] #perms_needed = set() #get_deleted_objects(deleted_objects, perms_needed, request.user, obj, opts, 1, self.admin_site) #(deleted_objects, perms_needed) = get_deleted_objects((obj,), opts, request.user, self.admin_site, levels_to_root=4) # Django 1.3 using = router.db_for_write(self.model) (deleted_objects, perms_needed, protected) = get_deleted_objects((obj,), opts, request.user, self.admin_site, using) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) obj.delete() msg = _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)} self.message_user(request, msg) if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../") return HttpResponseRedirect("../") context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": opts, "root_path": self.admin_site.root_path, "app_label": app_label, } return context
def delete_view(self, request, object_id, extra_context=None): "The 'delete' admin view for this model." extra_context = self.__base_view__(request, object_id, extra_context) opts = self.model._meta app_label = opts.app_label obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) using = router.db_for_write(self.model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed, protected) = get_deleted_objects([obj], opts, request.user, self.admin_site, using) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) obj.delete() self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)}) if obj.parent is not None: obj_parent = obj.parent url_to_redirect = '/%s/%s/%s/%s/details' % (atlsettings.ADMIN_PREFIX, obj_parent.content_type.app_label, obj_parent.content_type.model, obj_parent.id) else: url_to_redirect = '/%s' % atlsettings.ADMIN_PREFIX return HttpResponseRedirect(url_to_redirect) context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": opts, #"root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) context_instance = template.RequestContext(request, current_app=self.admin_site.name) return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, context_instance=context_instance)
def clear_placeholder(self, request, placeholder_id): placeholder = get_object_or_404(Placeholder, pk=placeholder_id) if not self.has_clear_placeholder_permission(request, placeholder): return HttpResponseForbidden(force_text(_("You do not have permission to clear this placeholder"))) language = request.GET.get('language', None) plugins = placeholder.get_plugins(language) opts = Placeholder._meta using = router.db_for_write(Placeholder) app_label = opts.app_label if DJANGO_1_7: deleted_objects, perms_needed, protected = get_deleted_objects( plugins, opts, request.user, self.admin_site, using) else: deleted_objects, __, perms_needed, protected = get_deleted_objects( plugins, opts, request.user, self.admin_site, using) obj_display = force_text(placeholder) if request.POST: # The user has already confirmed the deletion. if perms_needed: return HttpResponseForbidden(force_text(_("You do not have permission to clear this placeholder"))) self.log_deletion(request, placeholder, obj_display) placeholder.clear(language) self.message_user(request, _('The placeholder "%(obj)s" was cleared successfully.') % { 'obj': force_text(obj_display)}) self.post_clear_placeholder(request, placeholder) return HttpResponseRedirect(admin_reverse('index', current_app=self.admin_site.name)) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": obj_display} else: title = _("Are you sure?") context = { "title": title, "object_name": _("placeholder"), "object": placeholder, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": app_label, } return TemplateResponse(request, "admin/cms/page/plugin/delete_confirmation.html", context, current_app=self.admin_site.name)
def delete_view(self, request, object_id, extra_context=None): "The 'delete' admin view for this model." opts = self.model._meta app_label = opts.app_label obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed) = get_deleted_objects((obj,), opts, request.user, self.admin_site) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) obj.delete() self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)}) ct_id = escape(request.GET.get("ct_id") if request.GET.has_key("ct_id") else '0') obj_id = escape(request.GET.get("obj1_id") if request.GET.has_key("obj1_id") else '0') if obj_id == '0': obj_id = escape(request.GET.get("obj2_id") if request.GET.has_key("obj2_id") else '0') content = get_content(ct_id, obj_id) if content is not None: return HttpResponseRedirect(content.admin_change_url()) if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../../") return HttpResponseRedirect("../../") context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": opts, "root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) context_instance = template.RequestContext(request, current_app=self.admin_site.name) return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, context_instance=context_instance)
def disablereport(modeladmin, request, queryset): """ """ opts = modeladmin.model._meta app_label = opts.app_label # Populate modifiable_objects, a data structure of all related objects that will also be deleted. modifiable_objects, perms_needed = get_deleted_objects( queryset, opts, request.user, modeladmin.admin_site, levels_to_root=2) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): user = request.user # 权限判定 if not has_manage_perm(user): raise PermissionDenied n = queryset.count() if n: for obj in queryset: obj_display = force_unicode(obj) obj.is_public = False obj.save() # change modeladmin.log_change(request, obj, obj_display) modeladmin.message_user( request, u'成功 屏蔽 %(count)d %(items)s 报告.' % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "modifiable_objects": modifiable_objects, 'queryset': queryset, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return render_to_response( 'disablereport_confirmation.html', context, context_instance=template.RequestContext(request))
def delete_view(self, request, object_id, extra_context=None): "The 'delete' admin view for this model." opts = self.model._meta app_label = opts.app_label obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_text(opts.verbose_name), 'key': escape(object_id)}) # frePPLe specific selection of the database using = request.database # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed, protected) = get_deleted_objects( [obj], opts, request.user, self.admin_site, using) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_text(obj) self.log_deletion(request, obj, obj_display) self.delete_model(request, obj) self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_text(opts.verbose_name), 'obj': force_text(obj_display)}) # Redirect to previous crumb return HttpResponseRedirect(request.session['crumbs'][request.prefix][-3][2]) object_name = force_text(opts.verbose_name) context = { "title": capfirst(object_name + ' ' + unquote(object_id)), "object_name": object_name, "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": app_label, } context.update(extra_context or {}) return TemplateResponse(request, self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, current_app=self.admin_site.name)
def delete_view(self, request, object_id): "The 'delete' admin view for this model." opts = self.model._meta app_label = opts.app_label modeladmin = get_modeladmin(User) user = self.get_user(request, object_id) obj = getattr(user, self.name) using = router.db_for_write(self.model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed, protected) = get_deleted_objects( [obj], opts, request.user, modeladmin.admin_site, using) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_text(obj) modeladmin.log_deletion(request, obj, obj_display) modeladmin.delete_model(request, obj) post_url = reverse('admin:users_user_change', args=(user.pk,)) preserved_filters = modeladmin.get_preserved_filters(request) post_url = add_preserved_filters( {'preserved_filters': preserved_filters, 'opts': opts}, post_url ) return HttpResponseRedirect(post_url) object_name = force_text(opts.verbose_name) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": object_name} else: title = _("Are you sure?") context = { "title": title, "object_name": object_name, "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": app_label, 'preserved_filters': modeladmin.get_preserved_filters(request), 'role': self, } return TemplateResponse(request, 'admin/users/user/delete_role.html', context, current_app=modeladmin.admin_site.name)
def disablereport(modeladmin, request, queryset): """ """ opts = modeladmin.model._meta app_label = opts.app_label # Populate modifiable_objects, a data structure of all related objects that will also be deleted. modifiable_objects, perms_needed = get_deleted_objects(queryset, opts, request.user, modeladmin.admin_site, levels_to_root=2) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): user = request.user # 权限判定 if not has_manage_perm(user): raise PermissionDenied n = queryset.count() if n: for obj in queryset : obj_display = force_unicode(obj) obj.is_public = False obj.save() # change modeladmin.log_change(request, obj, obj_display) modeladmin.message_user(request, u'成功 屏蔽 %(count)d %(items)s 报告.' % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "modifiable_objects": modifiable_objects, 'queryset': queryset, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return render_to_response('disablereport_confirmation.html', context, context_instance=template.RequestContext(request))
def delete_view(self, request, object_id, extra_context=None): # overrided delete_view method opts = self.model._meta obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) using = router.db_for_write(self.model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed, protected) = get_deleted_objects( [obj], opts, request.user, self.admin_site, using) new_deletable_objects = parse_deletable_list(deleted_objects) extra_context = {'deleted_objects': [new_deletable_objects]} return super(DideAdmin, self).delete_view(request, object_id, extra_context)
def delete_view(self, request, object_id, extra_context={}): if request.POST and "_popup" in request.POST: opts = self.model._meta obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) using = router.db_for_write(self.model) (deleted_objects, perms_needed, protected) = get_deleted_objects( [obj], opts, request.user, self.admin_site, using) if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) self.delete_model(request, obj) del_objects = [] for url in get_related_delete(deleted_objects): url = unquote(url) import re m = re.match('.*href="/admin/([^/]*)/([^/]*)/([^/]*)/".*', unicode(url)) # pro objekty, které nejsou zaregistrované v administraci url neexistuje. Co s tím? if m: del_objects.append({'app': smart_str(m.group(1)), 'model': smart_str(m.group(2)), 'id':smart_str(m.group(3))}) return HttpResponse(u'<script type="text/javascript">opener.dismissDeletePopup(window, %s);</script>' % \ del_objects) extra_context['is_popup'] = "_popup" in request.REQUEST return super(RelatedToolsAdmin, self).delete_view(request, object_id, extra_context=extra_context)
def delete_view(self, request, object_id, extra_context=None): "The 'delete' admin view for this model." opts = self.model._meta app_label = opts.app_label obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404( _('%(name)s object with primary key %(key)r does not exist.') % { 'name': force_text(opts.verbose_name), 'key': escape(object_id) }) # frePPLe specific selection of the database using = request.database # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed, protected) = get_deleted_objects([obj], opts, request.user, self.admin_site, using) # Update the links to the related objects. A bit of a hack... if request.prefix: def replace_url(a): if isinstance(a, types.ListType): return [replace_url(i) for i in a] else: return mark_safe( a.replace('href="', 'href="%s' % request.prefix)) deleted_objects = [replace_url(i) for i in deleted_objects] protected = [replace_url(i) for i in protected] print deleted_objects if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_text(obj) self.log_deletion(request, obj, obj_display) self.delete_model(request, obj) self.message_user( request, _('The %(name)s "%(obj)s" was deleted successfully.') % { 'name': force_text(opts.verbose_name), 'obj': force_text(obj_display) }) # Redirect to previous crumb return HttpResponseRedirect( request.session['crumbs'][request.prefix][-3][2]) object_name = force_text(opts.verbose_name) context = { "title": capfirst(object_name + ' ' + unquote(object_id)), "object_name": object_name, "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": app_label, } context.update(extra_context or {}) return TemplateResponse(request, self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.model_name), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, current_app=self.admin_site.name)
def delete_view(self, request, object_id, extra_context=None): """ The 'delete' admin view for this model. This follows closely the base implementation from Django 1.4's django.contrib.admin.options.ModelAdmin, with the explicitly marked modifications. """ opts = self.model._meta app_label = opts.app_label obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404( _('%(name)s object with primary key %(key)r does not exist.') % { 'name': force_unicode(opts.verbose_name), 'key': escape(object_id) }) using = router.db_for_write(self.model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed, protected) = get_deleted_objects([obj], opts, request.user, self.admin_site, using) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) self.delete_model(request, obj) #### Change starts here #### if not '_popup' in request.REQUEST: self.message_user( request, _('The %(name)s "%(obj)s" was deleted successfully.') % { 'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display) }) return self.response_delete(request) #### Change ends here #### object_name = force_unicode(opts.verbose_name) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": object_name} else: title = _("Are you sure?") context = { "title": title, "object_name": object_name, "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": app_label, } context.update(extra_context or {}) return TemplateResponse(request, self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, current_app=self.admin_site.name)
def delete_selected(self, request, queryset): opts = self.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not self.has_delete_permission(request): raise PermissionDenied using = router.db_for_write(self.model) # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, perms_needed, protected = get_deleted_objects( queryset, opts, request.user, self.admin_site, using) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): if perms_needed: raise PermissionDenied n = queryset.count() quarantine =any(result['is_in_quarantine']==True for result in queryset.values('is_in_quarantine')) if n: for obj in queryset: obj_display = force_text(obj) self.log_deletion(request, obj, obj_display) #remove the object self.delete_model(request, obj) self.message_user(request, _("Successfully deleted %(count)d %(items)s.") % { "count": n, "items": model_ngettext(self.opts, n) }) # Return None to display the change list page again. if quarantine: url = reverse('admin:notification_taskhistory_changelist') return HttpResponseRedirect(url + "?user=%s" % request.user.username) return None if len(queryset) == 1: objects_name = force_text(opts.verbose_name) else: objects_name = force_text(opts.verbose_name_plural) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": objects_name} else: title = _("Are you sure?") context = { "title": title, "objects_name": objects_name, "deletable_objects": [deletable_objects], 'queryset': queryset, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return TemplateResponse(request, self.delete_selected_confirmation_template or [ "admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_selected_confirmation.html" % app_label, "admin/delete_selected_confirmation.html" ], context, current_app=self.admin_site.name)
def delete_translation(self, request, object_id, language_code): """ The 'delete translation' admin view for this model. """ opts = self.model._meta translations_model = self.model._translations_model try: translation = translations_model.objects.select_related( 'master').get(master=unquote(object_id), language_code=language_code) except translations_model.DoesNotExist: raise Http404 if not self.has_delete_permission(request, translation): raise PermissionDenied if self.get_available_languages(translation.master).count() <= 1: return self.deletion_not_allowed(request, translation, language_code) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. using = router.db_for_write(translations_model) lang = get_language_title(language_code) (deleted_objects, perms_needed, protected) = get_deleted_objects([translation], translations_model._meta, request.user, self.admin_site, using) # Extend deleted objects with the inlines. if self.delete_inline_translations: shared_obj = translation.master for inline, qs in self._get_inline_translations( request, translation.language_code, obj=shared_obj): (del2, perms2, protected2) = get_deleted_objects(qs, qs.model._meta, request.user, self.admin_site, using) deleted_objects += del2 perms_needed = perms_needed or perms2 protected += protected2 if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = _('{0} translation of {1}').format( lang, force_text(translation)) # in hvad: (translation.master) self.log_deletion(request, translation, obj_display) self.delete_model_translation(request, translation) self.message_user( request, _('The %(name)s "%(obj)s" was deleted successfully.') % dict(name=force_text(opts.verbose_name), obj=force_text(obj_display))) if self.has_change_permission(request, None): return HttpResponseRedirect( reverse('admin:{0}_{1}_changelist'.format( opts.app_label, opts.module_name))) else: return HttpResponseRedirect(reverse('admin:index')) object_name = _('{0} Translation').format(force_text( opts.verbose_name)) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": object_name} else: title = _("Are you sure?") context = { "title": title, "object_name": object_name, "object": translation, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": opts.app_label, } return render( request, self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (opts.app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % opts.app_label, "admin/delete_confirmation.html" ], context)
def delete_translation(self, request, object_id, language_code): "The 'delete translation' admin view for this model." opts = self.model._meta app_label = opts.app_label translations_model = opts.translations_model try: obj = translations_model.objects.select_related('maser').get( master__pk=unquote(object_id), language_code=language_code) except translations_model.DoesNotExist: raise Http404 if not self.has_delete_permission(request, obj): raise PermissionDenied if len(self.get_available_languages(obj.master)) <= 1: return self.deletion_not_allowed(request, obj, language_code) using = router.db_for_write(translations_model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. protected = False if NEW_GET_DELETE_OBJECTS: (deleted_objects, perms_needed, protected) = get_deleted_objects([obj], translations_model._meta, request.user, self.admin_site, using) else: # pragma: no cover (deleted_objects, perms_needed) = get_deleted_objects([obj], translations_model._meta, request.user, self.admin_site) lang = get_language_name(language_code) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = '%s translation of %s' % (lang, force_unicode(obj.master)) self.log_deletion(request, obj, obj_display) self.delete_model_translation(request, obj) self.message_user( request, _('The %(name)s "%(obj)s" was deleted successfully.') % { 'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display) }) if not self.has_change_permission(request, None): return HttpResponseRedirect(reverse('admin:index')) return HttpResponseRedirect( reverse('admin:%s_%s_changelist' % (opts.app_label, opts.module_name))) object_name = '%s Translation' % force_unicode(opts.verbose_name) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": object_name} else: title = _("Are you sure?") context = { "title": title, "object_name": object_name, "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "root_path": self.admin_site.root_path, "app_label": app_label, } return render_to_response( self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, RequestContext(request))
def delete_selected(modeladmin, request, queryset): """ Default action which deletes the selected objects. This action first displays a confirmation page whichs shows all the deleteable objects, or, if the user has no permission one of the related childs (foreignkeys), a "permission denied" message. Next, it delets all selected objects and redirects back to the change list. """ opts = modeladmin.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not modeladmin.has_delete_permission(request): raise PermissionDenied # Populate deletable_objects, a data structure of all related objects that # will also be deleted. # deletable_objects must be a list if we want to use '|unordered_list' in the template deletable_objects = [] perms_needed = set() i = 0 for obj in queryset: deletable_objects.append([mark_safe(u'%s: <a href="%s/">%s</a>' % (escape(force_unicode(capfirst(opts.verbose_name))), obj.pk, escape(obj))), []]) get_deleted_objects(deletable_objects[i], perms_needed, request.user, obj, opts, 1, modeladmin.admin_site, levels_to_root=2) i=i+1 # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): if perms_needed: raise PermissionDenied n = queryset.count() if n: for obj in queryset: obj_display = force_unicode(obj) modeladmin.log_deletion(request, obj, obj_display) queryset.delete() modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "deletable_objects": deletable_objects, 'queryset': queryset, "perms_lacking": perms_needed, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page # FIXME Liebe Entwiklern: please save developer's life, don't use OR operator in function arguments. # One can create new line in source file, one can assign something to that variable, then the variable can be used # as function argument... return render_to_response( [ "newman/%s/%s/delete_selected_confirmation.html" % (app_label, opts.object_name.lower()), "newman/%s/delete_selected_confirmation.html" % app_label, "newman/delete_selected_confirmation.html" ], context, context_instance=template.RequestContext(request) )
def delete_selected(modeladmin, request, queryset): """ The out-of-box Django delete never calls Submission.delete(), so this is a mostly redundant lift-and-hack to ensure that happens. This is important because Submission.delete() also cleans up its uploaded files. See also: https://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/ """ opts = modeladmin.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not modeladmin.has_delete_permission(request): raise PermissionDenied # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, perms_needed = get_deleted_objects(queryset, opts, request.user, modeladmin.admin_site, levels_to_root=2) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): if perms_needed: raise PermissionDenied n = queryset.count() if n: for obj in queryset: obj_display = force_unicode(obj) modeladmin.log_deletion(request, obj, obj_display) obj.delete() modeladmin.message_user(request, _("Deleted and uploaded files for %(item)s") % { "item": obj_display }) modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "deletable_objects": [deletable_objects], 'queryset': queryset, "perms_lacking": perms_needed, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return render_to_response( modeladmin.delete_selected_confirmation_template or [ "admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_selected_confirmation.html" % app_label, "admin/delete_selected_confirmation.html" ], context, context_instance=template.RequestContext(request))
def soft_delete_selected(modeladmin, request, queryset): """ Replace the default delete_selected action so we can soft delete objects by using obj.delete() instead of queryset.delete(). Default action which deletes the selected objects. This action first displays a confirmation page whichs shows all the deleteable objects, or, if the user has no permission one of the related childs (foreignkeys), a "permission denied" message. Next, it soft deletes all selected objects and redirects back to the change list. """ opts = modeladmin.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not modeladmin.has_delete_permission(request): raise PermissionDenied using = router.db_for_write(modeladmin.model) # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, perms_needed, protected = get_deleted_objects( queryset, opts, request.user, modeladmin.admin_site, using) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): if perms_needed: raise PermissionDenied n = queryset.count() if n: for obj in queryset: obj_display = force_unicode(obj) modeladmin.log_deletion(request, obj, obj_display) # Delete the object with it's own method in case the # object has a custom delete method. obj.delete() modeladmin.message_user( request, _("Successfully deleted %(count)d %(items)s.") % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None if len(queryset) == 1: objects_name = force_unicode(opts.verbose_name) else: objects_name = force_unicode(opts.verbose_name_plural) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": objects_name} else: title = _("Are you sure?") context = { "title": title, "objects_name": objects_name, "deletable_objects": [deletable_objects], 'queryset': queryset, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return TemplateResponse(request, [ "admin/%s/%s/soft_delete_selected_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/soft_delete_selected_confirmation.html" % app_label, "admin/soft_delete_selected_confirmation.html" ], context, current_app=modeladmin.admin_site.name)
def merge_view(self, request, object_id, extra_context=None): """ The 'merge' admin view for this model. Allows a user to merge a draft copy back over the original. """ opts = self.model._meta app_label = opts.app_label obj = self.get_object(request, unquote(object_id)) # For our purposes, permission to merge is equivalent to # has_change_permisison and has_delete_permission. if not self.has_change_permission(request, obj) \ or not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404( _('%(name)s object with primary key %(key)r does not exist.') % { 'name': force_unicode(opts.verbose_name), 'key': escape(object_id) }) if not obj.is_draft_copy: return HttpResponseBadRequest( _('The %s object could not be merged because it is not a' 'draft copy. There is nothing to merge it into.') % force_unicode(opts.verbose_name)) # Populate deleted_objects, a data structure of all related objects # that will also be deleted when this copy is deleted. all_objects = introspect.get_referencing_objects(obj.copy_of) all_objects.insert(0, obj.copy_of) using = router.db_for_write(self.model) (deleted_objects, perms_needed, protected) = get_deleted_objects(all_objects, opts, request.user, self.admin_site, using) # Flatten nested list: deleted_objects = map(lambda i: hasattr(i, '__iter__') and i or [i], deleted_objects) deleted_objects = chain(*deleted_objects) deleted_objects = list(deleted_objects) # ``get_deleted_objects`` is zealous and will add the draft copy to # the list of things to be deleted. This needs to be removed. obj_url = reverse("admin:pagemanager_page_change", args=(obj.pk, )) deleted_objects = filter(lambda link: obj_url not in link, deleted_objects) # Filter out child pages: these will be preserved too. for child in obj.copy_of.children.all(): child_url = reverse("admin:pagemanager_page_change", args=(child.pk, )) deleted_objects = filter(lambda link: child_url not in link, deleted_objects) # Populate replacing_objects, a data structure of all related objects # that will be replacing the originals. replacing_objects = introspect.get_referencing_objects(obj) replacing_objects.insert(0, obj) (replacing_objects, perms_needed, protected) = get_deleted_objects(replacing_objects, opts, request.user, self.admin_site, using) # Flatten nested list: replacing_objects = map(lambda i: hasattr(i, '__iter__') and i or [i], replacing_objects) replacing_objects = chain(*replacing_objects) replacing_objects = list(replacing_objects) if request.POST: # The user has already confirmed the merge. if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) + " merged." self.log_change(request, obj, obj_display) original = obj.copy_of original_pk = original.pk original_layout_pk = original.page_layout.pk self._merge_item(original, obj) # Look up admin log entries for the old object and reassign them # to the new object. page_ctype = ContentType.objects.get_for_model(original) layout_ctype = ContentType.objects.get_for_model( original.page_layout) LogEntry.objects.filter( content_type=page_ctype, object_id=original_pk).update(object_id=obj.pk) LogEntry.objects.filter(content_type=layout_ctype, object_id=original_layout_pk).update( object_id=obj.page_layout.pk) self.message_user( request, _('The %(name)s "%(obj)s" was merged successfully.') % { 'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display) }) redirect_url = reverse("admin:pagemanager_page_change", args=(original.pk, )) return HttpResponseRedirect(redirect_url) context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "object": obj, "escaped_original": force_unicode(obj.copy_of), "deleted_objects": deleted_objects, "replacing_objects": replacing_objects, "perms_lacking": perms_needed, "opts": opts, "root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) context_instance = template.RequestContext( request, current_app=self.admin_site.name) return render_to_response(self.merge_form_template, context, context_instance=context_instance)
def fh_end_audit(modeladmin, request, queryset): """ """ opts = modeladmin.model._meta app_label = opts.app_label # Populate modifiable_objects, a data structure of all related objects that will also be deleted. modifiable_objects, perms_needed = get_deleted_objects( queryset, opts, request.user, modeladmin.admin_site, levels_to_root=2) can_audit = validate_false_paper_have_type( queryset, [enums.FW_PAPER_TYPE, enums.BMW_PAPER_TYPE]) if can_audit == False: messages.error(request, msg_paper_not_belong_fht) return None paper_st_right = validate_false_paper_status( request, queryset, [enums.FH_PAPER_STATUS_WAIT_AUDIT_2], u'独立复核团队终审') if paper_st_right == False: return None # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): user = request.user # 权限判定 if not has_fh_end_audit_perm(user) and not has_manage_perm(user): raise PermissionDenied n = queryset.count() passed_papers = [] if n: perm = enums.PAPER_STATUS_FINISH for obj in queryset: obj_display = force_unicode(obj) if obj.status < perm: from mc import save_paper_audit_status save_paper_audit_status(obj, request.user, perm) obj.status = perm obj.save() passed_papers.append(obj) # change modeladmin.log_change(request, obj, obj_display) else: n -= 1 modeladmin.message_user( request, u'独立复核终审通过 %(count)d %(items)s 报告.' % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) if len(passed_papers) > 0: from service.core._report import generate_report_by_paper generate_report_by_paper(queryset) conflicts_msg = [] for paper in queryset: no_conflict, diff = paperdiff.do_dealer_paper_diff( paper, user) # if not no_conflict: # conflicts_msg.append(u'%s(FW团队问卷: %s 与 复核团队问卷: %s 比较,产生BMW审核问卷: %s)' % (paper.dealer.name, diff.fw_paper.survey_code, diff.fh_paper.survey_code, diff.final_paper.survey_code)) # if len(conflicts_msg) > 0: # modeladmin.message_user(request, u'产生问卷差异的经销商及相关问卷信息如下:') # for tmpmsg in conflicts_msg: # modeladmin.message_user(request, tmpmsg) # else: # modeladmin.message_user(request, u'并未产生问卷差异.') # Return None to display the change list page again. return None context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "modifiable_objects": modifiable_objects, 'queryset': queryset, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return render_to_response( 'fh_finish_audit_confirmation.html', context, context_instance=template.RequestContext(request))
def fh_cancel_audit(modeladmin, request, queryset): """ """ opts = modeladmin.model._meta app_label = opts.app_label # Populate modifiable_objects, a data structure of all related objects that will also be deleted. modifiable_objects, perms_needed = get_deleted_objects( queryset, opts, request.user, modeladmin.admin_site, levels_to_root=2) can_audit = validate_false_paper_have_type( queryset, [enums.FW_PAPER_TYPE, enums.BMW_PAPER_TYPE]) if can_audit == False: messages.error(request, msg_paper_not_belong_fht) return None paper_st_right = validate_false_paper_status(request, queryset, [enums.PAPER_STATUS_FINISH], u'独立复核团队取消终审') if paper_st_right == False: return None # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): user = request.user # 权限判定 if not has_fh_end_audit_perm(user) and not has_manage_perm(user): raise PermissionDenied n = queryset.count() if n: for obj in queryset: obj_display = force_unicode(obj) #remove paper FW audit info audits = PaperAudit.objects.filter(paper=obj, new_status=obj.status) for au in audits: au.delete() obj.status = enums.FH_PAPER_STATUS_WAIT_AUDIT_2 obj.save() # change modeladmin.log_change(request, obj, obj_display) modeladmin.message_user( request, u'成功 取消 %(count)d %(items)s 复核终审.' % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "modifiable_objects": modifiable_objects, 'queryset': queryset, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return render_to_response( 'fh_cancel_audit_confirmation.html', context, context_instance=template.RequestContext(request))
def delete_view(self, request, object_id, extra_context=None): """ The 'delete' admin view for this model. This follows closely the base implementation from Django 1.3's django.contrib.admin.options.ModelAdmin, with the explicitly marked modifications. """ opts = self.model._meta app_label = opts.app_label obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) using = router.db_for_write(self.model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed, protected) = get_deleted_objects( [obj], opts, request.user, self.admin_site, using) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) self.delete_model(request, obj) #### Change starts here #### if not '_popup' in request.REQUEST: self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)}) return self.response_delete(request) #### Change ends here #### object_name = force_unicode(opts.verbose_name) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": object_name} else: title = _("Are you sure?") context = { "title": title, "object_name": object_name, "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) context_instance = template.RequestContext(request, current_app=self.admin_site.name) return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, context_instance=context_instance)
def delete_view(self, request, object_id, extra_context=None): "The 'delete' admin view for this model." opts = self.model._meta app_label = opts.app_label obj = self.get_object(request, unquote(object_id)) type_of_assessment = obj.type_of_assessment if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404( _('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) using = router.db_for_write(self.model) # Populate deleted_objects, a data structure of all related objects # that will also be deleted. (deleted_objects, perms_needed, protected) = get_deleted_objects( [obj], opts, request.user, self.admin_site, using) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) self.delete_model(request, obj) self.message_user( request, _('The %(name)s "%(obj)s" was deleted successfully.') % { 'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)}) if not self.has_change_permission(request, None): return HttpResponseRedirect( reverse('admin:index', current_app=self.admin_site.name)) post_url = "/vulnerability/list/?type_of_assessment=%d" % ( type_of_assessment) return HttpResponseRedirect(post_url) object_name = force_unicode(opts.verbose_name) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": object_name} else: title = _("Are you sure?") context = { "title": title, "object_name": object_name, "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": app_label, } context.update(extra_context or {}) return TemplateResponse(request, self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % ( app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, current_app=self.admin_site.name)
def delete_selected_popup(modeladmin, request, queryset): """ Default action which deletes the selected objects. This action first displays a confirmation page whichs shows all the deleteable objects, or, if the user has no permission one of the related childs (foreignkeys), a "permission denied" message. Next, it delets all selected objects and redirects back to the change list. """ opts = modeladmin.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not modeladmin.has_delete_permission(request): raise PermissionDenied using = router.db_for_write(modeladmin.model) # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, perms_needed, protected = get_deleted_objects( queryset, opts, request.user, modeladmin.admin_site, using) disabled_objects=[] # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): query=[] d=0 if perms_needed: raise PermissionDenied n = queryset.count() if n: # TODO: create a custom get_delete_objects to put # all this validations. for obj in queryset: obj_display = force_unicode(obj) obj_fk = obj._meta.module_name+'_fk' obj_name=obj._meta.module_name try: if hasattr(Property,obj_fk) and not isinstance(obj,Property): Property.objects.get(**{obj_fk:obj.id}) query.append( Q(**{'id': obj.id}) ) modeladmin.log_change(request, obj,'%s' % _('Logical exclude object.')) except ObjectDoesNotExist: modeladmin.log_deletion(request, obj, obj_display) # TODO: create a custom get_delete_objects to put # all this validations. # Exclude objects which has relation with Property to be deleted if query: # Distinct object to deleted and disabled disabled_objects=queryset.filter(reduce(operator.or_,query)) deletable_objects=queryset.exclude(reduce(operator.or_, query)) d=disabled_objects.count() n=deletable_objects.count() # Disable all object was relation with Property disabled_objects.update(logical_exclude=True) else: deletable_objects=queryset try: # Check if the instance is Realtor models because we have to delete # the django User models, when Realtor doesn't has active on Property if isinstance(queryset[0],Realtor): for delete_obj in deletable_objects: delete_obj.user.delete() except IndexError: raise deletable_objects.delete() if d >=1 and n >=1: msg= _("Successfully deleted %(count)d and disabled %(count_two)d %(items_two)s.") % { "count": n, "items": model_ngettext(modeladmin.opts, n), "count_two": d, "items_two": model_ngettext(modeladmin.opts, d) } elif d >=1 and n ==0: msg= _("Successfully disebled %(count)d %(items)s.") % { "count": d, "items": model_ngettext(modeladmin.opts, d) } else: msg= _("Successfully deleted %(count)d %(items)s.") % { "count": n, "items": model_ngettext(modeladmin.opts, n) } modeladmin.message_user(request,msg) # Return None to display the change list page again. return None else: # Get all object in queryset and check if this object has foreingkey in Property # The way to use this delete you have to saw Realto models. query=[] for obj in queryset: obj_display = force_unicode(obj) obj_fk = obj._meta.module_name+'_fk' obj_name=obj._meta.module_name # TODO: create a custom get_delete_objects to put # all this validations. if hasattr(obj,'user') and isinstance(obj,Realtor): protected.append(format_link_callback(obj.user,modeladmin.admin_site)) if hasattr(Property,obj_fk) and not isinstance(obj,Property): try: Property.objects.get(**{obj_fk:obj.id}) query.append( Q(**{'id': obj.id}) ) except ObjectDoesNotExist: continue # TODO: create a custom get_delete_objects to put # all this validations. if query: disabled_objects=queryset.filter(reduce(operator.or_,query)) deletable_objects=queryset.exclude(reduce(operator.or_, query)) if disabled_objects: disabled_objects=[format_link_callback(obj,modeladmin.admin_site) for obj in disabled_objects] if deletable_objects: deletable_objects=[format_link_callback(obj,modeladmin.admin_site) for obj in deletable_objects] if (len(deletable_objects) == 1): objects_name_delete = force_unicode(opts.verbose_name) else: objects_name_delete = force_unicode(opts.verbose_name_plural) if (disabled_objects and len(disabled_objects)==1): objects_name_disable = force_unicode(opts.verbose_name) elif disabled_objects: objects_name_disable = force_unicode(opts.verbose_name_plural) else: objects_name_disable = '' if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": objects_name_delete.lower()} else: title = _("Are you sure?") if deletable_objects: try: deletable_objects=[format_link_callback(obj,modeladmin.admin_site) for obj in deletable_objects] except: pass context = { "title": title, "objects_name_delete": objects_name_delete, "objects_name_disable": objects_name_disable, "deletable_objects": deletable_objects , 'queryset': queryset, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 'is_popup': "_popup" in request.REQUEST or "pop" in request.REQUEST, 'disabled_objects': disabled_objects, 'queryset_obj_disabled':disabled_objects, } # Display the confirmation page return render_to_response(modeladmin.delete_selected_confirmation_template or [ "admin/%s/%s/delete_selected_confirmation_popup.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_selected_confirmation_popup.html" % app_label, "admin/delete_selected_confirmation_popup.html" ], context, context_instance=template.RequestContext(request))
def delete_view(self, request, object_id, extra_context=None): "The 'delete' admin view for this model." opts = self.model._meta app_label = opts.app_label obj = self.get_object(request, unquote(object_id)) if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404( _('%(name)s object with primary key %(key)r does not exist.') % { 'name': force_unicode(opts.verbose_name), 'key': escape(object_id) }) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed) = get_deleted_objects( (obj, ), opts, request.user, self.admin_site) if request.method == 'POST': # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied form = ParkingPageDeleteForm(request.POST) if form.is_valid(): obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) obj.delete(keep_resources=form.cleaned_data['keep_resources']) self.message_user( request, _('The %(name)s "%(obj)s" was deleted successfully.') % { 'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display) }) if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../../") return HttpResponseRedirect("../../") form = ParkingPageDeleteForm() context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "object": obj, "form": form, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": opts, "root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) context_instance = template.RequestContext( request, current_app=self.admin_site.name) return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, context_instance=context_instance)
def delete_view_popup(self, request, object_id, extra_context=None): "The 'delete' admin view for reverted model." opts = self.model._meta app_label = opts.app_label notabs = {'notabs': True} try: extra_context = extra_context.update(notabs) except: extra_context = notabs obj = self.get_object(request, unquote(object_id)) revert_model_name = self.revert_model.__name__.lower() if hasattr(obj, revert_model_name): revert_obj = getattr(obj, revert_model_name) real_obj = obj obj = revert_obj if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404( _('%(name)s object with primary key %(key)r does not exist.') % { 'name': force_unicode(opts.verbose_name), 'key': escape(object_id) }) using = router.db_for_write(self.model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. (deleted_objects, perms_needed, protected) = get_deleted_objects([obj], opts, request.user, self.admin_site, using) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) msg = self.delete_model(request, obj, real_obj) self.message_user( request, msg % { 'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display) }) if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../../") return HttpResponseRedirect("../../") object_name = force_unicode(opts.verbose_name) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": object_name} else: title = _("Are you sure?") context = { "title": title, "object_name": object_name, "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) context_instance = template.RequestContext( request, current_app=self.admin_site.name) return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, context_instance=context_instance)
def delete_selected_popup(modeladmin, request, queryset): """ Default action which deletes the selected objects. This action first displays a confirmation page whichs shows all the deleteable objects, or, if the user has no permission one of the related childs (foreignkeys), a "permission denied" message. Next, it delets all selected objects and redirects back to the change list. """ opts = modeladmin.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not modeladmin.has_delete_permission(request): raise PermissionDenied using = router.db_for_write(modeladmin.model) # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, perms_needed, protected = get_deleted_objects( queryset, opts, request.user, modeladmin.admin_site, using) disabled_objects = [] # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): query = [] d = 0 if perms_needed: raise PermissionDenied n = queryset.count() if n: # TODO: create a custom get_delete_objects to put # all this validations. for obj in queryset: obj_display = force_unicode(obj) obj_fk = obj._meta.module_name + '_fk' obj_name = obj._meta.module_name try: if hasattr(Property, obj_fk) and not isinstance(obj, Property): Property.objects.get(**{obj_fk: obj.id}) query.append(Q(**{'id': obj.id})) modeladmin.log_change( request, obj, '%s' % _('Logical exclude object.')) except ObjectDoesNotExist: modeladmin.log_deletion(request, obj, obj_display) # TODO: create a custom get_delete_objects to put # all this validations. # Exclude objects which has relation with Property to be deleted if query: # Distinct object to deleted and disabled disabled_objects = queryset.filter(reduce(operator.or_, query)) deletable_objects = queryset.exclude( reduce(operator.or_, query)) d = disabled_objects.count() n = deletable_objects.count() # Disable all object was relation with Property disabled_objects.update(logical_exclude=True) else: deletable_objects = queryset try: # Check if the instance is Realtor models because we have to delete # the django User models, when Realtor doesn't has active on Property if isinstance(queryset[0], Realtor): for delete_obj in deletable_objects: delete_obj.user.delete() except IndexError: raise deletable_objects.delete() if d >= 1 and n >= 1: msg = _( "Successfully deleted %(count)d and disabled %(count_two)d %(items_two)s." ) % { "count": n, "items": model_ngettext(modeladmin.opts, n), "count_two": d, "items_two": model_ngettext(modeladmin.opts, d) } elif d >= 1 and n == 0: msg = _("Successfully disebled %(count)d %(items)s.") % { "count": d, "items": model_ngettext(modeladmin.opts, d) } else: msg = _("Successfully deleted %(count)d %(items)s.") % { "count": n, "items": model_ngettext(modeladmin.opts, n) } modeladmin.message_user(request, msg) # Return None to display the change list page again. return None else: # Get all object in queryset and check if this object has foreingkey in Property # The way to use this delete you have to saw Realto models. query = [] for obj in queryset: obj_display = force_unicode(obj) obj_fk = obj._meta.module_name + '_fk' obj_name = obj._meta.module_name # TODO: create a custom get_delete_objects to put # all this validations. if hasattr(obj, 'user') and isinstance(obj, Realtor): protected.append( format_link_callback(obj.user, modeladmin.admin_site)) if hasattr(Property, obj_fk) and not isinstance(obj, Property): try: Property.objects.get(**{obj_fk: obj.id}) query.append(Q(**{'id': obj.id})) except ObjectDoesNotExist: continue # TODO: create a custom get_delete_objects to put # all this validations. if query: disabled_objects = queryset.filter(reduce(operator.or_, query)) deletable_objects = queryset.exclude(reduce(operator.or_, query)) if disabled_objects: disabled_objects = [ format_link_callback(obj, modeladmin.admin_site) for obj in disabled_objects ] if deletable_objects: deletable_objects = [ format_link_callback(obj, modeladmin.admin_site) for obj in deletable_objects ] if (len(deletable_objects) == 1): objects_name_delete = force_unicode(opts.verbose_name) else: objects_name_delete = force_unicode(opts.verbose_name_plural) if (disabled_objects and len(disabled_objects) == 1): objects_name_disable = force_unicode(opts.verbose_name) elif disabled_objects: objects_name_disable = force_unicode(opts.verbose_name_plural) else: objects_name_disable = '' if perms_needed or protected: title = _("Cannot delete %(name)s") % { "name": objects_name_delete.lower() } else: title = _("Are you sure?") if deletable_objects: try: deletable_objects = [ format_link_callback(obj, modeladmin.admin_site) for obj in deletable_objects ] except: pass context = { "title": title, "objects_name_delete": objects_name_delete, "objects_name_disable": objects_name_disable, "deletable_objects": deletable_objects, 'queryset': queryset, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 'is_popup': "_popup" in request.REQUEST or "pop" in request.REQUEST, 'disabled_objects': disabled_objects, 'queryset_obj_disabled': disabled_objects, } # Display the confirmation page return render_to_response( modeladmin.delete_selected_confirmation_template or [ "admin/%s/%s/delete_selected_confirmation_popup.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_selected_confirmation_popup.html" % app_label, "admin/delete_selected_confirmation_popup.html" ], context, context_instance=template.RequestContext(request))
def gen_report_bentch(modeladmin, request, queryset): """ """ opts = modeladmin.model._meta app_label = opts.app_label # Populate modifiable_objects, a data structure of all related objects that will also be deleted. modifiable_objects, perms_needed = get_deleted_objects( queryset, opts, request.user, modeladmin.admin_site, levels_to_root=2) # can_audit = validate_false_paper_have_type(queryset, [enums.BMW_PAPER_TYPE, enums.FH_PAPER_TYPE]) # if can_audit == False: # messages.error(request, u'FW团队终审问卷才能生成单店报告') # return None # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): user = request.user # 权限判定 #督导,终审,管理员可用 if not has_fh_end_audit_perm(user) and not has_end_audit_perm( user) and not has_manage_perm(user) and not has_dd_audit_perm( user): raise PermissionDenied n = queryset.count() if n: from mc import gen_report perm = enums.PAPER_STATUS_FINISH for obj in queryset: if obj.status == perm: obj_display = force_unicode(obj) #统计得 gen_report(obj, user) # change modeladmin.log_change(request, obj, obj_display) else: n -= 1 modeladmin.message_user( request, u'生成 %(count)d %(items)s EXCEL单店报告.' % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "modifiable_objects": modifiable_objects, 'queryset': queryset, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return render_to_response( 'gen_report_bentch_confirmation.html', context, context_instance=template.RequestContext(request))
def soft_delete_selected(modeladmin, request, queryset): """ Replace the default delete_selected action so we can soft delete objects by using obj.delete() instead of queryset.delete(). Default action which deletes the selected objects. This action first displays a confirmation page whichs shows all the deleteable objects, or, if the user has no permission one of the related childs (foreignkeys), a "permission denied" message. Next, it soft deletes all selected objects and redirects back to the change list. """ opts = modeladmin.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not modeladmin.has_delete_permission(request): raise PermissionDenied using = router.db_for_write(modeladmin.model) # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, count, perms_needed, protected = get_deleted_objects( queryset, opts, request.user, modeladmin.admin_site, using) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): if perms_needed: raise PermissionDenied n = queryset.count() if n: for obj in queryset: obj_display = force_unicode(obj) modeladmin.log_deletion(request, obj, obj_display) # Delete the object with it's own method in case the # object has a custom delete method. obj.delete() modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None if len(queryset) == 1: objects_name = force_unicode(opts.verbose_name) else: objects_name = force_unicode(opts.verbose_name_plural) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": objects_name} else: title = _("Are you sure?") context = { "title": title, "objects_name": objects_name, "deletable_objects": [deletable_objects], 'queryset': queryset, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return TemplateResponse(request, [ "admin/%s/%s/soft_delete_selected_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/soft_delete_selected_confirmation.html" % app_label, "admin/soft_delete_selected_confirmation.html" ], context, current_app=modeladmin.admin_site.name)
def _delete_selected(modeladmin, request, queryset): """ Default action which deletes the selected objects. This action first displays a confirmation page whichs shows all the deleteable objects, or, if the user has no permission one of the related childs (foreignkeys), a "permission denied" message. Next, it delets all selected objects and redirects back to the change list. """ opts = modeladmin.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not modeladmin.has_delete_permission(request): raise PermissionDenied using = router.db_for_write(modeladmin.model) # Populate deletable_objects, a data structure of all related objects that # will also be deleted. # TODO: Permissions would be so cool... deletable_objects, perms_needed, protected = get_deleted_objects( queryset, opts, request.user, modeladmin.admin_site, using) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): if perms_needed: raise PermissionDenied n = len(queryset) if n: for obj in queryset: obj_display = force_text(obj) modeladmin.log_deletion(request, obj, obj_display) # call the objects delete method to ensure signals are # processed. obj.delete() # This is what you get if you have to monkey patch every object in a changelist # No queryset object, I can tell ya. So we get a new one and delete that. #pk_list = [o.pk for o in queryset] #klass = queryset[0].__class__ #qs = klass.objects.filter(pk__in=pk_list) #qs.delete() modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None if len(queryset) == 1: objects_name = force_text(opts.verbose_name) else: objects_name = force_text(opts.verbose_name_plural) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": objects_name} else: title = _("Are you sure?") context = { "title": title, "objects_name": objects_name, "deletable_objects": [deletable_objects], 'queryset': queryset, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return render_to_response(modeladmin.delete_selected_confirmation_template or [ "admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_selected_confirmation.html" % app_label, "admin/delete_selected_confirmation.html" ], context, context_instance=template.RequestContext(request))
def delete_translation(self, request, object_id, extra_context=None): language = get_language_from_request(request) opts = self.model._meta translationopts = self.translated_model._meta app_label = translationopts.app_label try: obj = self.queryset(request).get(pk=unquote(object_id)) except self.model.DoesNotExist: # Don't raise Http404 just yet, because we haven't checked # permissions yet. We don't want an unauthenticated user to be able # to determine whether a given object exists. obj = None if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) if not len(translation_pool.annotate_with_translations(obj).translations) > 1: raise Http404(_('There only exists one translation for this page')) translationobj = get_object_or_404(self.translated_model, **{self.translation_of_field + '__id': object_id, 'language': language}) using = router.db_for_write(self.model) deleted_objects, perms_needed = get_deleted_objects([translationobj], translationopts, request.user, self.admin_site, using) if request.method == 'POST': if perms_needed: raise PermissionDenied message = _('%(obj_name)s with language %(language)s was deleted') % { 'language': [name for code, name in settings.LANGUAGES if code == language][0], 'obj_name': force_unicode(translationopts.verbose_name)} self.log_change(request, translationobj, message) self.message_user(request, message) translationobj.delete() if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../../") return HttpResponseRedirect("../../") context = { "title": _("Are you sure?"), "object_name": force_unicode(translationopts.verbose_name), "object": translationobj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": translationopts, "root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) context_instance = RequestContext(request, current_app=self.admin_site.name) return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, translationopts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, context_instance=context_instance)
def delete_translation(self, request, object_id, language_code): """ The 'delete translation' admin view for this model. """ opts = self.model._meta root_model = self.model._parler_meta.root_model # Get object and translation shared_obj = self.get_object(request, unquote(object_id)) if shared_obj is None: raise Http404 shared_obj.set_current_language(language_code) try: translation = root_model.objects.get(master=shared_obj, language_code=language_code) except root_model.DoesNotExist: raise Http404 if not self.has_delete_permission(request, translation): raise PermissionDenied if self.get_available_languages(shared_obj).count() <= 1: return self.deletion_not_allowed(request, translation, language_code) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. using = router.db_for_write(root_model) # NOTE: all same DB for now. lang = get_language_title(language_code) # There are potentially multiple objects to delete; # the translation object at the base level, # and additional objects that can be added by inherited models. deleted_objects = [] perms_needed = False protected = [] # Extend deleted objects with the inlines. for qs in self.get_translation_objects( request, translation.language_code, obj=shared_obj, inlines=self.delete_inline_translations): if isinstance(qs, (list, tuple)): qs_opts = qs[0]._meta else: qs_opts = qs.model._meta deleted_result = get_deleted_objects(qs, qs_opts, request.user, self.admin_site, using) if django.VERSION >= (1, 8): (del2, model_counts, perms2, protected2) = deleted_result else: (del2, perms2, protected2) = deleted_result deleted_objects += del2 perms_needed = perms_needed or perms2 protected += protected2 if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = _('{0} translation of {1}').format( lang, force_text(translation)) # in hvad: (translation.master) self.log_deletion(request, translation, obj_display) self.delete_model_translation(request, translation) self.message_user( request, _('The %(name)s "%(obj)s" was deleted successfully.') % dict(name=force_text(opts.verbose_name), obj=force_text(obj_display))) if self.has_change_permission(request, None): return HttpResponseRedirect( reverse('admin:{0}_{1}_changelist'.format( opts.app_label, opts.model_name if django.VERSION >= (1, 7) else opts.module_name))) else: return HttpResponseRedirect(reverse('admin:index')) object_name = _('{0} Translation').format(force_text( opts.verbose_name)) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": object_name} else: title = _("Are you sure?") context = { "title": title, "object_name": object_name, "object": translation, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": opts.app_label, } return render( request, self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (opts.app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % opts.app_label, "admin/delete_confirmation.html" ], context)
def delete_translation(self, request, object_id, language_code): """ The 'delete translation' admin view for this model. """ opts = self.model._meta translations_model = self.model._translations_model try: translation = translations_model.objects.select_related('master').get(master=unquote(object_id), language_code=language_code) except translations_model.DoesNotExist: raise Http404 if not self.has_delete_permission(request, translation): raise PermissionDenied if self.get_available_languages(translation.master).count() <= 1: return self.deletion_not_allowed(request, translation, language_code) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. using = router.db_for_write(translations_model) lang = get_language_title(language_code) (deleted_objects, perms_needed, protected) = get_deleted_objects( [translation], translations_model._meta, request.user, self.admin_site, using) # Extend deleted objects with the inlines. if self.delete_inline_translations: shared_obj = translation.master for inline, qs in self._get_inline_translations(request, translation.language_code, obj=shared_obj): (del2, perms2, protected2) = get_deleted_objects(qs, qs.model._meta, request.user, self.admin_site, using) deleted_objects += del2 perms_needed = perms_needed or perms2 protected += protected2 if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = _('{0} translation of {1}').format(lang, force_text(translation)) # in hvad: (translation.master) self.log_deletion(request, translation, obj_display) self.delete_model_translation(request, translation) self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % dict( name=force_text(opts.verbose_name), obj=force_text(obj_display) )) if self.has_change_permission(request, None): return HttpResponseRedirect(reverse('admin:{0}_{1}_changelist'.format(opts.app_label, opts.module_name))) else: return HttpResponseRedirect(reverse('admin:index')) object_name = _('{0} Translation').format(force_text(opts.verbose_name)) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": object_name} else: title = _("Are you sure?") context = { "title": title, "object_name": object_name, "object": translation, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "app_label": opts.app_label, } return render(request, self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (opts.app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % opts.app_label, "admin/delete_confirmation.html" ], context)
def delete_files_or_folders(self, request, files_queryset, folders_queryset): """ Action which deletes the selected files and/or folders. This action first displays a confirmation page whichs shows all the deleteable files and/or folders, or, if the user has no permission on one of the related childs (foreignkeys), a "permission denied" message. Next, it delets all selected files and/or folders and redirects back to the folder. """ opts = self.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not self.has_delete_permission(request): raise PermissionDenied current_folder = self._get_current_action_folder(request, files_queryset, folders_queryset) all_protected = [] # Populate deletable_objects, a data structure of all related objects that # will also be deleted. # Hopefully this also checks for necessary permissions. # TODO: Check if permissions are really verified (args, varargs, keywords, defaults) = inspect.getargspec(get_deleted_objects) if 'levels_to_root' in args: # Django 1.2 deletable_files, perms_needed_files = get_deleted_objects(files_queryset, files_queryset.model._meta, request.user, self.admin_site, levels_to_root=2) deletable_folders, perms_needed_folders = get_deleted_objects(folders_queryset, folders_queryset.model._meta, request.user, self.admin_site, levels_to_root=2) else: # Django 1.3 using = router.db_for_write(self.model) deletable_files, perms_needed_files, protected_files = get_deleted_objects(files_queryset, files_queryset.model._meta, request.user, self.admin_site, using) deletable_folders, perms_needed_folders, protected_folders = get_deleted_objects(folders_queryset, folders_queryset.model._meta, request.user, self.admin_site, using) all_protected.extend(protected_files) all_protected.extend(protected_folders) all_deletable_objects = [deletable_files, deletable_folders] all_perms_needed = perms_needed_files.union(perms_needed_folders) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): if all_perms_needed: raise PermissionDenied n = files_queryset.count() + folders_queryset.count() if n: for f in files_queryset: self.log_deletion(request, f, force_unicode(f)) f.delete() for f in folders_queryset: self.log_deletion(request, f, force_unicode(f)) f.delete() self.message_user(request, _("Successfully deleted %(count)d files and/or folders.") % { "count": n, }) # Return None to display the change list page again. return None if all_perms_needed or all_protected: title = _("Cannot delete files and/or folders") else: title = _("Are you sure?") context = { "title": title, "instance": current_folder, "breadcrumbs_action": _("Delete files and/or folders"), "deletable_objects": all_deletable_objects, "files_queryset": files_queryset, "folders_queryset": folders_queryset, "perms_lacking": all_perms_needed, "protected": all_protected, "opts": opts, "root_path": self.admin_site.root_path, "app_label": app_label, "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, } # Display the destination folder selection page return render_to_response([ "admin/filer/delete_selected_files_confirmation.html" ], context, context_instance=template.RequestContext(request))
def delete_translation(self, request, object_id, extra_context=None): language = get_language_from_request(request) opts = Page._meta titleopts = Title._meta app_label = titleopts.app_label pluginopts = CMSPlugin._meta try: obj = self.queryset(request).get(pk=unquote(object_id)) except self.model.DoesNotExist: # Don't raise Http404 just yet, because we haven't checked # permissions yet. We don't want an unauthenticated user to be able # to determine whether a given object exists. obj = None if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) if not len(obj.get_languages()) > 1: raise Http404(_('There only exists one translation for this page')) titleobj = get_object_or_404(Title, page__id=object_id, language=language) plugins = CMSPlugin.objects.filter(page__id=object_id, language=language) deleted_objects = [u'%s: %s' % (capfirst(titleopts.verbose_name), force_unicode(titleobj)), []] perms_needed = set() get_deleted_objects(deleted_objects, perms_needed, request.user, titleobj, titleopts, 1, self.admin_site) for p in plugins: get_deleted_objects(deleted_objects, perms_needed, request.user, p, pluginopts, 1, self.admin_site) if request.method == 'POST': if perms_needed: raise PermissionDenied message = _('Title and plugins with language %(language)s was deleted') % { 'language': [name for code, name in settings.CMS_LANGUAGES if code == language][0].lower()} self.log_change(request, titleobj, message) self.message_user(request, message) titleobj.delete() for p in plugins: p.delete() if 'reversion' in settings.INSTALLED_APPS: obj.save() save_all_plugins(request, obj) public = obj.publisher_public if public: public.save() if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../../") return HttpResponseRedirect("../../") context = { "title": _("Are you sure?"), "object_name": force_unicode(titleopts.verbose_name), "object": titleobj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": titleopts, "root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) context_instance = template.RequestContext(request, current_app=self.admin_site.name) return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, titleopts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, context_instance=context_instance)
def delete_related_objects(modeladmin, request, queryset): """ Action that deletes related objects for the selected items. This action first displays a confirmation page whichs shows all the deleteable objects, or, if the user has no permission one of the related childs (foreignkeys), a "permission denied" message. Next, it deletes all related objects and redirects back to the change list. """ opts = modeladmin.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not modeladmin.has_delete_permission(request): raise PermissionDenied using = router.db_for_write(modeladmin.model) first_level_related_objects = [] first_level_related_objects_by_type = defaultdict(list) collector = NestedObjects(using=using) collector.collect(queryset) for base_object_or_related_list in collector.nested(): if type(base_object_or_related_list) is not list: # If it's not a list, it's a base object. Skip it. continue for obj in base_object_or_related_list: if type(obj) is list: # A list here contains related objects for the previous # element. We can skip it since delete() on the first # level of related objects will cascade. continue else: first_level_related_objects.append(obj) first_level_related_objects_by_type[type(obj)].append(obj) deletable_objects = [] model_count = defaultdict(int) perms_needed = set() protected = [] # `get_deleted_objects()` fails when passed a heterogeneous list like # `first_level_related_objects`, so embark on this rigmarole to spoon-feed # it only homogeneous lists for homogeneous_list in first_level_related_objects_by_type.values(): # Populate deletable_objects, a data structure of (string # representations of) all related objects that will also be deleted. deletable_objects_, model_count_, perms_needed_, protected_ = get_deleted_objects( homogeneous_list, opts, request.user, modeladmin.admin_site, using) # Combine the results with those from previous homogeneous lists deletable_objects.extend(deletable_objects_) for k, v in model_count_.iteritems(): model_count[k] += v perms_needed.update(perms_needed_) protected.extend(protected_) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): if perms_needed: raise PermissionDenied n = 0 with transaction.atomic(using): for obj in first_level_related_objects: obj_display = force_text(obj) modeladmin.log_deletion(request, obj, obj_display) obj.delete() n += 1 modeladmin.message_user( request, _("Successfully deleted %(count)d related objects.") % { "count": n, "items": model_ngettext(modeladmin.opts, n) }, messages.SUCCESS) # Return None to display the change list page again. return None if len(queryset) == 1: objects_name = force_text(opts.verbose_name) else: objects_name = force_text(opts.verbose_name_plural) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": objects_name} else: title = _("Are you sure?") context = dict( modeladmin.admin_site.each_context(request), title=title, objects_name=objects_name, deletable_objects=[deletable_objects], model_count=dict(model_count).items(), queryset=queryset, perms_lacking=perms_needed, protected=protected, opts=opts, action_checkbox_name=helpers.ACTION_CHECKBOX_NAME, ) request.current_app = modeladmin.admin_site.name # Display the confirmation page return TemplateResponse(request, "delete_related_for_selected_confirmation.html", context, current_app=modeladmin.admin_site.name)
def delete_view(self, request, object_id, extra_context=None): "The 'delete' admin view for this model." opts = self.model._meta app_label = opts.app_label try: obj = self.model._default_manager.get(pk=object_id) except self.model.DoesNotExist: # Don't raise Http404 just yet, because we haven't checked # permissions yet. We don't want an unauthenticated user to be able # to determine whether a given object exists. obj = None if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. deleted_objects = [mark_safe(u'%s: <a href="../../%s/">%s</a>' % (escape(force_unicode(capfirst(opts.verbose_name))), quote(object_id), escape(obj))), []] perms_needed = set() get_deleted_objects(deleted_objects, perms_needed, request.user, obj, opts, 1, self.admin_site) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = force_unicode(obj) obj.delete() drop_sql = "DROP TABLE IF EXISTS `%s`;" % obj.name try: conn = MySQLdb.connect(host = settings.DATABASE_HOST, user = settings.DATABASE_USER, passwd = settings.DATABASE_PASSWORD, db = settings.DATABASE_NAME, charset="utf8") cursor = conn.cursor() cursor.execute(drop_sql) except: import traceback print "error" traceback.print_exc() sync_dict.get_model_class(new_object.cname) sync_dict.syncdb() cls = sync_dict.get_model_class(new_object.cname) admin.site.unregister(cls) # try: # connection, cursor = get_patch_connection() # cursor.execute(drop_sql) # cursor.close() # connection.close() # except: # pass self.log_deletion(request, obj, obj_display) self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)}) if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../../") return HttpResponseRedirect("../../") context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": opts, "root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, context_instance=template.RequestContext(request))
def delete_translation(self, request, object_id, extra_context=None): language = get_language_from_request(request) opts = Page._meta titleopts = Title._meta app_label = titleopts.app_label pluginopts = CMSPlugin._meta try: obj = self.queryset(request).get(pk=unquote(object_id)) except self.model.DoesNotExist: # Don't raise Http404 just yet, because we haven't checked # permissions yet. We don't want an unauthenticated user to be able # to determine whether a given object exists. obj = None if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404( _('%(name)s object with primary key %(key)r does not exist.') % { 'name': force_unicode(opts.verbose_name), 'key': escape(object_id) }) if not len(obj.get_languages()) > 1: raise Http404(_('There only exists one translation for this page')) titleobj = get_object_or_404(Title, page__id=object_id, language=language) plugins = CMSPlugin.objects.filter(page__id=object_id, language=language) deleted_objects = [ u'%s: %s' % (capfirst(titleopts.verbose_name), force_unicode(titleobj)), [] ] perms_needed = set() get_deleted_objects(deleted_objects, perms_needed, request.user, titleobj, titleopts, 1, self.admin_site) for p in plugins: get_deleted_objects(deleted_objects, perms_needed, request.user, p, pluginopts, 1, self.admin_site) if request.method == 'POST': if perms_needed: raise PermissionDenied message = _( 'Title and plugins with language %(language)s was deleted') % { 'language': [ name for code, name in settings.CMS_LANGUAGES if code == language ][0].lower() } self.log_change(request, titleobj, message) self.message_user(request, message) titleobj.delete() for p in plugins: p.delete() if 'reversion' in settings.INSTALLED_APPS: obj.save() save_all_plugins(request, obj) public = obj.publisher_public if public: public.save() if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../../") return HttpResponseRedirect("../../") context = { "title": _("Are you sure?"), "object_name": force_unicode(titleopts.verbose_name), "object": titleobj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": titleopts, "root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) context_instance = template.RequestContext( request, current_app=self.admin_site.name) return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, titleopts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, context_instance=context_instance)
def delete_translation(self, request, object_id, language_code): "The 'delete translation' admin view for this model." opts = self.model._meta app_label = opts.app_label translations_model = opts.translations_model try: obj = translations_model.objects.select_related('maser').get( master__pk=unquote(object_id), language_code=language_code) except translations_model.DoesNotExist: raise Http404 if not self.has_delete_permission(request, obj): raise PermissionDenied if len(self.get_available_languages(obj.master)) <= 1: return self.deletion_not_allowed(request, obj, language_code) using = router.db_for_write(translations_model) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. protected = False if NEW_GET_DELETE_OBJECTS: (deleted_objects, perms_needed, protected) = get_deleted_objects( [obj], translations_model._meta, request.user, self.admin_site, using) else: # pragma: no cover (deleted_objects, perms_needed) = get_deleted_objects( [obj], translations_model._meta, request.user, self.admin_site) lang = get_language_name(language_code) if request.POST: # The user has already confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = '%s translation of %s' % (lang, force_unicode(obj.master)) self.log_deletion(request, obj, obj_display) self.delete_model_translation(request, obj) self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % { 'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display) } ) if not self.has_change_permission(request, None): return HttpResponseRedirect(reverse('admin:index')) return HttpResponseRedirect(reverse('admin:%s_%s_changelist' % (opts.app_label, opts.module_name))) object_name = '%s Translation' % force_unicode(opts.verbose_name) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": object_name} else: title = _("Are you sure?") context = { "title": title, "object_name": object_name, "object": obj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "protected": protected, "opts": opts, "root_path": self.admin_site.root_path, "app_label": app_label, } return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, RequestContext(request))
def delete_selected(modeladmin, request, queryset): """ The out-of-box Django delete never calls Submission.delete(), so this is a mostly redundant lift-and-hack to ensure that happens. This is important because Submission.delete() also cleans up its uploaded files. See also: https://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/ """ opts = modeladmin.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not modeladmin.has_delete_permission(request): raise PermissionDenied # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, perms_needed = get_deleted_objects( queryset, opts, request.user, modeladmin.admin_site, levels_to_root=2) # The user has already confirmed the deletion. # Do the deletion and return a None to display the change list view again. if request.POST.get('post'): if perms_needed: raise PermissionDenied n = queryset.count() if n: for obj in queryset: obj_display = force_unicode(obj) modeladmin.log_deletion(request, obj, obj_display) obj.delete() modeladmin.message_user( request, _("Deleted and uploaded files for %(item)s") % {"item": obj_display}) modeladmin.message_user( request, _("Successfully deleted %(count)d %(items)s.") % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None context = { "title": _("Are you sure?"), "object_name": force_unicode(opts.verbose_name), "deletable_objects": [deletable_objects], 'queryset': queryset, "perms_lacking": perms_needed, "opts": opts, "root_path": modeladmin.admin_site.root_path, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } # Display the confirmation page return render_to_response( modeladmin.delete_selected_confirmation_template or [ "admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.object_name.lower()), "admin/%s/delete_selected_confirmation.html" % app_label, "admin/delete_selected_confirmation.html" ], context, context_instance=template.RequestContext(request))