From b65adb295dc3faa332ad6c8f090739e3ea6796a0 Mon Sep 17 00:00:00 2001 From: Tom Talbot Date: Sat, 27 Sep 2014 14:35:16 +0100 Subject: [PATCH 1/3] Unit test for form-builder forms with multiple checkboxes --- wagtail/tests/fixtures/test.json | 14 +++++++++++ wagtail/wagtailforms/tests.py | 41 +++++++++++++++++++++++++------- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/wagtail/tests/fixtures/test.json b/wagtail/tests/fixtures/test.json index 414a2e96ef..d16affe480 100644 --- a/wagtail/tests/fixtures/test.json +++ b/wagtail/tests/fixtures/test.json @@ -256,6 +256,20 @@ "page": 8 } }, +{ + "pk": 3, + "model": "tests.formfield", + "fields": { + "sort_order": 3, + "label": "Your choices", + "field_type": "checkboxes", + "required": false, + "choices": "foo,bar,baz", + "default_value": "", + "help_text": "", + "page": 8 + } +}, { "pk": 10, diff --git a/wagtail/wagtailforms/tests.py b/wagtail/wagtailforms/tests.py index 28df108ab7..34ffde773c 100644 --- a/wagtail/wagtailforms/tests.py +++ b/wagtail/wagtailforms/tests.py @@ -24,7 +24,9 @@ class TestFormSubmission(TestCase): def test_post_invalid_form(self): response = self.client.post('/contact-us/', { - 'your-email': 'bob', 'your-message': 'hello world' + 'your-email': 'bob', + 'your-message': 'hello world', + 'your-choices': '' }) # Check response @@ -34,7 +36,9 @@ class TestFormSubmission(TestCase): def test_post_valid_form(self): response = self.client.post('/contact-us/', { - 'your-email': 'bob@example.com', 'your-message': 'hello world' + 'your-email': 'bob@example.com', + 'your-message': 'hello world', + 'your-choices': {'foo': '', 'bar': '', 'baz': ''} }) # Check response @@ -45,7 +49,7 @@ class TestFormSubmission(TestCase): # Check that an email was sent self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, "The subject") - self.assertTrue("Your message: hello world" in mail.outbox[0].body) + self.assertIn("Your message: hello world", mail.outbox[0].body) self.assertEqual(mail.outbox[0].to, ['to@email.com']) self.assertEqual(mail.outbox[0].from_email, 'from@email.com') @@ -53,6 +57,27 @@ class TestFormSubmission(TestCase): form_page = Page.objects.get(url_path='/home/contact-us/') self.assertTrue(FormSubmission.objects.filter(page=form_page, form_data__contains='hello world').exists()) + def test_post_multiple_values(self): + response = self.client.post('/contact-us/', { + 'your-email': 'bob@example.com', + 'your-message': 'hello world', + 'your-choices': {'foo': 'on', 'bar': 'on', 'baz': 'on'} + }) + + # Check response + self.assertContains(response, "Thank you for your feedback.") + self.assertTemplateNotUsed(response, 'tests/form_page.html') + self.assertTemplateUsed(response, 'tests/form_page_landing.html') + + # Check that the three checkbox values were saved correctly + form_page = Page.objects.get(url_path='/home/contact-us/') + submission = FormSubmission.objects.filter( + page=form_page, form_data__contains='hello world' + ) + self.assertIn("foo", submission[0].form_data) + self.assertIn("bar", submission[0].form_data) + self.assertIn("baz", submission[0].form_data) + class TestPageModes(TestCase): fixtures = ['test.json'] @@ -89,9 +114,9 @@ class TestFormBuilder(TestCase): This tests that all fields were added to the form with the correct types """ form_class = self.fb.get_form_class() - - self.assertTrue('your-email' in form_class.base_fields.keys()) - self.assertTrue('your-message' in form_class.base_fields.keys()) + + self.assertIn('your-email', form_class.base_fields.keys()) + self.assertIn('your-message', form_class.base_fields.keys()) self.assertIsInstance(form_class.base_fields['your-email'], forms.EmailField) self.assertIsInstance(form_class.base_fields['your-message'], forms.CharField) @@ -178,7 +203,7 @@ class TestFormsIndex(TestCase): response = self.client.get(reverse('wagtailforms_index')) # Check that the user can see the form page - self.assertTrue(self.form_page in response.context['form_pages']) + self.assertIn(self.form_page, response.context['form_pages']) class TestFormsSubmissions(TestCase): @@ -259,4 +284,4 @@ class TestFormsSubmissions(TestCase): # Check response self.assertEqual(response.status_code, 200) data_line = response.content.decode().split("\n")[1] - self.assertTrue('new@example.com' in data_line) + self.assertIn('new@example.com', data_line) From 8266684c37c4c47fc9cfdb69a1f38aaca31f2e0b Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Thu, 30 Oct 2014 10:02:45 +0000 Subject: [PATCH 2/3] Use form.cleaned_data when processing submissions This fixes #584. It also doesn't pack single values into lists and will remove csrftoken for us. --- wagtail/wagtailforms/models.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/wagtail/wagtailforms/models.py b/wagtail/wagtailforms/models.py index 80b82e8f29..2774d41383 100644 --- a/wagtail/wagtailforms/models.py +++ b/wagtail/wagtailforms/models.py @@ -131,14 +131,8 @@ class AbstractForm(Page): return {} def process_form_submission(self, form): - # remove csrf_token from form.data - form_data = dict( - i for i in form.data.items() - if i[0] != 'csrfmiddlewaretoken' - ) - FormSubmission.objects.create( - form_data=json.dumps(form_data), + form_data=json.dumps(form.cleaned_data), page=self, ) From bdeaea7b557c016ead19985448d6a1cdadc16547 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Thu, 30 Oct 2014 14:47:14 +0000 Subject: [PATCH 3/3] release note for #768 --- CHANGELOG.txt | 1 + docs/releases/0.8.rst | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index ff21c64f3e..e1f8d4ff7a 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -22,6 +22,7 @@ Changelog * Fix: Fixed references to "username" in login form help text for better custom user model support (John-Scott Atlakson) * Fix: Later items in a model's search_field list now consistently override earlier items, allowing subclasses to redefine rules from the parent * Fix: Image uploader now accepts JPEG images that PIL reports as being in MPO format + * Fix: Multiple checkbox fields on form-builder forms did not correctly save multiple values 0.7 (09.10.2014) ~~~~~~~~~~~~~~~~ diff --git a/docs/releases/0.8.rst b/docs/releases/0.8.rst index eb857ab82c..af3ee08ec7 100644 --- a/docs/releases/0.8.rst +++ b/docs/releases/0.8.rst @@ -37,7 +37,8 @@ Bug fixes * Search indexing now avoids trying to index abstract models * Fixed references to "username" in login form help text for better custom user model support * Later items in a model's search_field list now consistently override earlier items, allowing subclasses to redefine rules from the parent -* Image uploader now accepts JPEG images that PIL reports as being in MPO format + * Image uploader now accepts JPEG images that PIL reports as being in MPO format + * Multiple checkbox fields on form-builder forms did not correctly save multiple values Upgrade considerations ======================