From 1bf16d9fa1f95c50c49f9d6e6dd8ebc05430e5f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 4 Nov 2015 16:58:16 +0100 Subject: [PATCH] form: correctly ignore empty values in WidgetList (#8866) (it used to ignore None but we also want it to ignore '') --- tests/test_admin_pages.py | 40 ++++++++++++++++++++++++++++++++++++++++ wcs/qommon/form.py | 9 +++++++++ 2 files changed, 49 insertions(+) diff --git a/tests/test_admin_pages.py b/tests/test_admin_pages.py index e8421c4..71914c1 100644 --- a/tests/test_admin_pages.py +++ b/tests/test_admin_pages.py @@ -877,6 +877,46 @@ def test_form_edit_field_advanced(pub): assert resp.body.index('Additional parameters') > \ resp.body.index('') +def test_form_edit_item_field(pub): + create_superuser(pub) + create_role() + + FormDef.wipe() + formdef = FormDef() + formdef.name = 'form title' + formdef.fields = [fields.ItemField(id='1', label='1st field', type='item')] + formdef.store() + + app = login(get_app(pub)) + resp = app.get('/backoffice/forms/1/') + resp = resp.click(href='fields/') + assert '1st field' in resp.body + + resp = resp.click('Edit', href='1/') + assert resp.forms[0]['label'].value == '1st field' + resp.forms[0]['label'] = 'changed field' + resp.forms[0]['required'] = False + resp = resp.forms[0].submit('items$add_element') + # this adds a second field + assert 'items$element0' in resp.form.fields + assert 'items$element1' in resp.form.fields + # but don't fill anything + resp = resp.forms[0].submit('submit') + assert resp.location == 'http://example.net/backoffice/forms/1/fields/' + resp = resp.follow() + + assert FormDef.get(1).fields[0].label == 'changed field' + assert FormDef.get(1).fields[0].required == False + assert FormDef.get(1).fields[0].items is None + + # edit and fill with one item + resp = resp.click('Edit', href='1/') + assert resp.forms[0]['label'].value == 'changed field' + resp.forms[0]['items$element0'] = 'XXX' + resp = resp.forms[0].submit('submit') + assert resp.location == 'http://example.net/backoffice/forms/1/fields/' + assert FormDef.get(1).fields[0].items == ['XXX'] + def test_form_legacy_int_id(pub): create_superuser(pub) create_role() diff --git a/wcs/qommon/form.py b/wcs/qommon/form.py index 1bf867a..e79605e 100644 --- a/wcs/qommon/form.py +++ b/wcs/qommon/form.py @@ -1179,6 +1179,15 @@ class WidgetList(quixote.form.widget.WidgetList): r += self.render_hint(self.get_hint()) return r.getvalue() + def _parse(self, request): + values = [] + for name in self.element_names: + value = self.get(name) + if value: + values.append(value) + self.value = values or None + + class WidgetDict(quixote.form.widget.WidgetDict): # Fix the title and hint setting # FIXME: to be fixed in Quixote upstream : title and hint parameters should be removed -- 2.6.2