Fix FormSubmissionsPanel on Django 5.0 when creating a new form page

Fixes #11405

Django 5.0 rejects `FormSubmission.objects.filter(page=page)` when `page` is an unsaved in-memory instance. Since these can clearly not have any submissions, return an empty queryset in this case.

Also add end-to-end tests for the create and edit views with FormSubmissionsPanel in place.
pull/11601/head
Matt Westcott 2024-01-02 04:58:28 +00:00 zatwierdzone przez Thibaud Colas
rodzic d7c1345fa1
commit 24ad8d40dd
3 zmienionych plików z 113 dodań i 1 usunięć

Wyświetl plik

@ -18,7 +18,11 @@ class FormSubmissionsPanel(Panel):
def submissions(self):
form_page_model = self.panel.model
form_submissions_model = form_page_model().get_submission_class()
return form_submissions_model.objects.filter(page=self.instance)
if self.instance.pk:
return form_submissions_model.objects.filter(page=self.instance)
else:
# Page has not been created yet, so there can't be any submissions
return form_submissions_model.objects.none()
@cached_property
def submission_count(self):

Wyświetl plik

@ -76,6 +76,30 @@ class TestFormResponsesPanel(TestCase):
self.assertFalse(self.panel.is_shown())
class TestFormResponsesPanelWithNewPage(TestCase):
def setUp(self):
self.request = RequestFactory().get("/")
user = AnonymousUser() # technically, Anonymous users cannot access the admin
self.request.user = user
self.form_page = FormPage()
self.FormPageForm = get_form_for_model(
FormPage,
form_class=WagtailAdminPageForm,
fields=["title", "slug", "to_address", "from_address", "subject"],
)
panel = FormSubmissionsPanel().bind_to_model(FormPage)
self.panel = panel.get_bound_panel(
instance=self.form_page, form=self.FormPageForm(), request=self.request
)
def test_render_without_submissions(self):
"""The panel should not be shown if the number of submission is zero."""
self.assertFalse(self.panel.is_shown())
class TestFormResponsesPanelWithCustomSubmissionClass(WagtailTestUtils, TestCase):
def setUp(self):
self.request = RequestFactory().get("/")
@ -1824,3 +1848,85 @@ class TestPreview(WagtailTestUtils, TestCase):
response = self.client.get(preview_url + params)
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, template)
class TestFormPageCreate(WagtailTestUtils, TestCase):
def setUp(self):
# Find root page
self.root_page = Page.objects.get(id=2)
# Login
self.user = self.login()
def test_get_creation_form(self):
response = self.client.get(
reverse(
"wagtailadmin_pages:add",
args=("tests", "formpage", self.root_page.id),
)
)
self.assertEqual(response.status_code, 200)
def test_post_creation_form(self):
post_data = {
"title": "Form page!",
"slug": "contact-us",
"form_fields-TOTAL_FORMS": "1",
"form_fields-INITIAL_FORMS": "1",
"form_fields-MIN_NUM_FORMS": "0",
"form_fields-MAX_NUM_FORMS": "1000",
"form_fields-0-id": "",
"form_fields-0-label": "Field One",
"form_fields-0-field_type": "singleline",
}
response = self.client.post(
reverse(
"wagtailadmin_pages:add",
args=("tests", "formpage", self.root_page.id),
),
post_data,
)
# Find the page and check it
page = Page.objects.get(slug="contact-us")
# Should be redirected to edit page
self.assertRedirects(
response, reverse("wagtailadmin_pages:edit", args=(page.id,))
)
class TestFormPageEdit(WagtailTestUtils, TestCase):
def setUp(self):
self.form_page = make_form_page()
# Login
self.user = self.login()
def test_get_edit_form(self):
response = self.client.get(
reverse("wagtailadmin_pages:edit", args=(self.form_page.id,))
)
self.assertEqual(response.status_code, 200)
def test_post_edit_form(self):
post_data = {
"title": "Updated form page",
"slug": "contact-us",
"form_fields-TOTAL_FORMS": "1",
"form_fields-INITIAL_FORMS": "1",
"form_fields-MIN_NUM_FORMS": "0",
"form_fields-MAX_NUM_FORMS": "1000",
"form_fields-0-id": "",
"form_fields-0-label": "Field One",
"form_fields-0-field_type": "singleline",
}
response = self.client.post(
reverse("wagtailadmin_pages:edit", args=(self.form_page.id,)),
post_data,
)
# Should be redirected to edit page
self.assertRedirects(
response, reverse("wagtailadmin_pages:edit", args=(self.form_page.id,))
)
page = Page.objects.get(slug="contact-us").get_latest_revision_as_object()
self.assertEqual(page.title, "Updated form page")

Wyświetl plik

@ -49,6 +49,7 @@ from wagtail.contrib.forms.models import (
AbstractFormField,
AbstractFormSubmission,
)
from wagtail.contrib.forms.panels import FormSubmissionsPanel
from wagtail.contrib.forms.views import SubmissionsListView
from wagtail.contrib.settings.models import (
BaseGenericSetting,
@ -568,6 +569,7 @@ class FormPage(AbstractEmailForm):
],
"Email",
),
FormSubmissionsPanel(),
]