Merge tag 'v2.7.2' into dev

- Chargement des données depuis une base DuckDB plutôt qu'en mémoire (plus de stabilité) ([#71](https://github.com/ColinMaudry/decp.info/issues/71))
- Mise en cache des vue sur l'observatoire pour un chargement plus rapide (remise à zéro quotidienne)
- Correction de bug : la liste de colonnes par défaut est bien appliquée plutôt qu'afficher toutes les colonnes
- Quelques corrections de bugs d'affichage
- Refactorisation des fonctions utilitaires (`utils.py` approchait des 1 000 lignes)
This commit is contained in:
Colin Maudry
2026-04-19 15:33:58 +02:00
7 changed files with 22 additions and 11 deletions
+9 -1
View File
@@ -1,3 +1,11 @@
#### 2.7.2 (19 avril 2026)
- Chargement des données depuis une base DuckDB plutôt qu'en mémoire (plus de stabilité) ([#71](https://github.com/ColinMaudry/decp.info/issues/71))
- Mise en cache des vue sur l'observatoire pour un chargement plus rapide (remise à zéro quotidienne)
- Correction de bug : la liste de colonnes par défaut est bien appliquée plutôt qu'afficher toutes les colonnes
- Quelques corrections de bugs d'affichage
- Refactorisation des fonctions utilitaires (`utils.py` approchait des 1 000 lignes)
#### 2.7.1 (23 mars 2026) #### 2.7.1 (23 mars 2026)
- Correction du partage de données filtrées entre dashboard et vue des données - Correction du partage de données filtrées entre dashboard et vue des données
@@ -182,7 +190,7 @@
### 1.0.0 ### 1.0.0
- publication sur https://decp.info - publication sur <https://decp.info>
- ajout d'une vue équivalente au format DECP réglementaire - ajout d'une vue équivalente au format DECP réglementaire
- personnalisation de datasette - personnalisation de datasette
- script de conversion quotidien basé sur [dataflows](https://github.com/datahq/dataflows) - script de conversion quotidien basé sur [dataflows](https://github.com/datahq/dataflows)
+1 -1
View File
@@ -1,6 +1,6 @@
# decp.info # decp.info
> v2.7.1 > v2.7.2
> Outil d'exploration et de téléchargement des données essentielles de la commande publique. > Outil d'exploration et de téléchargement des données essentielles de la commande publique.
=> [decp.info](https://decp.info) => [decp.info](https://decp.info)
+1 -1
View File
@@ -1,7 +1,7 @@
[project] [project]
name = "decp.info" name = "decp.info"
description = "Interface d'exploration et d'analyse des marchés publics français." description = "Interface d'exploration et d'analyse des marchés publics français."
version = "2.7.1" version = "2.7.2"
requires-python = ">= 3.10" requires-python = ">= 3.10"
authors = [{ name = "Colin Maudry", email = "colin@colmo.tech" }] authors = [{ name = "Colin Maudry", email = "colin@colmo.tech" }]
dependencies = [ dependencies = [
+6 -3
View File
@@ -1,4 +1,5 @@
import os import os
from shutil import rmtree
import dash_bootstrap_components as dbc import dash_bootstrap_components as dbc
import tomllib import tomllib
@@ -32,15 +33,17 @@ app: Dash = Dash(
meta_tags=META_TAGS, meta_tags=META_TAGS,
) )
rmtree(os.getenv("CACHE_DIR", "/tmp/decp-cache"))
cache.init_app( cache.init_app(
app.server, app.server,
config={ config={
"CACHE_TYPE": "FileSystemCache", "CACHE_TYPE": "FileSystemCache",
"CACHE_DIR": os.getenv("CACHE_DIR", "/tmp/decp-cache"), "CACHE_DIR": os.getenv("CACHE_DIR", "/tmp/decp-cache"),
"CACHE_DEFAULT_TIMEOUT": int( "CACHE_DEFAULT_TIMEOUT": int(
os.getenv("CACHE_DEFAULT_TIMEOUT", 3600 * 20) os.getenv("CACHE_DEFAULT_TIMEOUT", 3600 * 24)
), # 20h par défaut ), # 24h par défaut
"CACHE_THRESHOLD": 500, "CACHE_THRESHOLD": 300,
}, },
) )
+1 -1
View File
@@ -126,7 +126,7 @@ def _ensure_database() -> Path:
if should_rebuild(db_path, parquet_path): if should_rebuild(db_path, parquet_path):
build_database(db_path, parquet_path) build_database(db_path, parquet_path)
else: else:
logger.info("Base de données déjà disponible et à jour.") logger.debug("Base de données déjà disponible et à jour.")
return db_path return db_path
+2 -2
View File
@@ -657,15 +657,15 @@ def _normalize_filter_params(filter_params: dict) -> tuple:
) )
@cache.memoize(timeout=3600) @cache.memoize()
def _compute_dashboard_children(cache_key: tuple): def _compute_dashboard_children(cache_key: tuple):
logger.debug("Cache miss — computing dashboard")
filter_params = {k: (list(v) if isinstance(v, tuple) else v) for k, v in cache_key} filter_params = {k: (list(v) if isinstance(v, tuple) else v) for k, v in cache_key}
lff: pl.LazyFrame = query_marches().lazy() lff: pl.LazyFrame = query_marches().lazy()
lff = prepare_dashboard_data(lff=lff, **filter_params) lff = prepare_dashboard_data(lff=lff, **filter_params)
dff = lff.collect(engine="streaming") dff = lff.collect(engine="streaming")
logger.debug("Filter data: " + str(dff.height))
df_per_uid = ( df_per_uid = (
dff.select("uid", "montant").group_by("uid").agg(pl.col("montant").first()) dff.select("uid", "montant").group_by("uid").agg(pl.col("montant").first())
Generated
+1 -1
View File
@@ -760,7 +760,7 @@ wheels = [
[[package]] [[package]]
name = "decp-info" name = "decp-info"
version = "2.7.1" version = "2.7.2"
source = { virtual = "." } source = { virtual = "." }
dependencies = [ dependencies = [
{ name = "dash", extra = ["compress"] }, { name = "dash", extra = ["compress"] },