diff --git a/wagtail/contrib/forms/tests/test_views.py b/wagtail/contrib/forms/tests/test_views.py index 14828149b5..ddcf92a6af 100644 --- a/wagtail/contrib/forms/tests/test_views.py +++ b/wagtail/contrib/forms/tests/test_views.py @@ -1263,16 +1263,30 @@ class TestDeleteFormSubmission(WagtailTestUtils, TestCase): self.form_page = Page.objects.get(url_path="/home/contact-us/") def test_delete_submission_show_confirmation(self): + delete_url = reverse( + "wagtailforms:delete_submissions", args=(self.form_page.id,) + ) + list_url = reverse("wagtailforms:list_submissions", args=(self.form_page.id,)) + response = self.client.get( reverse("wagtailforms:delete_submissions", args=(self.form_page.id,)) + f"?selected-submissions={FormSubmission.objects.first().id}" ) + self.assertEqual(response.status_code, 200) # Check show confirm page when HTTP method is GET self.assertTemplateUsed(response, "wagtailforms/confirm_delete.html") # Check that the deletion has not happened with GET request self.assertEqual(FormSubmission.objects.count(), 2) + # The delete form should have a 'next' input that points back to the list page + soup = self.get_soup(response.content) + form = soup.select_one(f'form[action^="{delete_url}"]') + self.assertIsNotNone(form) + next_input = form.find("input", {"name": "next"}) + self.assertIsNotNone(next_input) + self.assertEqual(next_input.get("value"), list_url) + def test_delete_submission_with_permissions(self): response = self.client.post( reverse("wagtailforms:delete_submissions", args=(self.form_page.id,)) @@ -1348,12 +1362,33 @@ class TestDeleteFormSubmission(WagtailTestUtils, TestCase): ) def test_delete_submission_with_next_url(self): + submission_id = FormSubmission.objects.first().id + delete_url = reverse( + "wagtailforms:delete_submissions", args=(self.form_page.id,) + ) list_url = reverse("wagtailforms:list_submissions", args=(self.form_page.id,)) next_url = list_url + "?p=2" + + response = self.client.get( + reverse("wagtailforms:delete_submissions", args=(self.form_page.id,)) + + f"?selected-submissions={submission_id}&next={next_url}" + ) + self.assertEqual(response.status_code, 200) + + # The delete form should have a 'next' input that points back to the list page + # with the same pagination querystring + soup = self.get_soup(response.content) + form = soup.select_one(f'form[action^="{delete_url}"]') + self.assertIsNotNone(form) + next_input = form.find("input", {"name": "next"}) + self.assertIsNotNone(next_input) + self.assertEqual(next_input.get("value"), next_url) + + # Submitting the form should redirect to the next URL response = self.client.post( reverse("wagtailforms:delete_submissions", args=(self.form_page.id,)), { - "selected-submissions": FormSubmission.objects.first().id, + "selected-submissions": submission_id, "next": next_url, }, ) diff --git a/wagtail/contrib/forms/views.py b/wagtail/contrib/forms/views.py index faf81aa2e9..716de2b922 100644 --- a/wagtail/contrib/forms/views.py +++ b/wagtail/contrib/forms/views.py @@ -88,7 +88,7 @@ class DeleteSubmissionsView(TemplateView): template_name = "wagtailforms/confirm_delete.html" page = None submissions = None - success_url = "wagtailforms:list_submissions" + success_url_name = "wagtailforms:list_submissions" def get_queryset(self): """Returns a queryset for the selected submissions""" @@ -115,7 +115,7 @@ class DeleteSubmissionsView(TemplateView): next_url = get_valid_next_url_from_request(self.request) if next_url: return next_url - return self.success_url + return reverse(self.success_url_name, args=(self.page.id,)) def dispatch(self, request, *args, **kwargs): """Check permissions, set the page and submissions, handle delete""" @@ -130,7 +130,7 @@ class DeleteSubmissionsView(TemplateView): if self.request.method == "POST": self.handle_delete(self.submissions) - return redirect(self.get_success_url(), page_id) + return redirect(self.get_success_url()) return super().dispatch(request, *args, **kwargs) @@ -144,9 +144,7 @@ class DeleteSubmissionsView(TemplateView): "submissions": self.submissions, } ) - next_url = get_valid_next_url_from_request(self.request) - if next_url: - context["next_url"] = next_url + context["next_url"] = self.get_success_url() return context