Le bouton utilisait height:auto, dépendant du padding/line-height par
défaut de .btn (~38px), plus haut que l'input fixé à 34px. Fixe la
hauteur du bouton à 34px pour qu'il s'aligne avec l'input.
Inclut aussi les changements en cours sur recherche.py (tagline
dynamique avec stats, home_intro, layout en fonction).
test_002_filter_persistence et test_015_org_pages_filter_date ciblaient
encore le DataTable historique (.marches_table th[data-dash-column] input)
sur /acheteurs et /titulaires ; ces deux pages rendent désormais une
grille AG Grid (src/utils/entity_grid.py). Adapte les deux tests au
filtre flottant AG Grid (col-id + .ag-floating-filter-input), sur la
colonne texte "objet" (le filtre de date AG Grid utilise un <input
type="date"> natif peu fiable à piloter via Selenium). test_002 vérifie
en plus que la persistance du filtre est bien scopée par fiche
(entity_id/year) en rechargeant la même URL.
test_marches_table_hscroll_bar_present (tests/test_tableau_hscroll.py)
ciblait aussi /acheteurs/123 pour couvrir .marches_table + table_hscroll.js
: ce comportement n'est plus exercé par aucune page migrée. Le seul repli
restant (observatoire.py, hors périmètre #41/Lot 2b) a un bug préexistant
sans rapport qui empêche son rendu en Selenium sur ce jeu de données ;
le test est donc marqué skip avec la justification détaillée, en attendant
soit la correction de ce bug séparé, soit le retrait de cette couverture.
test_003_tableau_download n'a pas nécessité de changement (callbacks
"toutes les données" inchangés).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>
Les pages acheteur/titulaire chargeaient l'intégralité des marchés d'une
organisation dans un dcc.Store côté client (jusqu'à 16k lignes pour les
plus gros acheteurs), envoyée sur le réseau à chaque interaction. Le
tableau, le top 10 et l'histogramme des distances récupèrent maintenant
leurs données via des requêtes DuckDB scopées (pagination/agrégation
poussées en SQL), sur le modèle déjà utilisé par la page tableau.
Corrige aussi le CLS des mêmes pages en réservant l'espace des
conteneurs remplis par callback (carte, top 10, histogramme).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Rename project from decp.info to colibre across all codebase
- Update domain from https://decp.info to https://colibre.fr
- Update GitHub repo references to ColinMaudry/colibre
- Rename deployment files: decpinfo-backup.* → colibre-backup.*
- Update project configuration and documentation
- Rename project assets: decp.info.png → colibre.png
- Update environment variables and constants (DOMAIN_NAME, TOKEN_PREFIX, GITHUB_REPO, etc.)
- Update URLs in all pages, tests, and configuration files
- Keep DECP acronym in text (unchanged per requirements)
- Add rebrand note to README.md
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
src/db.py : le remplacement des noms d'organisation nuls utilisait
.name.keep() sur une expression concat_str référençant *_id ; Polars nommait
alors le résultat d'après *_id, écrasant la colonne titulaire_id/acheteur_id et
laissant *_nom inchangée. Remplacé par .alias(col).
Suite de tests — élimination de la pollution inter-tests (callbacks/conn
globaux Dash) qui faisait échouer ~15 tests Selenium en exécution complète :
- tests/conftest.py : DUCKDB_PATH et DATA_SCHEMA_CACHE pointent sur des chemins
de test isolés (tests/decp.duckdb, tests/schema.cache.json, gitignorés) — on
ne touche plus jamais aux fichiers versionnés decp.duckdb et
schema.fixture.json (qui étaient mutés et cassaient la collecte au run
suivant). Viewport Chrome élargi à 1600px.
- tests/test_db.py : fixture module-scoped qui recharge src.db après le module
(test_query_marches faisait importlib.reload vers une DB temporaire au schéma
réduit, polluant le conn global → ColumnNotFoundError ensuite). Assertion mise
à jour pour le nouveau libellé "[Inconnu de l'INSEE (...)]".
Tests périmés / fragiles corrigés :
- tests/auth/test_oauth_routes.py : mock LinkedIn aligné sur la route (userinfo
récupéré via .get() séparé) ; destination post-login /compte/abonnement.
- tests/test_main.py : test_002 filtre sur dateNotification (uid retiré du
tableau), scrollIntoView (colonne hors viewport), attentes de l'application du
filtre et de la restauration de la persistance ; test_015 via
wait_for_no_elements.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Votes cappés à VOTES_PER_WEEK (pas d'accumulation) pour valoriser
les connexions régulières
- Solde de votes affiché dans la liste (input inéditable) à la place
du bandeau Alert, avec date de prochain rechargement
- Compteur de votes par feature affiché comme input inéditable en
fin de ligne (avant le bouton "+")
- Animation FLIP JS (roadmap_flip.js) : seules les lignes qui changent
de position sont animées après un vote
- Renommage votes_credited_until → votes_last_credited_at (migration 0005)
- Constantes du module utilisées dans les assertions de tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implement get_distance_histogram that creates a histogram of titulaire distances
with logarithmic scale. Add 3 unit tests covering basic functionality, null handling,
and edge cases. Also add DATA_SCHEMA_PATH to pytest env config.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>