Projet

Général

Profil

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

Lauréline Guérin, 29 août 2022 11:55

Télécharger (6,09 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
1422 1422
    )
1423 1423
    assert resp.json['err_desc'] == 'Invalid value "blabla" for "filter-internal-id-value"'
1424 1424

  
1425
    # multi-ids
1426
    resp = get_app(pub).get(
1427
        sign_uri(
1428
            '/api/forms/test/list?filter-internal-id=1&filter-internal-id=3&filter-internal-id-operator=eq',
1429
            user=local_user,
1430
        )
1431
    )
1432
    assert len(resp.json) == 2
1433
    resp = get_app(pub).get(
1434
        sign_uri(
1435
            '/api/forms/test/list?filter-internal-id=1&filter-internal-id=3&filter-internal-id-operator=ne',
1436
            user=local_user,
1437
        )
1438
    )
1439
    assert len(resp.json) == 9
1440
    for operator in ['lt', 'lte', 'gt', 'gte']:
1441
        # list of values not allowed with theese operators
1442
        resp = get_app(pub).get(
1443
            sign_uri(
1444
                '/api/forms/test/list?filter-internal-id=1&filter-internal-id=3&filter-internal-id-operator=%s'
1445
                % operator,
1446
                user=local_user,
1447
            ),
1448
            status=400,
1449
        )
1450
        assert (
1451
            resp.json['err_desc']
1452
            == 'Invalid value "[\'1\', \'3\']" for "filter-internal-id" and operator "%s"' % operator
1453
        )
1454

  
1455
    # not integers
1456
    resp = get_app(pub).get(
1457
        sign_uri(
1458
            '/api/forms/test/list?filter-internal-id=1&filter-internal-id=a&filter-internal-id-operator=eq',
1459
            user=local_user,
1460
        ),
1461
        status=400,
1462
    )
1463
    assert (
1464
        resp.json['err_desc'] == 'Invalid value "[\'1\', \'a\']" for "filter-internal-id" and operator "eq"'
1465
    )
1466

  
1425 1467

  
1426 1468
def test_api_list_formdata_number_filter(pub, local_user):
1427 1469
    pub.role_class.wipe()
wcs/backoffice/management.py
1892 1892

  
1893 1893
            # check value types
1894 1894
            if filter_field.type == 'internal-id':
1895

  
1896
                def _report_error(value, operator):
1897
                    if custom_view:
1898
                        get_publisher().record_error(
1899
                            _(
1900
                                'Invalid value "%s" for custom view "%s", CardDef "%s", field "internal-id", operator "%s"'
1901
                            )
1902
                            % (
1903
                                value,
1904
                                custom_view.slug,
1905
                                custom_view.formdef.name,
1906
                                operator,
1907
                            )
1908
                        )
1909
                    else:
1910
                        report_error(
1911
                            _('Invalid value "%s" for "filter-internal-id" and operator "%s"')
1912
                            % (value, operator)
1913
                        )
1914

  
1895 1915
                if Template.is_template_string(filter_field_value):
1896 1916
                    if keep_templates:
1897 1917
                        criterias.append(criteria('id', filter_field_value))
......
1906 1926
                        criterias.append(Nothing())
1907 1927
                        continue
1908 1928

  
1909
                    def record_error(value, operator):
1910
                        get_publisher().record_error(
1911
                            _(
1912
                                'Invalid value "%s" for custom view "%s", CardDef "%s", field "internal-id", operator "%s"'
1913
                            )
1914
                            % (
1915
                                value,
1916
                                custom_view.slug,
1917
                                custom_view.formdef.name,
1918
                                operator,
1919
                            )
1920
                        )
1921

  
1922
                    if isinstance(filter_field_value, list):
1923
                        try:
1924
                            [int(v) for v in filter_field_value]
1925
                        except ValueError:
1926
                            record_error(filter_field_value, filter_field_operator)
1927
                            criterias.append(Nothing())
1928
                            continue
1929
                        if filter_field_operator == 'eq':
1930
                            criterias.append(Contains('id', filter_field_value))
1931
                        elif filter_field_operator == 'ne':
1932
                            criterias.append(NotContains('id', filter_field_value))
1933
                        else:
1934
                            record_error(filter_field_value, filter_field_operator)
1935
                            criterias.append(Nothing())
1929
                if isinstance(filter_field_value, list):
1930
                    try:
1931
                        [int(v) for v in filter_field_value]
1932
                    except ValueError:
1933
                        _report_error(filter_field_value, filter_field_operator)
1934
                        criterias.append(Nothing())
1936 1935
                        continue
1936
                    if filter_field_operator == 'eq':
1937
                        criterias.append(Contains('id', filter_field_value))
1938
                    elif filter_field_operator == 'ne':
1939
                        criterias.append(NotContains('id', filter_field_value))
1940
                    else:
1941
                        _report_error(filter_field_value, filter_field_operator)
1942
                        criterias.append(Nothing())
1943
                    continue
1937 1944
                try:
1938 1945
                    filter_field_value = int(filter_field_value)
1939 1946
                except ValueError:
1940
-