Merge branch 'feature/17_filtres_num' into dev

This commit is contained in:
Colin Maudry
2025-08-18 12:28:13 +02:00
2 changed files with 37 additions and 12 deletions
+18 -7
View File
@@ -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,
@@ -29,8 +30,6 @@ lf = lf.drop(
[
"titulaire_siren",
"acheteur_siren",
"typeGroupementOperateurs",
"sourceOpenData",
"donneesActuelles",
]
)
@@ -45,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()
@@ -101,13 +103,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.
"""
@@ -222,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")
+19 -5
View File
@@ -12,6 +12,8 @@ load_dotenv()
operators = [
["s<", "<"],
["s>", ">"],
["i<", "<"],
["i>", ">"],
["icontains", "contains"],
]
@@ -31,14 +33,25 @@ 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
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(
(
'<a href="' + pl.col("sourceOpenData") + '">' + pl.col("source") + "</a>"
).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(
'<a href = "https://annuaire-entreprises.data.gouv.fr/etablissement/'
@@ -50,7 +63,7 @@ def add_annuaire_link(dff: pl.LazyFrame):
.otherwise(pl.col("titulaire_id"))
.alias("titulaire_id")
)
dff = dff.with_columns(
lff = lff.with_columns(
(
'<a href = "https://annuaire-entreprises.data.gouv.fr/etablissement/'
+ pl.col("acheteur_id")
@@ -59,7 +72,7 @@ def add_annuaire_link(dff: pl.LazyFrame):
+ "</a>"
).alias("acheteur_id")
)
return dff
return lff
def booleans_to_strings(lff: pl.LazyFrame) -> pl.LazyFrame:
@@ -105,8 +118,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)