diff --git a/wagtail/admin/views/generic/models.py b/wagtail/admin/views/generic/models.py index a325608fa4..64af4d8235 100644 --- a/wagtail/admin/views/generic/models.py +++ b/wagtail/admin/views/generic/models.py @@ -716,9 +716,9 @@ class EditView( return self.actions def get_object(self, queryset=None): - if "pk" not in self.kwargs: - self.kwargs["pk"] = self.args[0] - self.kwargs["pk"] = unquote(str(self.kwargs["pk"])) + if self.pk_url_kwarg not in self.kwargs: + self.kwargs[self.pk_url_kwarg] = self.args[0] + self.kwargs[self.pk_url_kwarg] = unquote(str(self.kwargs[self.pk_url_kwarg])) return super().get_object(queryset) def get_page_subtitle(self): diff --git a/wagtail/contrib/redirects/templates/wagtailredirects/edit.html b/wagtail/contrib/redirects/templates/wagtailredirects/edit.html index e69de29bb2..96f1515097 100644 --- a/wagtail/contrib/redirects/templates/wagtailredirects/edit.html +++ b/wagtail/contrib/redirects/templates/wagtailredirects/edit.html @@ -0,0 +1 @@ +{% extends "wagtailadmin/generic/edit.html" %} \ No newline at end of file diff --git a/wagtail/contrib/redirects/tests/test_redirects.py b/wagtail/contrib/redirects/tests/test_redirects.py index 079160ee7b..b53805e735 100644 --- a/wagtail/contrib/redirects/tests/test_redirects.py +++ b/wagtail/contrib/redirects/tests/test_redirects.py @@ -1,4 +1,5 @@ from django.conf import settings +from django.contrib.auth.models import Permission from django.test import TestCase, override_settings from django.urls import reverse @@ -875,7 +876,7 @@ class TestRedirectsEditView(WagtailTestUtils, TestCase): def test_simple(self): response = self.get() self.assertEqual(response.status_code, 200) - self.assertTemplateUsed(response, "wagtailadmin/generic/edit.html") + self.assertTemplateUsed(response, "wagtailredirects/edit.html") url_finder = AdminURLFinder(self.user) expected_url = "/admin/redirects/%d/" % self.redirect.id @@ -957,6 +958,39 @@ class TestRedirectsEditView(WagtailTestUtils, TestCase): # Should not redirect to index self.assertEqual(response.status_code, 200) + def test_get_with_no_permission(self, redirect_id=None): + self.user.is_superuser = False + self.user.save() + # Only basic access_admin permission is given + self.user.user_permissions.add( + Permission.objects.get( + content_type__app_label="wagtailadmin", + codename="access_admin", + ) + ) + + response = self.get() + self.assertEqual(response.status_code, 302) + self.assertRedirects(response, reverse("wagtailadmin_home")) + + def test_get_with_edit_permission_only(self): + self.user.is_superuser = False + self.user.save() + self.user.user_permissions.add( + Permission.objects.get( + content_type__app_label="wagtailadmin", + codename="access_admin", + ), + Permission.objects.get( + content_type__app_label="wagtailredirects", + codename="change_redirect", + ), + ) + + response = self.get() + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, "wagtailredirects/edit.html") + class TestRedirectsDeleteView(WagtailTestUtils, TestCase): def setUp(self): diff --git a/wagtail/contrib/redirects/urls.py b/wagtail/contrib/redirects/urls.py index af5848067d..e2b1bbc315 100644 --- a/wagtail/contrib/redirects/urls.py +++ b/wagtail/contrib/redirects/urls.py @@ -7,7 +7,7 @@ urlpatterns = [ path("", views.IndexView.as_view(), name="index"), path("results/", views.IndexView.as_view(results_only=True), name="index_results"), path("add/", views.add, name="add"), - path("/", views.Edit.as_view(), name="edit"), + path("/", views.EditView.as_view(), name="edit"), path("/delete/", views.delete, name="delete"), path("import/", views.start_import, name="start_import"), path("import/process/", views.process_import, name="process_import"), diff --git a/wagtail/contrib/redirects/views.py b/wagtail/contrib/redirects/views.py index 8d94f5d59f..55a800173f 100644 --- a/wagtail/contrib/redirects/views.py +++ b/wagtail/contrib/redirects/views.py @@ -127,24 +127,21 @@ class IndexView(generic.IndexView): ] -class Edit(generic.EditView): - model = models.Redirect +class EditView(generic.EditView): + model = Redirect form_class = RedirectForm + template_name = "wagtailredirects/edit.html" index_url_name = "wagtailredirects:index" edit_url_name = "wagtailredirects:edit" delete_url_name = "wagtailredirects:delete" - permission_required = "change_redirect" - delete_item_label = _("Delete") - submit_button_label = _("Save") + pk_url_kwarg = "redirect_id" + permission_policy = permission_policy + error_message = gettext_lazy("The redirect could not be saved due to errors.") - def get_object(self, queryset=None): - redirect_id = self.kwargs.get("redirect_id") - return get_object_or_404(self.model, id=redirect_id) - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["redirect"] = self.object - return context + def get_success_message(self): + return _("Redirect '%(redirect_title)s' updated.") % { + "redirect_title": self.object.title + } @permission_checker.require("delete")