web/lib/django/contrib/admin/actions.py
changeset 0 0d40e90630ef
child 29 cc9b7e14412b
equal deleted inserted replaced
-1:000000000000 0:0d40e90630ef
       
     1 """
       
     2 Built-in, globally-available admin actions.
       
     3 """
       
     4 
       
     5 from django import template
       
     6 from django.core.exceptions import PermissionDenied
       
     7 from django.contrib.admin import helpers
       
     8 from django.contrib.admin.util import get_deleted_objects, model_ngettext
       
     9 from django.shortcuts import render_to_response
       
    10 from django.utils.encoding import force_unicode
       
    11 from django.utils.html import escape
       
    12 from django.utils.safestring import mark_safe
       
    13 from django.utils.text import capfirst
       
    14 from django.utils.translation import ugettext_lazy, ugettext as _
       
    15 try:
       
    16     set
       
    17 except NameError:
       
    18     from sets import Set as set     # Python 2.3 fallback
       
    19 
       
    20 def delete_selected(modeladmin, request, queryset):
       
    21     """
       
    22     Default action which deletes the selected objects.
       
    23 
       
    24     This action first displays a confirmation page whichs shows all the
       
    25     deleteable objects, or, if the user has no permission one of the related
       
    26     childs (foreignkeys), a "permission denied" message.
       
    27 
       
    28     Next, it delets all selected objects and redirects back to the change list.
       
    29     """
       
    30     opts = modeladmin.model._meta
       
    31     app_label = opts.app_label
       
    32 
       
    33     # Check that the user has delete permission for the actual model
       
    34     if not modeladmin.has_delete_permission(request):
       
    35         raise PermissionDenied
       
    36 
       
    37     # Populate deletable_objects, a data structure of all related objects that
       
    38     # will also be deleted.
       
    39 
       
    40     # deletable_objects must be a list if we want to use '|unordered_list' in the template
       
    41     deletable_objects = []
       
    42     perms_needed = set()
       
    43     i = 0
       
    44     for obj in queryset:
       
    45         deletable_objects.append([mark_safe(u'%s: <a href="%s/">%s</a>' % (escape(force_unicode(capfirst(opts.verbose_name))), obj.pk, escape(obj))), []])
       
    46         get_deleted_objects(deletable_objects[i], perms_needed, request.user, obj, opts, 1, modeladmin.admin_site, levels_to_root=2)
       
    47         i=i+1
       
    48 
       
    49     # The user has already confirmed the deletion.
       
    50     # Do the deletion and return a None to display the change list view again.
       
    51     if request.POST.get('post'):
       
    52         if perms_needed:
       
    53             raise PermissionDenied
       
    54         n = queryset.count()
       
    55         if n:
       
    56             for obj in queryset:
       
    57                 obj_display = force_unicode(obj)
       
    58                 modeladmin.log_deletion(request, obj, obj_display)
       
    59             queryset.delete()
       
    60             modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % {
       
    61                 "count": n, "items": model_ngettext(modeladmin.opts, n)
       
    62             })
       
    63         # Return None to display the change list page again.
       
    64         return None
       
    65 
       
    66     context = {
       
    67         "title": _("Are you sure?"),
       
    68         "object_name": force_unicode(opts.verbose_name),
       
    69         "deletable_objects": deletable_objects,
       
    70         'queryset': queryset,
       
    71         "perms_lacking": perms_needed,
       
    72         "opts": opts,
       
    73         "root_path": modeladmin.admin_site.root_path,
       
    74         "app_label": app_label,
       
    75         'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME,
       
    76     }
       
    77 
       
    78     # Display the confirmation page
       
    79     return render_to_response(modeladmin.delete_confirmation_template or [
       
    80         "admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.object_name.lower()),
       
    81         "admin/%s/delete_selected_confirmation.html" % app_label,
       
    82         "admin/delete_selected_confirmation.html"
       
    83     ], context, context_instance=template.RequestContext(request))
       
    84 
       
    85 delete_selected.short_description = ugettext_lazy("Delete selected %(verbose_name_plural)s")