fields: allow prefilling of items fields (#22146)

This commit is contained in:
Frédéric Péters 2018-02-28 10:42:42 +01:00
parent 44080b2fae
commit 3b4d51a9d7
3 changed files with 49 additions and 2 deletions

View File

@ -1708,6 +1708,43 @@ def test_form_page_profile_prefill_list(pub):
assert 'invalid value selected' in resp.body
assert resp.forms[0]['f0'].value == ''
def test_form_page_formula_prefill_items_field(pub):
user = create_user(pub)
formdef = create_formdef()
formdef.data_class().wipe()
formdef.fields = [fields.ItemsField(id='0', label='items',
items=['foo', 'bar', 'baz'],
prefill={'type': 'formula', 'value': '["foo", "baz"]'})]
formdef.store()
resp = get_app(pub).get('/test/')
assert resp.form['f0$element0'].checked
assert not resp.form['f0$element1'].checked
assert resp.form['f0$element2'].checked
assert 'widget-prefilled' in resp.body
assert 'Value has been automatically prefilled.' in resp.body
resp.form['f0$element0'].checked = False
resp = resp.form.submit('submit')
resp = resp.form.submit('submit').follow()
assert '>foo<' not in resp.body
assert '>bar<' not in resp.body
assert '>baz<' in resp.body
# check with remote json
ds = {'type': 'json', 'value': 'http://remote.example.net/json'}
formdef.fields = [fields.ItemsField(id='0', label='items',
data_source=ds, display_disabled_items=True,
prefill={'type': 'formula', 'value': '["2"]'})]
with mock.patch('qommon.misc.urlopen') as urlopen:
data = {'data': [{'id': '1', 'text': 'hello'}, {'id': '2', 'text': 'world'}]}
urlopen.side_effect = lambda *args: StringIO.StringIO(json.dumps(data))
resp = get_app(pub).get('/test/')
assert not resp.form['f0$element1'].checked
assert resp.form['f0$element2'].checked
def test_form_captcha(pub):
user = create_user(pub)
formdef = create_formdef()

View File

@ -282,7 +282,7 @@ class Field(object):
def get_csv_value(self, element, **kwargs):
return []
def get_prefill_value(self, user=None):
def get_prefill_value(self, user=None, force_string=True):
# returns a tuple with two items,
# 1. value[str], the value that will be used to prefill
# 2. verified[bool], a flag to know if this is a "verified" value
@ -311,7 +311,13 @@ class Field(object):
if isinstance(ret, datetime.date):
ret = ret.strftime(date_format())
if ret:
return (str(ret), False)
if force_string:
# prefilling is done with strings for most fields so
# we default to forcing the value as a string.
# (items field are prefilled with list of strings, and
# will get the native python object)
ret = str(ret)
return (ret, False)
except:
pass
@ -1330,6 +1336,9 @@ class ItemsField(WidgetField):
return
d[v] = None
def get_prefill_value(self, user=None, force_string=True):
return super(ItemsField, self).get_prefill_value(user=user, force_string=False)
def convert_value_to_str(self, value):
return value

View File

@ -1098,6 +1098,7 @@ class CheckboxesWidget(CompositeWidget):
widget.set_value(True)
else:
widget.set_value(False)
self._parsed = True
def has_error(self, request=None):
return Widget.has_error(self, request=request)