Browse Source

Refactor the user delete view into a class based view

- adapting the new approach for the template title
- moving the check to dispatch method
- relates to #8622
Mehrdad Moradizadeh 2 years ago
parent
commit
eba6a2b407

+ 2 - 1
CHANGELOG.txt

@@ -32,7 +32,8 @@ Changelog
  * Render `help_text` when set on `FieldPanel`, `MultiFieldPanel`, `FieldRowPanel`, and other panel APIs where it previously worked without official support (Matt Westcott)
  * Consolidate usage of Excel libraries to a single library `openpyxl`, removing usage of `XlsxWriter`, `tablib`, `xlrd` and `xlwt` (Jaap Roes)
  * Adopt `wagtail.admin.views.generic.IndexView` for the Users index listing and search results (Mehrdad Moradizadeh)
- * Adopt `wagtail.admin.views.generic.CreateView` for the User creation (Mehrdad Moradizadeh)
+ * Adopt `wagtail.admin.views.generic.CreateView` for the User creation view (Mehrdad Moradizadeh)
+ * Adopt `wagtail.admin.views.generic.DeleteView` for the User delete view (Mehrdad Moradizadeh)
  * Fix: Prevent `PageQuerySet.not_public` from returning all pages when no page restrictions exist (Mehrdad Moradizadeh)
  * Fix: Ensure that duplicate block ids are unique when duplicating stream blocks in the page editor (Joshua Munn)
  * Fix: Revise colour usage so that privacy & locked indicators can be seen in Windows High Contrast mode (LB (Ben Johnston))

+ 1 - 1
docs/releases/4.1.md

@@ -49,7 +49,7 @@ Snippet models that inherit from `DraftStateMixin` can now be assigned go-live a
  * Use `search` type input in documentation search (LB (Ben) Johnston)
  * Render `help_text` when set on `FieldPanel`, `MultiFieldPanel`, `FieldRowPanel`, and other panel APIs where it previously worked without official support (Matt Westcott)
  * Consolidate usage of Excel libraries to a single library `openpyxl`, removing usage of `XlsxWriter`, `tablib`, `xlrd` and `xlwt` (Jaap Roes)
- * Adopt generic class based views for the create User view and Users index listing / search results (Mehrdad Moradizadeh)
+ * Adopt generic class based views for the create User edit view, user delete view and Users index listing / search results (Mehrdad Moradizadeh)
 
 ### Bug fixes
 

+ 1 - 2
wagtail/users/templates/wagtailusers/users/confirm_delete.html

@@ -1,6 +1,5 @@
-{% extends "wagtailadmin/base.html" %}
+{% extends "wagtailadmin/generic/base.html" %}
 {% load i18n %}
-{% block titletag %}{% trans "Delete user" %}{% endblock %}
 
 {% block content %}
     {% trans "Delete user" as del_str %}

+ 1 - 1
wagtail/users/urls/users.py

@@ -7,5 +7,5 @@ urlpatterns = [
     path("", users.Index.as_view(), name="index"),
     path("add/", users.Create.as_view(), name="add"),
     path("<str:user_id>/", users.edit, name="edit"),
-    path("<str:user_id>/delete/", users.delete, name="delete"),
+    path("<str:pk>/delete/", users.Delete.as_view(), name="delete"),
 ]

+ 32 - 27
wagtail/users/views/users.py

@@ -13,7 +13,7 @@ from django.utils.translation import gettext_lazy
 from wagtail import hooks
 from wagtail.admin import messages
 from wagtail.admin.auth import permission_required
-from wagtail.admin.views.generic import CreateView, IndexView
+from wagtail.admin.views.generic import CreateView, DeleteView, IndexView
 from wagtail.compat import AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME
 from wagtail.log_actions import log
 from wagtail.permission_policies import ModelPermissionPolicy
@@ -232,32 +232,37 @@ def edit(request, user_id):
     )
 
 
-@permission_required(delete_user_perm)
-def delete(request, user_id):
-    user = get_object_or_404(User, pk=user_id)
+class Delete(DeleteView):
+    """
+    Provide the ability to delete a user within the admin.
+    """
 
-    if not user_can_delete_user(request.user, user):
-        raise PermissionDenied
+    permission_policy = ModelPermissionPolicy(User)
+    permission_required = "delete"
+    model = User
+    template_name = "wagtailusers/users/confirm_delete.html"
+    delete_url_name = "wagtailusers_users:delete"
+    index_url_name = "wagtailusers_users:index"
+    page_title = gettext_lazy("Delete user")
+    context_object_name = "user"
+    success_message = _("User '{0}' deleted.")
 
-    for fn in hooks.get_hooks("before_delete_user"):
-        result = fn(request, user)
-        if hasattr(result, "status_code"):
-            return result
-    if request.method == "POST":
-        with transaction.atomic():
-            log(user, "wagtail.delete")
-            user.delete()
-        messages.success(request, _("User '{0}' deleted.").format(user))
-        for fn in hooks.get_hooks("after_delete_user"):
-            result = fn(request, user)
-            if hasattr(result, "status_code"):
-                return result
-        return redirect("wagtailusers_users:index")
+    def dispatch(self, request, *args, **kwargs):
+        self.object = self.get_object()
+        if not user_can_delete_user(self.request.user, self.object):
+            raise PermissionDenied
+        return super().dispatch(request, *args, **kwargs)
 
-    return TemplateResponse(
-        request,
-        "wagtailusers/users/confirm_delete.html",
-        {
-            "user": user,
-        },
-    )
+    def run_before_hook(self):
+        return self.run_hook(
+            "before_delete_user",
+            self.request,
+            self.object,
+        )
+
+    def run_after_hook(self):
+        return self.run_hook(
+            "after_delete_user",
+            self.request,
+            self.object,
+        )