kopia lustrzana https://github.com/wagtail/wagtail
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
rodzic
d7c1345fa1
commit
24ad8d40dd
|
@ -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):
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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(),
|
||||
]
|
||||
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue