api: accept integers as inputs for item fields (#54447)

This commit is contained in:
Frédéric Péters 2021-05-31 21:13:15 +02:00
parent c162b659eb
commit 8d80ecbedb
3 changed files with 45 additions and 39 deletions

View File

@ -707,43 +707,44 @@ def test_formdef_submit_structured(pub, local_user):
carddef.store()
data_class = carddef.data_class()
signed_url = sign_url(
'http://example.net/api/cards/test/submit'
'?format=json&orig=coucou&email=%s' % urllib.parse.quote(local_user.email),
'1234',
)
url = signed_url[len('http://example.net') :]
for post_data in [
# straight id
{'0': '0', "1": '3'},
# varnames
{'foobar': '0', 'foobar1': '3'},
# varnames with integer as values
{'foobar': 0, 'foobar1': 3},
]:
with mock.patch('wcs.qommon.misc.urlopen') as urlopen:
urlopen.side_effect = lambda *args: io.StringIO(
'''\
{"data": [{"id": 0, "text": "zéro", "foo": "bar"}, \
{"id": 1, "text": "uné", "foo": "bar1"}, \
{"id": 2, "text": "deux", "foo": "bar2"}]}'''
)
resp = get_app(pub).post_json(
url,
{
'data': {
'0': '0',
"1": '3',
}
},
signed_url = sign_url(
'http://example.net/api/cards/test/submit'
'?format=json&orig=coucou&email=%s' % urllib.parse.quote(local_user.email),
'1234',
)
url = signed_url[len('http://example.net') :]
formdata = data_class.get(resp.json['data']['id'])
assert formdata.status == 'wf-recorded'
assert formdata.data['0'] == '0'
assert formdata.data['0_display'] == 'zéro'
assert formdata.data['0_structured'] == {
'id': 0,
'text': 'zéro',
'foo': 'bar',
}
assert formdata.data['1'] == '3'
assert formdata.data['1_display'] == 'label 3'
assert formdata.data['1_structured'] == {
'id': 3,
'text': 'label 3',
'foo': 3,
}
with mock.patch('wcs.qommon.misc.urlopen') as urlopen:
urlopen.side_effect = lambda *args: io.StringIO(
'''\
{"data": [{"id": 0, "text": "zéro", "foo": "bar"}, \
{"id": 1, "text": "uné", "foo": "bar1"}, \
{"id": 2, "text": "deux", "foo": "bar2"}]}'''
)
resp = get_app(pub).post_json(url, {'data': post_data})
formdata = data_class.get(resp.json['data']['id'])
assert formdata.status == 'wf-recorded'
assert formdata.data['0'] == '0'
assert formdata.data['0_display'] == 'zéro'
assert formdata.data['0_structured'] == {
'id': 0,
'text': 'zéro',
'foo': 'bar',
}
assert formdata.data['1'] == '3'
assert formdata.data['1_display'] == 'label 3'
assert formdata.data['1_structured'] == {
'id': 3,
'text': 'label 3',
'foo': 3,
}

View File

@ -80,6 +80,8 @@ def posted_json_data_to_formdata_data(formdef, data):
display = '%s_display' % field.id
if data.get(field.id) is None:
continue
if hasattr(field, 'from_json_value'):
data[field.id] = field.from_json_value(data[field.id])
# only fill display/structured if both are absent
if display not in data and structured not in data:
if field.store_display_value:
@ -90,8 +92,6 @@ def posted_json_data_to_formdata_data(formdef, data):
structured_value = field.store_structured_value(data, field.id)
if structured_value is not None:
data[structured] = structured_value
if hasattr(field, 'from_json_value'):
data[field.id] = field.from_json_value(data[field.id])
return data

View File

@ -598,6 +598,11 @@ class Field:
return True
return False
def from_json_value(self, value):
if value is None:
return value
return str(value)
def set_value(self, data, value):
data['%s' % self.id] = value
if self.store_display_value: