From 752f78b3a614bfbc0cda22301ae67de1d24d2407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 5 Nov 2015 00:02:50 +0100 Subject: [PATCH] form: fix handling of various optional fields (#8878) Fallout from #8862 there are various places where "value is None" should not be used as a test for the empty value as it can now also be represented as an empty string. --- tests/test_form_pages.py | 108 +++++++++++++++++++++++++++++++++++++++++++++++ wcs/qommon/form.py | 8 ++-- 2 files changed, 113 insertions(+), 3 deletions(-) diff --git a/tests/test_form_pages.py b/tests/test_form_pages.py index 0ca2246..aaa5acd 100644 --- a/tests/test_form_pages.py +++ b/tests/test_form_pages.py @@ -3,6 +3,7 @@ import hashlib import os import re import StringIO +import time import zipfile from webtest import Upload @@ -1505,3 +1506,110 @@ def test_form_page_formula_prefill_user_name(pub): resp = login(get_app(pub), username='foo', password='foo').get('/test/') assert resp.forms[0]['f0'].value == 'foo@localhost' + +def test_form_date_field_submit(pub): + formdef = create_formdef() + formdef.fields = [fields.DateField(id='0', label='string', type='date', + required=False)] + formdef.store() + resp = get_app(pub).get('/test/') + formdef.data_class().wipe() + resp.forms[0]['f0'] = '2015-01-01' + resp = resp.forms[0].submit('submit') + assert 'Check values then click submit.' in resp.body + resp = resp.forms[0].submit('submit') + assert resp.status_int == 302 + resp = resp.follow() + assert 'The form has been recorded' in resp.body + assert formdef.data_class().count() == 1 + data_id = formdef.data_class().select()[0].id + data = formdef.data_class().get(data_id) + assert time.strftime('%Y-%m-%d', data.data['0']) == '2015-01-01' + + # without filling the field + resp = get_app(pub).get('/test/') + formdef.data_class().wipe() + resp = resp.forms[0].submit('submit') + assert 'Check values then click submit.' in resp.body + resp = resp.forms[0].submit('submit') + assert resp.status_int == 302 + resp = resp.follow() + assert 'The form has been recorded' in resp.body + assert formdef.data_class().count() == 1 + data_id = formdef.data_class().select()[0].id + data = formdef.data_class().get(data_id) + assert data.data['0'] is None + +def test_form_string_regex_field_submit(pub): + formdef = create_formdef() + formdef.fields = [fields.StringField(id='0', label='string', type='string', + validation=r'\d{5}$', required=False)] + formdef.store() + + formdef.data_class().wipe() + resp = get_app(pub).get('/test/') + resp.forms[0]['f0'] = '12345' + resp = resp.forms[0].submit('submit') + assert 'Check values then click submit.' in resp.body + resp = resp.forms[0].submit('submit') + assert resp.status_int == 302 + resp = resp.follow() + assert 'The form has been recorded' in resp.body + assert formdef.data_class().count() == 1 + data_id = formdef.data_class().select()[0].id + data = formdef.data_class().get(data_id) + assert data.data['0'] == '12345' + + # without filling the field + formdef.data_class().wipe() + resp = get_app(pub).get('/test/') + resp = resp.forms[0].submit('submit') + assert 'Check values then click submit.' in resp.body + resp = resp.forms[0].submit('submit') + assert resp.status_int == 302 + resp = resp.follow() + assert 'The form has been recorded' in resp.body + assert formdef.data_class().count() == 1 + data_id = formdef.data_class().select()[0].id + data = formdef.data_class().get(data_id) + assert data.data['0'] == '' + + # with an invalid input + formdef.data_class().wipe() + resp = get_app(pub).get('/test/') + resp.forms[0]['f0'] = 'foobar' + resp = resp.forms[0].submit('submit') + assert 'wrong format' in resp.body + +def test_form_text_field_submit(pub): + formdef = create_formdef() + formdef.fields = [fields.TextField(id='0', label='string', type='text', required=False)] + formdef.store() + + formdef.data_class().wipe() + resp = get_app(pub).get('/test/') + resp.forms[0]['f0'] = '12345' + resp = resp.forms[0].submit('submit') + assert 'Check values then click submit.' in resp.body + resp = resp.forms[0].submit('submit') + assert resp.status_int == 302 + resp = resp.follow() + assert 'The form has been recorded' in resp.body + assert formdef.data_class().count() == 1 + data_id = formdef.data_class().select()[0].id + data = formdef.data_class().get(data_id) + assert data.data['0'] == '12345' + + # without filling the field + formdef.data_class().wipe() + resp = get_app(pub).get('/test/') + resp = resp.forms[0].submit('submit') + assert 'Check values then click submit.' in resp.body + resp = resp.forms[0].submit('submit') + assert resp.status_int == 302 + resp = resp.follow() + assert 'The form has been recorded' in resp.body + assert formdef.data_class().count() == 1 + data_id = formdef.data_class().select()[0].id + data = formdef.data_class().get(data_id) + assert data.data['0'] is None diff --git a/wcs/qommon/form.py b/wcs/qommon/form.py index e79605e..9c84fe3 100644 --- a/wcs/qommon/form.py +++ b/wcs/qommon/form.py @@ -450,7 +450,7 @@ class CompositeWidget(quixote.form.CompositeWidget): class TextWidget(quixote.form.TextWidget): def _parse(self, request): quixote.form.TextWidget._parse(self, request) - if self.value is not None: + if self.value: try: maxlength = int(self.attrs.get('maxlength', 0)) except (TypeError, ValueError): @@ -784,7 +784,7 @@ class WcsExtraStringWidget(StringWidget): def _parse(self, request): StringWidget._parse(self, request) - if self.field and self.field.validation and self.value is not None: + if self.field and self.field.validation and self.value: if not re.match(self.field.validation, self.value): self.error = _('wrong format') @@ -835,6 +835,8 @@ class DateWidget(StringWidget): StringWidget.parse(self, request=request) if type(self.value) is unicode: self.value = self.value.encode(get_publisher().site_charset) + if not self.value: + self.value = None return self.value @classmethod @@ -1220,7 +1222,7 @@ class TagsWidget(StringWidget): def _parse(self, request): StringWidget._parse(self, request) - if self.value is not None: + if self.value: self.value = [x.strip() for x in self.value.split(',') if x.strip()] def render_content(self): -- 2.6.2