Projet

Général

Profil

0007-api-allow-formdata-sorting-on-varname-60706.patch

Lauréline Guérin, 18 janvier 2022 15:41

Télécharger (10,6 ko)

Voir les différences:

Subject: [PATCH 7/8] api: allow formdata sorting on varname (#60706)

 tests/api/test_formdata.py          | 53 +++++++++++++++++++++++---
 tests/backoffice_pages/test_sort.py | 58 ++++++++++++++++++++++++++++-
 wcs/forms/backoffice.py             | 15 ++++++++
 3 files changed, 119 insertions(+), 7 deletions(-)
tests/api/test_formdata.py
627 627
        formdata = data_class()
628 628
        upload = PicklableUpload('test.txt', 'text/plain', 'ascii')
629 629
        upload.receive([b'base64me'])
630
        formdata.data = {'0': 'FOO BAR %d' % i, '2': upload}
630
        formdata.data = {'0': 'FOO BAR %02d' % i, '2': upload}
631 631
        formdata.user_id = local_user.id
632 632
        if i % 4 == 0:
633 633
            formdata.data['1'] = 'foo'
......
683 683
    assert resp.json[0]['evolution'][0]['who']['id'] == local_user.id
684 684

  
685 685
    assert all('status' in x['workflow'] for x in resp.json)
686
    assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 0'][0]['submission'][
686
    assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 00'][0]['submission'][
687 687
        'backoffice'
688 688
    ] is True
689
    assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 0'][0]['submission'][
689
    assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 00'][0]['submission'][
690 690
        'channel'
691 691
    ] == 'mail'
692
    assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 1'][0]['submission'][
692
    assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 01'][0]['submission'][
693 693
        'backoffice'
694 694
    ] is False
695
    assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 1'][0]['submission']['channel'] == 'web'
695
    assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 01'][0]['submission'][
696
        'channel'
697
    ] == 'web'
696 698

  
697 699
    # check filtered results
698 700
    resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-foobar3=foo', user=local_user))
......
702 704
    resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-foobar3=baz', user=local_user))
703 705
    assert len(resp.json) == 14
704 706

  
705
    resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-foobar=FOO BAR 3', user=local_user))
707
    resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-foobar=FOO BAR 03', user=local_user))
706 708
    assert len(resp.json) == 1
707 709

  
708 710
    # check filter on status
......
765 767
    get_app(pub).get(sign_uri('/api/forms/test/list?filter=all&offset=plop', user=local_user), status=400)
766 768
    get_app(pub).get(sign_uri('/api/forms/test/list?filter=all&limit=plop', user=local_user), status=400)
767 769

  
770
    if pub.is_using_postgresql():
771
        # just check ordering
772
        resp = get_app(pub).get(sign_uri('/api/forms/test/list?full=on&order_by=f0', user=local_user))
773
        assert [d['fields']['foobar'] for d in resp.json] == ['FOO BAR %02d' % i for i in range(0, 30)]
774

  
775
        resp = get_app(pub).get(sign_uri('/api/forms/test/list?full=on&order_by=-f0', user=local_user))
776
        assert [d['fields']['foobar'] for d in resp.json] == ['FOO BAR %02d' % i for i in range(29, -1, -1)]
777

  
778
        resp = get_app(pub).get(sign_uri('/api/forms/test/list?full=on&order_by=foobar', user=local_user))
779
        assert [d['fields']['foobar'] for d in resp.json] == ['FOO BAR %02d' % i for i in range(0, 30)]
780

  
781
        resp = get_app(pub).get(sign_uri('/api/forms/test/list?full=on&order_by=-foobar', user=local_user))
782
        assert [d['fields']['foobar'] for d in resp.json] == ['FOO BAR %02d' % i for i in range(29, -1, -1)]
783

  
768 784

  
769 785
def test_api_list_formdata_date_filter(pub, local_user):
770 786
    if not pub.is_using_postgresql():
......
993 1009
    )
994 1010
    assert len(resp.json) == 1
995 1011

  
1012
    # just check ordering
1013
    resp = get_app(pub).get(sign_uri('/api/forms/test/list?full=on&order_by=f0-1', user=local_user))
1014
    assert [d['fields']['blockdata_raw'][0]['string'] for d in resp.json] == [
1015
        'plop%s' % i for i in range(0, 10)
1016
    ]
1017

  
1018
    resp = get_app(pub).get(sign_uri('/api/forms/test/list?full=on&order_by=-f0-1', user=local_user))
1019
    assert [d['fields']['blockdata_raw'][0]['string'] for d in resp.json] == [
1020
        'plop%s' % i for i in range(9, -1, -1)
1021
    ]
1022

  
1023
    resp = get_app(pub).get(
1024
        sign_uri('/api/forms/test/list?full=on&order_by=blockdata_string', user=local_user)
1025
    )
1026
    assert [d['fields']['blockdata_raw'][0]['string'] for d in resp.json] == [
1027
        'plop%s' % i for i in range(0, 10)
1028
    ]
1029

  
1030
    resp = get_app(pub).get(
1031
        sign_uri('/api/forms/test/list?full=on&order_by=-blockdata_string', user=local_user)
1032
    )
1033
    assert [d['fields']['blockdata_raw'][0]['string'] for d in resp.json] == [
1034
        'plop%s' % i for i in range(9, -1, -1)
1035
    ]
1036

  
996 1037

  
997 1038
def test_api_anonymized_formdata(pub, local_user, admin_user):
998 1039
    pub.role_class.wipe()
tests/backoffice_pages/test_sort.py
232 232
    assert resp.text.index(formdata1_str) > resp.text.index(formdata4_str)
233 233

  
234 234

  
235
def test_backoffice_varname_order(pub):
236
    pub.user_class.wipe()
237
    create_superuser(pub)
238
    pub.role_class.wipe()
239
    role = pub.role_class(name='test')
240
    role.store()
241

  
242
    FormDef.wipe()
243
    formdef = FormDef()
244
    formdef.name = 'form-title'
245
    formdef.fields = [
246
        fields.StringField(id='1', label='Foo', type='string', varname='foo'),
247
    ]
248
    formdef.workflow_roles = {'_receiver': role.id}
249
    formdef.store()
250

  
251
    data_class = formdef.data_class()
252
    data_class.wipe()
253

  
254
    formdata_ids = []
255
    for i in range(0, 2):
256
        formdata = data_class()
257
        formdata.data = {'1': 'Bar %s' % i}
258
        formdata.just_created()
259
        formdata.jump_status('new')
260
        formdata.store()
261
        formdata_ids.append(formdata.id)
262

  
263
    app = login(get_app(pub))
264
    resp = app.get('/backoffice/management/form-title/?order_by=f1')
265
    ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)]
266
    assert ids == formdata_ids
267

  
268
    resp = app.get('/backoffice/management/form-title/?order_by=-f1')
269
    ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)]
270
    assert ids == list(reversed(formdata_ids))
271

  
272
    resp = app.get('/backoffice/management/form-title/?order_by=foo')
273
    ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)]
274
    assert ids == formdata_ids
275

  
276
    resp = app.get('/backoffice/management/form-title/?order_by=-foo')
277
    ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)]
278
    assert ids == list(reversed(formdata_ids))
279

  
280

  
235 281
def test_backoffice_block_columns_order(pub):
236 282
    pub.user_class.wipe()
237 283
    create_superuser(pub)
......
267 313
    block.name = 'foobar'
268 314
    block.fields = [
269 315
        fields.StringField(id='123', required=True, label='Test', type='string'),
270
        fields.ItemField(id='456', label='card field', type='item', data_source={'type': 'carddef:foo'}),
316
        fields.ItemField(
317
            id='456', label='card field', type='item', data_source={'type': 'carddef:foo'}, varname='item'
318
        ),
271 319
    ]
272 320
    block.store()
273 321

  
......
328 376
    resp = app.get('/backoffice/management/form-title/?order_by=-f8-456')
329 377
    ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)]
330 378
    assert ids == [formdata3.id, formdata2.id, formdata1.id]
379

  
380
    resp = app.get('/backoffice/management/form-title/?order_by=data_item')
381
    ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)]
382
    assert ids == [formdata1.id, formdata2.id, formdata3.id]
383

  
384
    resp = app.get('/backoffice/management/form-title/?order_by=-data_item')
385
    ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)]
386
    assert ids == [formdata3.id, formdata2.id, formdata1.id]
wcs/forms/backoffice.py
220 220
        def iter_fields(fields, block_field=None):
221 221
            for field in fields:
222 222
                field.contextual_id = field.id
223
                field.contextual_varname = None
223 224
                if block_field:
224 225
                    if field.key == 'items':
225 226
                        # not yet
226 227
                        continue
227 228
                    field.block_field = block_field
228 229
                    field.contextual_id = '%s-%s' % (field.block_field.id, field.id)
230
                    if field.varname and field.block_field.varname:
231
                        field.contextual_varname = '%s_%s' % (
232
                            field.block_field.varname,
233
                            field.varname,
234
                        )
235
                else:
236
                    field.contextual_varname = field.varname
229 237
                yield field
230 238
                if field.key == 'block':
231 239
                    yield from iter_fields(field.block.fields, block_field=field)
......
236 244
            if order_by.startswith('-'):
237 245
                order_by = order_by[1:]
238 246
                direction = '-'
247
            field_found = False
239 248
            for field in iter_fields(self.formdef.get_all_fields()):
249
                if order_by in [field.contextual_varname, 'f%s' % field.contextual_id]:
250
                    field_found = True
251
                if field.contextual_varname == order_by:
252
                    order_by = "f%s" % field.contextual_id
240 253
                if getattr(field, 'block_field', None) and 'f%s' % field.contextual_id == order_by:
241 254
                    # field of block field, sort on the first element
242 255
                    order_by = "f%s->'data'->0->>'%s'" % (field.block_field.id, field.id)
256
                if field_found:
257
                    break
243 258
            order_by = '%s%s' % (direction, order_by)
244 259
            ordered_ids = formdata_class.get_sorted_ids(order_by, clause=criterias)
245 260
            item_ids_dict = {x: True for x in item_ids}
246
-