Commit Graph

1181 Commits

Author SHA1 Message Date
Colin Maudry 4f18cc07f2 feat(mcp): câble le garde /_mcp + exemption CSRF dans l'app (scope B #111) 2026-07-10 15:00:53 +02:00
Colin Maudry 697711f676 feat(mcp): garde d'abonnement sur /_mcp (scope B #111) 2026-07-10 14:46:50 +02:00
Colin Maudry 4f36022443 fix(tableau): vues sauvegardées en AST canonique, cache du comptage, synchro visibilité colonnes (#41) 2026-07-10 14:44:14 +02:00
Colin Maudry 2318702e29 feat(mcp): migration 0007 kind + init schema jetons au démarrage (scope B #111) 2026-07-10 14:43:43 +02:00
Colin Maudry 647d7a7759 feat(mcp): colonne kind + fonctions jetons par utilisateur (scope B #111) 2026-07-10 14:39:02 +02:00
Colin Maudry 9314da7ee6 docs(mcp): plan d'implémentation du connecteur MCP (scope B #111) 2026-07-10 14:35:52 +02:00
Colin Maudry 0bfac680a5 fix(tableau): vues sauvegardées pré-migration + double comptage track_search (#41)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-10 14:34:47 +02:00
Colin Maudry 7941b08d4a docs(mcp): spec du connecteur MCP par jeton abonné (scope B #111) 2026-07-10 14:24:19 +02:00
Colin Maudry e59e2e50b3 test: adapter les tests DataTable historiques à la migration AG Grid de /tableau (#41) 2026-07-10 14:20:27 +02:00
Colin Maudry c81533aa8e test(tableau): intégration AG Grid end-to-end (#41)
Vérifie via Selenium/DashComposite que /tableau charge et affiche la
grille AG Grid avec au moins une ligne rendue, sans erreur console
SEVERE. Dernière tâche de la migration DataTable -> AG Grid.
2026-07-10 14:13:43 +02:00
Colin Maudry 055b0edc7e docs(tableau): mode d'emploi réécrit pour AG Grid (#41)
Décrit les filtres de colonne AG Grid (flottant/entonnoir, texte/numérique/
date, combinaison ET/OU), le tri multi-colonne (Maj+clic) et le défilement
infini, à la place de l'ancienne syntaxe icontains/i</i> et des liens
d'exemple ?filtres=... (mécanisme retiré à la tâche 10). Retire la ligne
"Partager la vue" de la légende des boutons (bouton supprimé).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-10 13:53:19 +02:00
Colin Maudry 8efd8db07e feat(tableau): vues sauvegardées en JSON AST, retrait URL riche (#41)
Les vues stockent désormais {filterModel, columnState} en JSON dans
saved_views.query au lieu d'une query string DSL. Le rappel d'une vue
applique filterModel + columnState à la grille AG Grid via un nouveau
callback apply_saved_view, déclenché par pattern-matching sur les items
du menu "Mes vues" (désormais cliquables au lieu de liens href).

Retire restore_view_from_url, sync_url_and_reset_button,
show_confirmation, le bouton "Partager la vue" et le clientside
clean_filters de tableau.py - la migration AG Grid retire le mécanisme
d'URL riche sans rétrocompatibilité.

Le lien "Ouvrir" de compte/vues.py pointe maintenant vers /tableau nu
(limitation connue documentée, le rappel cross-page reste à faire).
2026-07-10 08:35:31 +02:00
Colin Maudry fbea2ebd53 feat(tableau): export Excel via DuckDB (AST->SQL) (#41)
Rewrite download_data to read filterModel/columnState from the AG Grid
component and add export_dataframe (compiles filterModel to SQL via
filtermodel_to_ast/ast_to_sql, builds ORDER BY, excludes hidden columns,
queries DuckDB via query_marches). Replaces the old Polars filter_query
pipeline tied to the removed DataTable.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-10 08:26:10 +02:00
Colin Maudry 436906911b feat(tableau): sélecteur de colonnes piloté par columnDefs (#41)
apply_hidden_columns régénère columnDefs (via grid_column_defs) sur
tableau_grid quand le Store tableau-hidden-columns change, remplaçant
store_hidden_columns qui ciblait l'ancienne prop hidden_columns de la
DataTable (supprimée en tâche 7). update_checkboxes_from_hidden_columns
lit désormais directement le Store plutôt que la prop de la DataTable
disparue, pour que la synchronisation cases à cocher <-> colonnes
masquées continue de fonctionner.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-10 08:17:44 +02:00
Colin Maudry 4c1c1cc987 feat(tableau): grille AG Grid + datasource getRows server-side (#41)
Remplace le composant DataTable et le callback update_table de tableau.py
par la grille dash-ag-grid (mode ligne infini) et un callback get_rows_tableau
piloté par getRowsRequest/getRowsResponse, plus un callback update_meta qui
synchronise nb_rows/btn-download-data/download-hint via un dcc.Store du total.

Les autres callbacks de la page (sélecteur de colonnes, vues sauvegardées,
export, restauration URL, aide) référencent encore les anciens
id/props (tableau_datatable, hidden_columns, filter_query, sort_by) et seront
mis à jour dans les tâches suivantes (8-11) du plan de migration #41.
2026-07-10 08:11:06 +02:00
Colin Maudry 97e1d0b5de feat(grid): columnDefs + fabrique ag_grid (#41) 2026-07-10 08:05:19 +02:00
Colin Maudry 2ce52d9eab feat(grid): fetch_grid_page datasource server-side AG Grid (#41) 2026-07-10 08:00:59 +02:00
Colin Maudry a7662a8561 feat(query): sort_model_to_sql + sérialisation AST (#41)
Ajoute sort_model_to_sql (adapte le sortModel AG Grid vers sort_by_to_sql
existant) et ast_to_dict/ast_from_dict pour le round-trip JSON de l'AST,
nécessaire aux vues sauvegardées.
2026-07-10 07:57:41 +02:00
Colin Maudry 33ea1205cf feat(query): filtermodel_to_ast (filterModel AG Grid -> AST) (#41) 2026-07-10 07:53:46 +02:00
Colin Maudry 979874760d fix(query): range sur colonnes non-numériques + blank/notBlank sur numérique/date (#41)
- `range` était ignoré silencieusement (TRUE, pas de filtre) sur les
  colonnes texte/date car seul `_numeric_to_sql` le gérait. Ajout du
  cas `range` dans la branche texte/date (BETWEEN, CAST VARCHAR pour
  les dates, comme les autres opérateurs de comparaison).
- `blank`/`notBlank` comparaient toujours à `''`, ce qui fait planter
  DuckDB (Conversion Error) sur les colonnes numériques/date. Le
  check est déplacé après le calcul de is_numeric/col_is_date : ces
  types utilisent IS [NOT] NULL sans comparaison à chaîne vide.
2026-07-10 07:49:43 +02:00
Colin Maudry 68f615370f feat(query): AST de filtre + compilateur ast_to_sql (#41)
Ajoute une représentation canonique du filtre sous forme d'AST booléen
(Condition/And/Or/Not) et son compilateur vers SQL DuckDB paramétré
(ast_to_sql). Réutilise tokenize_text_filter pour les feuilles texte.

Fondation pour la migration /tableau vers dash-ag-grid : cet AST sera
alimenté par le filterModel d'AG Grid (tâche suivante) et, plus tard,
par un champ de requête booléenne libre (#97).
2026-07-10 07:44:30 +02:00
Colin Maudry 7454d0db32 build: ajouter la dépendance dash-ag-grid (#41)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-10 07:41:19 +02:00
Colin Maudry 74c5de0bda docs(tableau): plan d'implémentation migration AG Grid Lot 1 (#41)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 07:27:30 +02:00
Colin Maudry 91d3153e10 docs(tableau): trancher scroll infini + export DuckDB dans le spec (#41)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 22:52:03 +02:00
Colin Maudry 41236df0fe docs(tableau): spec de design migration AG Grid (Lot 1, #41)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 22:45:41 +02:00
Colin Maudry d69ae9b8de Merge branch '111-mcp-tools' into dev 2026-07-09 21:53:57 +02:00
Colin Maudry 24bc1c08c1 test(mcp): combler les lacunes de couverture relevées par la revue finale
Ajoute des tests de bout en bout pour les filtres montant/date/cpv, le
chemin titulaire de search_organisations, et la pagination (page>1,
clamping page=0). Normalise montant_total en float dans les deux
branches de compute_org_stats.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 21:43:26 +02:00
Colin Maudry 082d3e24b1 feat(mcp): activer le serveur MCP via DASH_MCP_ENABLED (scope A #111) 2026-07-09 20:50:14 +02:00
Colin Maudry 903b1e4dfd docs: ajouter l'entrée changelog pour le serveur MCP (#111)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 20:42:28 +02:00
Colin Maudry 5a6bd59297 feat(mcp): expose les 4 fonctions métier via @mcp_enabled
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 20:35:24 +02:00
Colin Maudry dee6e37932 Liste des codes CPV 2026-07-09 20:32:29 +02:00
Colin Maudry ee98aa8186 feat(mcp): tools stats_acheteur / stats_titulaire (agrégations) 2026-07-09 20:30:16 +02:00
Colin Maudry 11da1e9d8d feat(mcp): tool rechercher_marches (filtres hybrides + pagination) 2026-07-09 20:23:05 +02:00
Colin Maudry 47694f2e5d test(mcp): vérifier l'extraction HTML->texte plain du nom (revue Task 4) 2026-07-09 20:18:28 +02:00
Colin Maudry fb4ffaa3e2 Revert "feat(mcp): search_org accepte track=False pour ne pas polluer Matomo"
This reverts commit ce9a79f420.
2026-07-09 20:16:08 +02:00
Colin Maudry ef1e4503c9 Cleanup commentaires .env 2026-07-09 20:14:37 +02:00
Colin Maudry e2d1082e92 feat(mcp): tool search_organisations (résolution nom -> id)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 20:13:17 +02:00
Colin Maudry 9303c5e206 feat(mcp): search_org accepte track=False pour ne pas polluer Matomo
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 20:04:55 +02:00
Colin Maudry ce9a79f420 feat(mcp): search_org accepte track=False pour ne pas polluer Matomo
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 20:01:57 +02:00
Colin Maudry 571c56ef71 feat(mcp): helper track_mcp_tool pour tracer les appels MCP dans Matomo 2026-07-09 19:57:09 +02:00
Colin Maudry e407f87529 feat(mcp): sérialisation Polars -> JSON pour les tools MCP
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 19:53:08 +02:00
Colin Maudry 6bc7540941 docs: plan d'implémentation tools MCP (scope A de #111)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 19:47:07 +02:00
Colin Maudry 11cada2ffc docs: spec design tools MCP (scope A de #111)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 19:36:45 +02:00
Colin Maudry 722694bec9 fix: remplacer la couleur d'accentuation Dash 4 par notre couleur primaire (#101)
Dash 4 utilise le token CSS --Dash-Fill-Interactive-Strong (violet par
défaut) pour l'état actif/focus des composants dcc (Dropdown, Input,
Tabs, DatePicker...). Surchargé au :root avec var(--primary-color).
2026-07-09 17:52:51 +02:00
Colin Maudry 9cf065e0db fix: traduire en français les libellés des dcc.Dropdown (#101)
Dash 4 introduit le prop labels sur dcc.Dropdown ("Select all",
"Deselect all", placeholder "Search", etc.). Ajout d'un dict partagé
DROPDOWN_LABELS_FR (src/utils/frontend.py) appliqué aux 11 dcc.Dropdown
de l'app (observatoire.py, acheteur.py, titulaire.py).
2026-07-09 17:41:05 +02:00
Colin Maudry 07bb4a91d0 fix: masquer les boutons +/- (steppers) sur les champs montant min/max (#101)
Dash 4 ajoute des boutons +/- aux dcc.Input type="number" ; inutiles pour
des montants et prennent de la place, retirés via .dash-input-stepper
(l'input récupère l'espace grâce à son flex: 1 1 0).
2026-07-09 17:30:59 +02:00
Colin Maudry d0e80b6be5 style: accepter le rendu DCC Dash 4 et retirer le CSS en conflit (#101)
Dash 4.4 remplace complètement le react-select v1 sous-jacent de
dcc.Dropdown par un nouveau composant (classes dash-dropdown-*) : les 11
Dropdown de l'app (acheteur.py, titulaire.py, observatoire.py, dont 5
multi=True) restent fonctionnels tels quels — ouverture, recherche,
sélection simple/multiple, fermeture. Le nouveau défaut
closeOnSelect=False sur les multi-select (menu qui reste ouvert après
sélection) est accepté sans correction, conformément au plan.

Retrait de la règle CSS .Select--multi .Select-value (style.css),
devenue totalement inerte : dcc.Dropdown ne rend plus ces classes
react-select, et aucune colonne dropdown de dash_table (admin) n'est
configurée en multi-select. Les autres règles .Select-* (Select-menu-outer,
Select-placeholder) sont conservées : elles servent encore l'éditeur de
cellules dropdown de dash_table (hors périmètre de cette migration).
2026-07-09 16:49:45 +02:00
Colin Maudry ab1efdd3b1 build: bump dash 3.4 -> 4.4 et résolution des dépendances (#101) 2026-07-09 16:30:01 +02:00
Colin Maudry 0950e5c375 docs(plan): plan d'implémentation de la migration Dash 4.4 (#101)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-09 16:15:10 +02:00
Colin Maudry cc1caa9671 docs(spec): design de la migration Dash 3.4 → 4.4 (#101)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-09 16:12:11 +02:00