fix(tableau): filtres à conditions multiples ignorés + tri non réinitialisé (#41)
Deux bugs découverts en usage réel sur /tableau :
1. filtermodel_to_ast lisait condition1/condition2 pour un filtre à
deux conditions (ET/OU) sur une colonne — mais AG Grid >=29.2 (la
version 35.2.0 utilisée ici) encode ça via une liste `conditions`,
confirmé par la doc Dash AG Grid "Filter Model & Dash Callbacks" >
"Filter Model Multiple Conditions". Le filtre était donc
silencieusement ignoré (colonne exclue du AST, comme si aucun
filtre n'était posé), d'où des résultats sans rapport avec les
valeurs saisies. Corrigé : filtermodel_to_ast lit désormais
`conditions` (N éléments) en priorité, avec repli sur
condition1/condition2 (forme dépréciée mais "still accepted" selon
AG Grid). L'inverse (ast_to_filtermodel, utilisé au rappel d'une
vue sauvegardée) produit aussi la forme `conditions`.
2. Le bouton "Réinitialiser" ("Supprime tous les filtres et les tris")
ne réinitialisait que filterModel, jamais le tri. Corrigé via
resetColumnState (remet les colonnes à l'état de columnDefs, qui
reflète déjà la visibilité choisie via le sélecteur de colonnes —
seul le tri est donc affecté).
Reproduit et corrigé en TDD (tests/test_query_ast.py,
tests/test_grid.py), vérifié manuellement en navigateur par l'auteur
du rapport de bug.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -202,6 +202,47 @@ def test_filtermodel_two_conditions_or():
|
||||
assert " OR " in sql and params == ["%beton%", "%ciment%"]
|
||||
|
||||
|
||||
def test_filtermodel_two_conditions_or_real_ag_grid_shape():
|
||||
"""AG Grid >=29.2 (pinné à 35.2.0 ici) envoie 'conditions' (liste), pas
|
||||
condition1/condition2 (déprécié). Voir la doc Dash AG Grid "Filter Model
|
||||
& Dash Callbacks" > "Filter Model Multiple Conditions". Bug de régression :
|
||||
filtermodel_to_ast ignorait silencieusement ces filtres (#41)."""
|
||||
fm = {
|
||||
"acheteur_nom": {
|
||||
"filterType": "text",
|
||||
"operator": "OR",
|
||||
"conditions": [
|
||||
{"filterType": "text", "type": "contains", "filter": "91"},
|
||||
{"filterType": "text", "type": "contains", "filter": "78"},
|
||||
],
|
||||
}
|
||||
}
|
||||
ast = filtermodel_to_ast(fm, SCHEMA)
|
||||
assert ast is not None, "le filtre ne doit pas être silencieusement ignoré"
|
||||
sql, params = ast_to_sql(ast, SCHEMA)
|
||||
assert " OR " in sql
|
||||
assert params == ["%91%", "%78%"]
|
||||
|
||||
|
||||
def test_filtermodel_conditions_and_three_values():
|
||||
"""La liste 'conditions' n'est pas limitée à 2 éléments (maxNumConditions)."""
|
||||
fm = {
|
||||
"objet": {
|
||||
"filterType": "text",
|
||||
"operator": "AND",
|
||||
"conditions": [
|
||||
{"filterType": "text", "type": "contains", "filter": "voirie"},
|
||||
{"filterType": "text", "type": "notContains", "filter": "reparation"},
|
||||
{"filterType": "text", "type": "contains", "filter": "route"},
|
||||
],
|
||||
}
|
||||
}
|
||||
ast = filtermodel_to_ast(fm, SCHEMA)
|
||||
sql, params = ast_to_sql(ast, SCHEMA)
|
||||
assert sql.count(" AND ") >= 2
|
||||
assert params == ["%voirie%", "%reparation%", "%route%"]
|
||||
|
||||
|
||||
def test_filtermodel_multiple_columns_are_anded():
|
||||
fm = {
|
||||
"objet": {"filterType": "text", "type": "contains", "filter": "voirie"},
|
||||
|
||||
Reference in New Issue
Block a user