Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/django/contrib/admin/actions.py: 24%
31 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1"""
2Built-in, globally-available admin actions.
3"""
5from django.contrib import messages
6from django.contrib.admin import helpers
7from django.contrib.admin.decorators import action
8from django.contrib.admin.utils import model_ngettext
9from django.core.exceptions import PermissionDenied
10from django.template.response import TemplateResponse
11from django.utils.translation import gettext as _
12from django.utils.translation import gettext_lazy
15@action(
16 permissions=["delete"],
17 description=gettext_lazy("Delete selected %(verbose_name_plural)s"),
18)
19def delete_selected(modeladmin, request, queryset):
20 """
21 Default action which deletes the selected objects.
23 This action first displays a confirmation page which shows all the
24 deletable objects, or, if the user has no permission one of the related
25 childs (foreignkeys), a "permission denied" message.
27 Next, it deletes all selected objects and redirects back to the change list.
28 """
29 opts = modeladmin.model._meta
30 app_label = opts.app_label
32 # Populate deletable_objects, a data structure of all related objects that
33 # will also be deleted.
34 (
35 deletable_objects,
36 model_count,
37 perms_needed,
38 protected,
39 ) = modeladmin.get_deleted_objects(queryset, request)
41 # The user has already confirmed the deletion.
42 # Do the deletion and return None to display the change list view again.
43 if request.POST.get("post") and not protected:
44 if perms_needed:
45 raise PermissionDenied
46 n = queryset.count()
47 if n:
48 for obj in queryset:
49 obj_display = str(obj)
50 modeladmin.log_deletion(request, obj, obj_display)
51 modeladmin.delete_queryset(request, queryset)
52 modeladmin.message_user(
53 request,
54 _("Successfully deleted %(count)d %(items)s.")
55 % {"count": n, "items": model_ngettext(modeladmin.opts, n)},
56 messages.SUCCESS,
57 )
58 # Return None to display the change list page again.
59 return None
61 objects_name = model_ngettext(queryset)
63 if perms_needed or protected:
64 title = _("Cannot delete %(name)s") % {"name": objects_name}
65 else:
66 title = _("Are you sure?")
68 context = {
69 **modeladmin.admin_site.each_context(request),
70 "title": title,
71 "objects_name": str(objects_name),
72 "deletable_objects": [deletable_objects],
73 "model_count": dict(model_count).items(),
74 "queryset": queryset,
75 "perms_lacking": perms_needed,
76 "protected": protected,
77 "opts": opts,
78 "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME,
79 "media": modeladmin.media,
80 }
82 request.current_app = modeladmin.admin_site.name
84 # Display the confirmation page
85 return TemplateResponse(
86 request,
87 modeladmin.delete_selected_confirmation_template
88 or [
89 "admin/%s/%s/delete_selected_confirmation.html"
90 % (app_label, opts.model_name),
91 "admin/%s/delete_selected_confirmation.html" % app_label,
92 "admin/delete_selected_confirmation.html",
93 ],
94 context,
95 )