diff -r 8d941af65caf -r 77b6da96e6f1 web/lib/django/contrib/admin/actions.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/django/contrib/admin/actions.py Wed Jun 02 18:57:35 2010 +0200 @@ -0,0 +1,73 @@ +""" +Built-in, globally-available admin actions. +""" + +from django import template +from django.core.exceptions import PermissionDenied +from django.contrib.admin import helpers +from django.contrib.admin.util import get_deleted_objects, model_ngettext +from django.shortcuts import render_to_response +from django.utils.encoding import force_unicode +from django.utils.html import escape +from django.utils.safestring import mark_safe +from django.utils.text import capfirst +from django.utils.translation import ugettext_lazy, ugettext as _ + +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, 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) + 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)) + +delete_selected.short_description = ugettext_lazy("Delete selected %(verbose_name_plural)s")