api: accept integers as inputs for item fields (#54447)
This commit is contained in:
parent
c162b659eb
commit
8d80ecbedb
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue