From 17e9c33934df3bef308ff56dda7527692ca7c938 Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Tue, 14 Jul 2026 21:23:07 +0200 Subject: [PATCH] =?UTF-8?q?ILIKE=20g=C3=A9n=C3=A9ralis=C3=A9=20dans=20API/?= =?UTF-8?q?MCP=20pour=20contains?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/filters.py | 6 +++--- src/api/routes.py | 6 ++++-- src/pages/compte/mcp.py | 2 +- tests/api/test_filters.py | 6 +++--- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/api/filters.py b/src/api/filters.py index 5440ec3..8c1fd5b 100644 --- a/src/api/filters.py +++ b/src/api/filters.py @@ -182,13 +182,13 @@ def build_where( where_parts.append(f'"{col}" {op_sql[op]} ?') params.append(v) elif op == "contains": - where_parts.append(f'"{col}" LIKE ?') + where_parts.append(f'"{col}" ILIKE ?') params.append(f"%{v}%") elif op == "notcontains": - where_parts.append(f'"{col}" NOT LIKE ?') + where_parts.append(f'"{col}" NOT ILIKE ?') params.append(f"%{v}%") elif op == "startswith": - where_parts.append(f'"{col}" LIKE ?') + where_parts.append(f'"{col}" ILIKE ?') params.append(f"{v}%") elif op == "differs": where_parts.append(f'"{col}" IS DISTINCT FROM ?') diff --git a/src/api/routes.py b/src/api/routes.py index 34c0731..0dcbc30 100644 --- a/src/api/routes.py +++ b/src/api/routes.py @@ -130,8 +130,10 @@ def schema(): "**Filtres** (`__=`) :\n" "- `exact` : égal à la valeur\n" "- `differs` : différent de la valeur (null-safe, `IS DISTINCT FROM`)\n" - "- `contains` / `notcontains` : contient / ne contient pas (LIKE)\n" - "- `startswith` : commence par (préfixe, ex. `codeCPV__startswith=72`)\n" + "- `contains` / `notcontains` : contient / ne contient pas " + "(insensible à la casse)\n" + "- `startswith` : commence par (préfixe, insensible à la casse, " + "ex. `codeCPV__startswith=72`)\n" "- `in` / `notin` : dans / hors d'une liste séparée par des virgules\n" "- `less` / `greater` : ≤ / ≥\n" "- `strictly_less` / `strictly_greater` : < / >\n" diff --git a/src/pages/compte/mcp.py b/src/pages/compte/mcp.py index 16c7097..9474125 100644 --- a/src/pages/compte/mcp.py +++ b/src/pages/compte/mcp.py @@ -131,7 +131,7 @@ def prompt_tips(): html.Ul([html.Li(html.Em(f"« {p} »")) for p in exemples]), html.P( "Astuce colonnes : demandez à l'assistant de vous proposer les " - "colonnes disponibles pour choisir précisément ce qui s'affiche sous la forme, si possible d'une liste de cases à cocher " + "colonnes disponibles pour choisir précisément ce qui s'affiche, si possible sous la forme d'une liste de cases à cocher " "(les colonnes par défaut restent pré-sélectionnées). Chaque " "marché renvoyé inclut un lien direct vers sa fiche sur colibre.", className="text-muted", diff --git a/tests/api/test_filters.py b/tests/api/test_filters.py index 4c25f87..f02d1d2 100644 --- a/tests/api/test_filters.py +++ b/tests/api/test_filters.py @@ -29,19 +29,19 @@ def test_exact_filter(): def test_contains_filter_uses_like_wildcards(): where, params, _ = build_where([("objet__contains", "informatique")], SCHEMA) - assert where == '"objet" LIKE ?' + assert where == '"objet" ILIKE ?' assert params == ["%informatique%"] def test_notcontains_filter(): where, params, _ = build_where([("objet__notcontains", "x")], SCHEMA) - assert where == '"objet" NOT LIKE ?' + assert where == '"objet" NOT ILIKE ?' assert params == ["%x%"] def test_startswith_filter_uses_prefix_wildcard(): where, params, _ = build_where([("objet__startswith", "72")], SCHEMA) - assert where == '"objet" LIKE ?' + assert where == '"objet" ILIKE ?' assert params == ["72%"]