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

1""" 

2Built-in, globally-available admin actions. 

3""" 

4 

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 

13 

14 

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. 

22 

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. 

26 

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 

31 

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) 

40 

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 

60 

61 objects_name = model_ngettext(queryset) 

62 

63 if perms_needed or protected: 

64 title = _("Cannot delete %(name)s") % {"name": objects_name} 

65 else: 

66 title = _("Are you sure?") 

67 

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 } 

81 

82 request.current_app = modeladmin.admin_site.name 

83 

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 )