From 3f931313a6b069aeecd630a7b8eaf4c21aff7ecc Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Mon, 18 Aug 2025 12:24:08 +0200 Subject: [PATCH 1/3] Rajout du champ typeGroupementOperateurs --- src/pages/home.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/pages/home.py b/src/pages/home.py index 5da4209..8cbe0e4 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -29,8 +29,6 @@ lf = lf.drop( [ "titulaire_siren", "acheteur_siren", - "typeGroupementOperateurs", - "sourceOpenData", "donneesActuelles", ] ) From 6e37e59c4cc614f29d94841ea115b5f4e32272cd Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Mon, 18 Aug 2025 12:26:26 +0200 Subject: [PATCH 2/3] =?UTF-8?q?Gestion=20des=20filtres=20num=C3=A9riques?= =?UTF-8?q?=20<=20et=20>=20#17?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/home.py | 6 +++--- src/utils.py | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pages/home.py b/src/pages/home.py index 8cbe0e4..4edbf8d 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -99,13 +99,13 @@ layout = [ Vous pouvez appliquer un filtre pour chaque colonne en entrant du texte sous le nom de la colonne, puis en tapant sur `Entrée`. - Champs textuels : la recherche est insensible à la casse (majuscules/minuscules). - - Champs numériques : possibilité d'ajouter < ou > devant le chiffre recherché pour chercher des valeurs inférieures ou supérieur. + - Champs numériques : vous pouvez soit taper un nombre pour trouver les valeurs égales, soit le précéder de > ou < pour filtrer les valeurs supérieures ou inférieures. - Vous pouvez filtrer plusieurs colonnes à la fois. Vos filtres sont perdus quand vous rafraîchissez la page. + Vous pouvez filtrer plusieurs colonnes à la fois. Vos filtres sont remis à zéro quand vous rafraîchissez la page. **Télécharger le résultat** - Vous pouvez télécharger le résultat de vos filtres en cliquant sur Télécharger au format Excel. + Vous pouvez télécharger le résultat de vos filtres et tris, pour les colonnes affichées, en cliquant sur Télécharger au format Excel. Si vous téléchargez un volume important de données, il se peut que vous attendiez quelques minutes avant le début du téléchargement. """ diff --git a/src/utils.py b/src/utils.py index a235e4a..2aee276 100644 --- a/src/utils.py +++ b/src/utils.py @@ -12,6 +12,8 @@ load_dotenv() operators = [ ["s<", "<"], ["s>", ">"], + ["i<", "<"], + ["i>", ">"], ["icontains", "contains"], ] @@ -31,6 +33,7 @@ def split_filter_part(filter_part): name_part = name_part.strip() value = value_part.strip() name = name_part[name_part.find("{") + 1 : name_part.rfind("}")] + print("=>", name, operator_group[1], value) return name, operator_group[1], value @@ -105,8 +108,9 @@ def get_decp_data() -> pl.LazyFrame: df: pl.DataFrame = pl.read_parquet(os.getenv("DATA_FILE_PARQUET_PATH")) lff: pl.LazyFrame = df.lazy() + # Remplacement des valeurs numériques par des chaînes de caractères - lff = numbers_to_strings(lff) + # lff = numbers_to_strings(lff) # Tri des marchés par date de notification lff = lff.sort(by=["datePublicationDonnees"], descending=True, nulls_last=True) From 5a89f70d4ceb621f053045407c311b2086e7044b Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Mon, 18 Aug 2025 12:27:53 +0200 Subject: [PATCH 3/3] =?UTF-8?q?Am=C3=A9lioration=20de=20l'affichage=20et?= =?UTF-8?q?=20du=20t=C3=A9l=C3=A9chargement=20des=20champs=20source=20et?= =?UTF-8?q?=20sourceOpenData?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/home.py | 17 +++++++++++++++-- src/utils.py | 18 ++++++++++++++---- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/pages/home.py b/src/pages/home.py index 4edbf8d..c7b4095 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -7,6 +7,7 @@ from dotenv import load_dotenv from src.utils import ( add_annuaire_link, + add_resource_link, booleans_to_strings, format_number, lf, @@ -43,6 +44,9 @@ lf = lf.fill_null("") # Ajout des liens vers l'annuaire lf = add_annuaire_link(lf) +# Ajout des liens open data +lf = add_resource_link(lf) + schema = lf.collect_schema() @@ -220,11 +224,20 @@ def update_table(page_current, page_size, filter_query, sort_by, data_timestamp) State("table", "hidden_columns"), prevent_initial_call=True, ) -def download_data(n_clicks, hidden_columns): +def download_data(n_clicks, hidden_columns: list = None): df_to_download = df_filtered.clone() + print(df_to_download.columns) + + # Rétablissement des colonnes source et sourceOpenData (voir add_resource_link) + df_to_download = df_to_download.with_columns( + pl.col("source").str.extract(r'href="(.*?)"').alias("sourceOpenData"), + pl.col("source").str.extract(r'">(.*?)<').alias("source"), + ) + # Les colonnes masquées sont supprimées - df_to_download = df_to_download.drop(hidden_columns) + if hidden_columns: + df_to_download = df_to_download.drop(hidden_columns) def to_bytes(buffer): df_to_download.write_excel(buffer, worksheet="DECP") diff --git a/src/utils.py b/src/utils.py index 2aee276..ace70c8 100644 --- a/src/utils.py +++ b/src/utils.py @@ -40,8 +40,18 @@ def split_filter_part(filter_part): return [None] * 3 -def add_annuaire_link(dff: pl.LazyFrame): - dff = dff.with_columns( +def add_resource_link(lff: pl.LazyFrame) -> pl.LazyFrame: + lff = lff.with_columns( + ( + '' + pl.col("source") + "" + ).alias("source") + ) + lff = lff.drop("sourceOpenData") + return lff + + +def add_annuaire_link(lff: pl.LazyFrame): + lff = lff.with_columns( pl.when(pl.col("titulaire_typeIdentifiant") == "SIRET") .then( '" ).alias("acheteur_id") ) - return dff + return lff def booleans_to_strings(lff: pl.LazyFrame) -> pl.LazyFrame: