forms: fix live condition against zeroed items field (#30049)

This commit is contained in:
Frédéric Péters 2019-01-24 10:05:59 +01:00
parent f2f840cf36
commit 227200e0a2
2 changed files with 42 additions and 5 deletions

View File

@ -5563,6 +5563,43 @@ def test_field_live_condition(pub):
assert '<span class="label">Bar</span>' in resp.body
assert '<span class="label">Foo</span>' 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()

View File

@ -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]