Projet

Général

Profil

0001-api-allow-multi-values-for-filter-internal-id-and-op.patch

Lauréline Guérin, 08 août 2022 17:24

Télécharger (6,16 ko)

Voir les différences:

Subject: [PATCH] api: allow multi values for filter-internal-id and operators
 eq & ne (#68013)

 tests/api/test_formdata.py   | 42 +++++++++++++++++++++++++
 wcs/backoffice/management.py | 61 ++++++++++++++++++++----------------
 2 files changed, 76 insertions(+), 27 deletions(-)
tests/api/test_formdata.py
1368 1368
    )
1369 1369
    assert resp.json['err_desc'] == 'Invalid value "blabla" for "filter-internal-id-value"'
1370 1370

  
1371
    # multi-ids
1372
    resp = get_app(pub).get(
1373
        sign_uri(
1374
            '/api/forms/test/list?filter-internal-id=1&filter-internal-id=3&filter-internal-id-operator=eq',
1375
            user=local_user,
1376
        )
1377
    )
1378
    assert len(resp.json) == 2
1379
    resp = get_app(pub).get(
1380
        sign_uri(
1381
            '/api/forms/test/list?filter-internal-id=1&filter-internal-id=3&filter-internal-id-operator=ne',
1382
            user=local_user,
1383
        )
1384
    )
1385
    assert len(resp.json) == 9
1386
    for operator in ['lt', 'lte', 'gt', 'gte']:
1387
        # list of values not allowed with theese operators
1388
        resp = get_app(pub).get(
1389
            sign_uri(
1390
                '/api/forms/test/list?filter-internal-id=1&filter-internal-id=3&filter-internal-id-operator=%s'
1391
                % operator,
1392
                user=local_user,
1393
            ),
1394
            status=400,
1395
        )
1396
        assert (
1397
            resp.json['err_desc']
1398
            == 'Invalid value "[\'1\', \'3\']" for "filter-internal-id" and operator "%s"' % operator
1399
        )
1400

  
1401
    # not integers
1402
    resp = get_app(pub).get(
1403
        sign_uri(
1404
            '/api/forms/test/list?filter-internal-id=1&filter-internal-id=a&filter-internal-id-operator=eq',
1405
            user=local_user,
1406
        ),
1407
        status=400,
1408
    )
1409
    assert (
1410
        resp.json['err_desc'] == 'Invalid value "[\'1\', \'a\']" for "filter-internal-id" and operator "eq"'
1411
    )
1412

  
1371 1413

  
1372 1414
def test_api_list_formdata_number_filter(pub, local_user):
1373 1415
    pub.role_class.wipe()
wcs/backoffice/management.py
1877 1877

  
1878 1878
            # check value types
1879 1879
            if filter_field.type == 'internal-id':
1880

  
1881
                def _report_error(value, operator):
1882
                    if custom_view:
1883
                        get_publisher().record_error(
1884
                            _(
1885
                                'Invalid value "%s" for custom view "%s", CardDef "%s", field "internal-id", operator "%s"'
1886
                            )
1887
                            % (
1888
                                value,
1889
                                custom_view.slug,
1890
                                custom_view.formdef.name,
1891
                                operator,
1892
                            )
1893
                        )
1894
                    else:
1895
                        report_error(
1896
                            _('Invalid value "%s" for "filter-internal-id" and operator "%s"')
1897
                            % (value, operator)
1898
                        )
1899

  
1880 1900
                if Template.is_template_string(filter_field_value):
1881 1901
                    if keep_templates:
1882 1902
                        criterias.append(criteria('id', filter_field_value))
......
1891 1911
                        criterias.append(Equal('status', '_none'))
1892 1912
                        continue
1893 1913

  
1894
                    def record_error(value, operator):
1895
                        get_publisher().record_error(
1896
                            _(
1897
                                'Invalid value "%s" for custom view "%s", CardDef "%s", field "internal-id", operator "%s"'
1898
                            )
1899
                            % (
1900
                                value,
1901
                                custom_view.slug,
1902
                                custom_view.formdef.name,
1903
                                operator,
1904
                            )
1905
                        )
1906

  
1907
                    if isinstance(filter_field_value, list):
1908
                        try:
1909
                            [int(v) for v in filter_field_value]
1910
                        except ValueError:
1911
                            record_error(filter_field_value, filter_field_operator)
1912
                            criterias.append(Equal('status', '_none'))
1913
                            continue
1914
                        if filter_field_operator == 'eq':
1915
                            criterias.append(Contains('id', filter_field_value))
1916
                        elif filter_field_operator == 'ne':
1917
                            criterias.append(NotContains('id', filter_field_value))
1918
                        else:
1919
                            record_error(filter_field_value, filter_field_operator)
1920
                            criterias.append(Equal('status', '_none'))
1914
                if isinstance(filter_field_value, list):
1915
                    try:
1916
                        [int(v) for v in filter_field_value]
1917
                    except ValueError:
1918
                        _report_error(filter_field_value, filter_field_operator)
1919
                        criterias.append(Equal('status', '_none'))
1921 1920
                        continue
1921
                    if filter_field_operator == 'eq':
1922
                        criterias.append(Contains('id', filter_field_value))
1923
                    elif filter_field_operator == 'ne':
1924
                        criterias.append(NotContains('id', filter_field_value))
1925
                    else:
1926
                        _report_error(filter_field_value, filter_field_operator)
1927
                        criterias.append(Equal('status', '_none'))
1928
                    continue
1922 1929
                try:
1923 1930
                    filter_field_value = int(filter_field_value)
1924 1931
                except ValueError:
1925
-