From 227200e0a29655b29206f3349d81e8c574b6aed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 24 Jan 2019 10:05:59 +0100 Subject: [PATCH] forms: fix live condition against zeroed items field (#30049) --- tests/test_form_pages.py | 37 +++++++++++++++++++++++++++++++++++++ wcs/formdef.py | 10 +++++----- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/tests/test_form_pages.py b/tests/test_form_pages.py index d374111a2..9d1c9a202 100644 --- a/tests/test_form_pages.py +++ b/tests/test_form_pages.py @@ -5563,6 +5563,43 @@ def test_field_live_condition(pub): assert 'Bar' in resp.body assert 'Foo' in resp.body +def test_field_live_items_condition(pub): + FormDef.wipe() + formdef = FormDef() + formdef.name = 'Foo' + formdef.fields = [ + fields.ItemsField(type='items', id='1', label='Bar', + items=['a', 'b'], varname='bar'), + fields.StringField(type='string', id='2', label='Foo', size='40', + required=True, varname='foo', + condition={'type': 'django', 'value': '"b" in form_var_bar'}), + ] + formdef.store() + + user = create_user(pub) + app = login(get_app(pub), username='foo', password='foo') + resp = app.get('/foo/') + assert 'f1$element0' in resp.form.fields + assert 'f1$element1' in resp.form.fields + assert 'f2' in resp.form.fields + assert resp.html.find('div', {'data-field-id': '1'}).attrs['data-live-source'] == 'true' + assert resp.html.find('div', {'data-field-id': '2'}).attrs.get('style') == 'display: none' + resp.form['f1$element0'].checked = True + app.post('/foo/autosave', params=resp.form.submit_fields()) + live_resp = app.post('/foo/live', params=resp.form.submit_fields()) + assert live_resp.json['result']['1']['visible'] + assert not live_resp.json['result']['2']['visible'] + resp.form['f1$element1'].checked = True + app.post('/foo/autosave', params=resp.form.submit_fields()) + live_resp = app.post('/foo/live', params=resp.form.submit_fields()) + assert live_resp.json['result']['1']['visible'] + assert live_resp.json['result']['2']['visible'] + resp.form['f1$element0'].checked = False + resp.form['f1$element1'].checked = False + live_resp = app.post('/foo/live', params=resp.form.submit_fields()) + assert live_resp.json['result']['1']['visible'] + assert not live_resp.json['result']['2']['visible'] + def test_field_condition_on_required_field(pub): # from https://dev.entrouvert.org/issues/27247 FormDef.wipe() diff --git a/wcs/formdef.py b/wcs/formdef.py index 570f94e9e..37d50f705 100644 --- a/wcs/formdef.py +++ b/wcs/formdef.py @@ -626,17 +626,17 @@ class FormDef(StorableObject): def get_field_data(self, field, widget): d = {} d[field.id] = widget.parse() - if d.get(field.id) and field.convert_value_from_str: + if d.get(field.id) is not None and field.convert_value_from_str: d[field.id] = field.convert_value_from_str(d[field.id]) - if d.get(field.id) and field.store_display_value: + if d.get(field.id) is not None and field.store_display_value: display_value = field.store_display_value(d, field.id) - if display_value: + if display_value is not None: d['%s_display' % field.id] = display_value elif d.has_key('%s_display' % field.id): del d['%s_display' % field.id] - if d.get(field.id) and field.store_structured_value: + if d.get(field.id) is not None and field.store_structured_value: structured_value = field.store_structured_value(d, field.id) - if structured_value: + if structured_value is not None: d['%s_structured' % field.id] = structured_value elif '%s_structured' % field.id in d: del d['%s_structured' % field.id]