fields: allow prefilling of items fields (#22146)
This commit is contained in:
parent
44080b2fae
commit
3b4d51a9d7
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue