api: include first value for a repeated varname (#42468)
This commit is contained in:
parent
ce94f2f03d
commit
31ff9f2f9a
|
@ -1259,6 +1259,71 @@ def test_formdata_backoffice_fields(pub, local_user):
|
|||
assert resp.json['workflow']['fields']['backoffice_blah'] == 'Hello world'
|
||||
|
||||
|
||||
def test_formdata_duplicated_varnames(pub, local_user):
|
||||
Role.wipe()
|
||||
role = Role(name='test')
|
||||
role.id = '123'
|
||||
role.store()
|
||||
another_role = Role(name='another')
|
||||
another_role.id = '321'
|
||||
another_role.store()
|
||||
FormDef.wipe()
|
||||
formdef = FormDef()
|
||||
formdef.geolocations = {'base': 'blah'}
|
||||
formdef.name = 'test'
|
||||
formdef.fields = [
|
||||
fields.StringField(id='0', label='foobar', varname='foobar'),
|
||||
fields.StringField(id='1', label='foobar2', varname='foobar'),
|
||||
]
|
||||
workflow = Workflow.get_default_workflow()
|
||||
workflow.roles['_foobar'] = 'Foobar'
|
||||
workflow.id = '2'
|
||||
workflow.store()
|
||||
formdef.workflow_id = workflow.id
|
||||
formdef.workflow_roles = {'_receiver': role.id,
|
||||
'_foobar': another_role.id}
|
||||
formdef.store()
|
||||
|
||||
formdef.data_class().wipe()
|
||||
formdata = formdef.data_class()()
|
||||
formdata.data = {
|
||||
'0': 'foo',
|
||||
'1': 'bar',
|
||||
}
|
||||
formdata.user_id = local_user.id
|
||||
formdata.just_created()
|
||||
formdata.status = 'wf-new'
|
||||
formdata.evolution[-1].status = 'wf-new'
|
||||
formdata.store()
|
||||
|
||||
local_user.roles = [role.id]
|
||||
local_user.store()
|
||||
resp = get_app(pub).get(
|
||||
sign_uri('/api/forms/test/%s/' % formdata.id, user=local_user),
|
||||
status=200)
|
||||
assert resp.json['fields'] == {'foobar': 'foo'}
|
||||
|
||||
formdata.data = {
|
||||
'0': 'foo',
|
||||
'1': '',
|
||||
}
|
||||
formdata.store()
|
||||
resp = get_app(pub).get(
|
||||
sign_uri('/api/forms/test/%s/' % formdata.id, user=local_user),
|
||||
status=200)
|
||||
assert resp.json['fields'] == {'foobar': 'foo'}
|
||||
|
||||
formdata.data = {
|
||||
'0': '',
|
||||
'1': 'foo',
|
||||
}
|
||||
formdata.store()
|
||||
resp = get_app(pub).get(
|
||||
sign_uri('/api/forms/test/%s/' % formdata.id, user=local_user),
|
||||
status=200)
|
||||
assert resp.json['fields'] == {'foobar': 'foo'}
|
||||
|
||||
|
||||
def test_formdata_edit(pub, local_user):
|
||||
test_formdata(pub, local_user)
|
||||
formdef = FormDef.select()[0]
|
||||
|
|
|
@ -1025,17 +1025,24 @@ class FormData(StorableObject):
|
|||
|
||||
def get_json_dict(self, fields, include_files=True, anonymise=False):
|
||||
new_data = {}
|
||||
seen = set()
|
||||
for field in fields:
|
||||
if anonymise and field.anonymise:
|
||||
continue
|
||||
if not field.varname: # exports only named fields
|
||||
continue
|
||||
if field.varname in seen:
|
||||
# skip fields with a varname that is used by another non-empty
|
||||
# field.
|
||||
continue
|
||||
if self.data is not None:
|
||||
value = self.data.get(field.id)
|
||||
if value and hasattr(field, 'get_json_value'):
|
||||
value = field.get_json_value(value, formdata=self, include_file_content=include_files)
|
||||
else:
|
||||
value = None
|
||||
if value:
|
||||
seen.add(field.varname)
|
||||
if field.store_display_value:
|
||||
new_data[field.varname + '_raw'] = value
|
||||
new_data[field.varname] = self.data.get('%s_display' % field.id)
|
||||
|
|
Loading…
Reference in New Issue