Support dans l'API et le MCP de l'opérateur startswith, utile pour les codes CPV

This commit is contained in:
Colin Maudry
2026-07-14 21:16:08 +02:00
parent ca320bdc1f
commit d920e1ca8e
8 changed files with 42 additions and 6 deletions
+4
View File
@@ -7,6 +7,7 @@ OPERATORS = {
"exact",
"contains",
"notcontains",
"startswith",
"differs",
"less",
"greater",
@@ -186,6 +187,9 @@ def build_where(
elif op == "notcontains":
where_parts.append(f'"{col}" NOT LIKE ?')
params.append(f"%{v}%")
elif op == "startswith":
where_parts.append(f'"{col}" LIKE ?')
params.append(f"{v}%")
elif op == "differs":
where_parts.append(f'"{col}" IS DISTINCT FROM ?')
params.append(v)
+4 -2
View File
@@ -131,6 +131,7 @@ def schema():
"- `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"
"- `in` / `notin` : dans / hors d'une liste séparée par des virgules\n"
"- `less` / `greater` : ≤ / ≥\n"
"- `strictly_less` / `strictly_greater` : < / >\n"
@@ -157,8 +158,9 @@ def data():
"""Récupère des marchés publics filtrés, triés ou agrégés.
Filtres en query string : `<colonne>__<opérateur>=<valeur>`.
Opérateurs de filtre : exact, differs, contains, notcontains, in, notin,
less, greater, strictly_less, strictly_greater, isnull, isnotnull, sort.
Opérateurs de filtre : exact, differs, contains, notcontains, startswith,
in, notin, less, greater, strictly_less, strictly_greater, isnull,
isnotnull, sort.
Agrégation (drapeaux sans valeur) : `<colonne>__groupby`,
`<colonne>__count|sum|avg|min|max`. Les colonnes agrégées sont nommées
+1 -1
View File
@@ -74,7 +74,7 @@ cache.init_app(
},
)
_mcp_enabled = os.getenv("DASH_MCP_ENABLED") == "true"
_mcp_enabled = os.getenv("DASH_MCP_ENABLED", "").lower() == "true"
app: Dash = Dash(
server=server,
+1 -1
View File
@@ -42,7 +42,7 @@ ColonneMarche = Literal[SELECTABLE_COLUMNS]
_NAMED_FILTERS = [
("acheteur_id", "acheteur_id", "exact"),
("titulaire_id", "titulaire_id", "exact"),
("cpv", "codeCPV", "contains"),
("cpv", "codeCPV", "startswith"),
("objet_contient", "objet", "contains"),
("montant_min", "montant", "greater"),
("montant_max", "montant", "less"),
+3 -2
View File
@@ -79,8 +79,9 @@ def rechercher_marches(
) -> dict:
"""Recherche paginée de marchés publics (DECP).
Filtres nommés : acheteur_id, titulaire_id, cpv (code CPV, correspondance
partielle), objet_contient (texte de l'objet), montant_min, montant_max,
Filtres nommés : acheteur_id, titulaire_id, cpv (code CPV, filtre par
préfixe — ex. « 72 » = informatique, « 7220 » = logiciels),
objet_contient (texte de l'objet), montant_min, montant_max,
date_min / date_max (format YYYY-MM-DD, sur dateNotification),
departement (code département de l'acheteur).
filtres_avances : dict optionnel {"colonne__operateur": valeur} pour les