Projet

Général

Profil

0001-api-include-first-value-for-a-repeated-varname-42468.patch

Frédéric Péters, 24 août 2020 13:36

Télécharger (3,91 ko)

Voir les différences:

Subject: [PATCH] api: include first value for a repeated varname (#42468)

 tests/test_api.py | 65 +++++++++++++++++++++++++++++++++++++++++++++++
 wcs/formdata.py   |  7 +++++
 2 files changed, 72 insertions(+)
tests/test_api.py
1259 1259
    assert resp.json['workflow']['fields']['backoffice_blah'] == 'Hello world'
1260 1260

  
1261 1261

  
1262
def test_formdata_duplicated_varnames(pub, local_user):
1263
    Role.wipe()
1264
    role = Role(name='test')
1265
    role.id = '123'
1266
    role.store()
1267
    another_role = Role(name='another')
1268
    another_role.id = '321'
1269
    another_role.store()
1270
    FormDef.wipe()
1271
    formdef = FormDef()
1272
    formdef.geolocations = {'base': 'blah'}
1273
    formdef.name = 'test'
1274
    formdef.fields = [
1275
        fields.StringField(id='0', label='foobar', varname='foobar'),
1276
        fields.StringField(id='1', label='foobar2', varname='foobar'),
1277
    ]
1278
    workflow = Workflow.get_default_workflow()
1279
    workflow.roles['_foobar'] = 'Foobar'
1280
    workflow.id = '2'
1281
    workflow.store()
1282
    formdef.workflow_id = workflow.id
1283
    formdef.workflow_roles = {'_receiver': role.id,
1284
                              '_foobar': another_role.id}
1285
    formdef.store()
1286

  
1287
    formdef.data_class().wipe()
1288
    formdata = formdef.data_class()()
1289
    formdata.data = {
1290
        '0': 'foo',
1291
        '1': 'bar',
1292
    }
1293
    formdata.user_id = local_user.id
1294
    formdata.just_created()
1295
    formdata.status = 'wf-new'
1296
    formdata.evolution[-1].status = 'wf-new'
1297
    formdata.store()
1298

  
1299
    local_user.roles = [role.id]
1300
    local_user.store()
1301
    resp = get_app(pub).get(
1302
            sign_uri('/api/forms/test/%s/' % formdata.id, user=local_user),
1303
            status=200)
1304
    assert resp.json['fields'] == {'foobar': 'foo'}
1305

  
1306
    formdata.data = {
1307
        '0': 'foo',
1308
        '1': '',
1309
    }
1310
    formdata.store()
1311
    resp = get_app(pub).get(
1312
            sign_uri('/api/forms/test/%s/' % formdata.id, user=local_user),
1313
            status=200)
1314
    assert resp.json['fields'] == {'foobar': 'foo'}
1315

  
1316
    formdata.data = {
1317
        '0': '',
1318
        '1': 'foo',
1319
    }
1320
    formdata.store()
1321
    resp = get_app(pub).get(
1322
            sign_uri('/api/forms/test/%s/' % formdata.id, user=local_user),
1323
            status=200)
1324
    assert resp.json['fields'] == {'foobar': 'foo'}
1325

  
1326

  
1262 1327
def test_formdata_edit(pub, local_user):
1263 1328
    test_formdata(pub, local_user)
1264 1329
    formdef = FormDef.select()[0]
wcs/formdata.py
1025 1025

  
1026 1026
    def get_json_dict(self, fields, include_files=True, anonymise=False):
1027 1027
        new_data = {}
1028
        seen = set()
1028 1029
        for field in fields:
1029 1030
            if anonymise and field.anonymise:
1030 1031
                continue
1031 1032
            if not field.varname:  # exports only named fields
1032 1033
                continue
1034
            if field.varname in seen:
1035
                # skip fields with a varname that is used by another non-empty
1036
                # field.
1037
                continue
1033 1038
            if self.data is not None:
1034 1039
                value = self.data.get(field.id)
1035 1040
                if value and hasattr(field, 'get_json_value'):
1036 1041
                    value = field.get_json_value(value, formdata=self, include_file_content=include_files)
1037 1042
            else:
1038 1043
                value = None
1044
            if value:
1045
                seen.add(field.varname)
1039 1046
            if field.store_display_value:
1040 1047
                new_data[field.varname + '_raw'] = value
1041 1048
                new_data[field.varname] = self.data.get('%s_display' % field.id)
1042
-