From e6add87cd0ee2126cd4a752590314cf295036a75 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Sat, 10 Jun 2023 00:15:13 +0100 Subject: [PATCH] Update pagination behaviour on wagtail.contrib.forms to match Django standard --- wagtail/contrib/forms/tests/test_views.py | 44 ++++------------------- wagtail/contrib/forms/views.py | 44 ++++------------------- 2 files changed, 13 insertions(+), 75 deletions(-) diff --git a/wagtail/contrib/forms/tests/test_views.py b/wagtail/contrib/forms/tests/test_views.py index e2c1e56547..b1844dff6a 100644 --- a/wagtail/contrib/forms/tests/test_views.py +++ b/wagtail/contrib/forms/tests/test_views.py @@ -174,11 +174,7 @@ class TestFormsIndex(WagtailTestUtils, TestCase): response = self.client.get(reverse("wagtailforms:index"), {"p": "Hello world!"}) # Check response - self.assertEqual(response.status_code, 200) - self.assertTemplateUsed(response, "wagtailforms/index.html") - - # Check that it got page one - self.assertEqual(response.context["page_obj"].number, 1) + self.assertEqual(response.status_code, 404) def test_forms_index_pagination_out_of_range(self): # Create some more form pages to make pagination kick in @@ -188,13 +184,7 @@ class TestFormsIndex(WagtailTestUtils, TestCase): response = self.client.get(reverse("wagtailforms:index"), {"p": 99999}) # Check response - self.assertEqual(response.status_code, 200) - self.assertTemplateUsed(response, "wagtailforms/index.html") - - # Check that it got the last page - self.assertEqual( - response.context["page_obj"].number, response.context["paginator"].num_pages - ) + self.assertEqual(response.status_code, 404) def test_cannot_see_forms_without_permission(self): # Login with as a user without permission to see forms @@ -310,7 +300,7 @@ class TestFormsIndexWithLocalisationEnabled(WagtailTestUtils, TestCase): self.assertEqual(response.context["page_obj"].number, 2) response = self.client.get(self.forms_index_url, {"p": 3}) - self.assertEqual(response.context["page_obj"].number, 2) + self.assertEqual(response.status_code, 404) # now check the French pages. response = self.client.get( @@ -478,11 +468,7 @@ class TestFormsSubmissionsList(WagtailTestUtils, TestCase): ) # Check response - self.assertEqual(response.status_code, 200) - self.assertTemplateUsed(response, "wagtailforms/submissions_index.html") - - # Check that we got page one - self.assertEqual(response.context["page_obj"].number, 1) + self.assertEqual(response.status_code, 404) def test_list_submissions_pagination_out_of_range(self): self.make_list_submissions() @@ -493,13 +479,7 @@ class TestFormsSubmissionsList(WagtailTestUtils, TestCase): ) # Check response - self.assertEqual(response.status_code, 200) - self.assertTemplateUsed(response, "wagtailforms/submissions_index.html") - - # Check that we got the last page - self.assertEqual( - response.context["page_obj"].number, response.context["paginator"].num_pages - ) + self.assertEqual(response.status_code, 404) def test_list_submissions_default_order(self): response = self.client.get( @@ -1187,11 +1167,7 @@ class TestCustomFormsSubmissionsList(WagtailTestUtils, TestCase): ) # Check response - self.assertEqual(response.status_code, 200) - self.assertTemplateUsed(response, "wagtailforms/submissions_index.html") - - # Check that we got page one - self.assertEqual(response.context["page_obj"].number, 1) + self.assertEqual(response.status_code, 404) def test_list_submissions_pagination_out_of_range(self): self.make_list_submissions() @@ -1202,13 +1178,7 @@ class TestCustomFormsSubmissionsList(WagtailTestUtils, TestCase): ) # Check response - self.assertEqual(response.status_code, 200) - self.assertTemplateUsed(response, "wagtailforms/submissions_index.html") - - # Check that we got the last page - self.assertEqual( - response.context["page_obj"].number, response.context["paginator"].num_pages - ) + self.assertEqual(response.status_code, 404) class TestDeleteFormSubmission(WagtailTestUtils, TestCase): diff --git a/wagtail/contrib/forms/views.py b/wagtail/contrib/forms/views.py index f53697af0d..a014983673 100644 --- a/wagtail/contrib/forms/views.py +++ b/wagtail/contrib/forms/views.py @@ -3,7 +3,6 @@ from collections import OrderedDict from django.conf import settings from django.core.exceptions import PermissionDenied -from django.core.paginator import InvalidPage from django.shortcuts import get_object_or_404, redirect from django.urls import reverse from django.utils.translation import gettext_lazy, ngettext @@ -23,46 +22,13 @@ def get_submissions_list_view(request, *args, **kwargs): return form_page.serve_submissions_list_view(request, *args, **kwargs) -class SafePaginateListView(ListView): - """Listing view with safe pagination, allowing incorrect or out of range values""" - - paginate_by = 20 - page_kwarg = "p" - - def paginate_queryset(self, queryset, page_size): - """Paginate the queryset if needed with nice defaults on invalid param.""" - paginator = self.get_paginator( - queryset, - page_size, - orphans=self.get_paginate_orphans(), - allow_empty_first_page=self.get_allow_empty(), - ) - page_kwarg = self.page_kwarg - page_request = ( - self.kwargs.get(page_kwarg) or self.request.GET.get(page_kwarg) or 0 - ) - try: - page_number = int(page_request) - except ValueError: - if page_request == "last": - page_number = paginator.num_pages - else: - page_number = 0 - try: - if page_number > paginator.num_pages: - page_number = paginator.num_pages # page out of range, show last page - page = paginator.page(page_number) - except InvalidPage: - page = paginator.page(1) - finally: - return paginator, page, page.object_list, page.has_other_pages() - - -class FormPagesListView(SafePaginateListView): +class FormPagesListView(ListView): """Lists the available form pages for the current user""" template_name = "wagtailforms/index.html" context_object_name = "form_pages" + paginate_by = 20 + page_kwarg = "p" def __init__(self, **kwargs): super().__init__(**kwargs) @@ -174,7 +140,7 @@ class DeleteSubmissionsView(TemplateView): return context -class SubmissionsListView(SpreadsheetExportMixin, SafePaginateListView): +class SubmissionsListView(SpreadsheetExportMixin, ListView): """Lists submissions for the provided form page""" template_name = "wagtailforms/submissions_index.html" @@ -188,6 +154,8 @@ class SubmissionsListView(SpreadsheetExportMixin, SafePaginateListView): ) # used to validate ordering in URL page_title = gettext_lazy("Form data") select_date_form = None + paginate_by = 20 + page_kwarg = "p" def dispatch(self, request, *args, **kwargs): """Check permissions and set the form page"""