From 24e0cee2b17b0029c5d7fe9257a514ad0a7fb188 Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Mon, 30 Mar 2026 14:58:18 +0200 Subject: [PATCH] =?UTF-8?q?Am=C3=A9liorations=20de=20typage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 58 +++++++++++++++++++------------------------ src/app.py | 2 +- src/pages/acheteur.py | 17 ++++++++----- src/utils.py | 55 ++++++++++++++++++++++++---------------- 4 files changed, 72 insertions(+), 60 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1056db5..41fc010 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,46 +3,40 @@ name = "decp.info" description = "Interface d'exploration et d'analyse des marchés publics français." version = "2.7.1" requires-python = ">= 3.10" -authors = [ - { name = "Colin Maudry", email = "colin@colmo.tech" } -] +authors = [{ name = "Colin Maudry", email = "colin@colmo.tech" }] dependencies = [ - "dash==3.4.0", - "dash[compress]", - "polars", - "gunicorn", - "dash-bootstrap-components", - "python-dotenv", - "xlsxwriter", - "plotly[express]", - "httpx", - "pandas", # utilisé pour la création de certains graphiques - "unidecode", - "dash-leaflet", - "dash-extensions" + "dash==3.4.0", + "dash[compress]", + "polars", + "gunicorn", + "dash-bootstrap-components", + "python-dotenv", + "xlsxwriter", + "plotly[express]", + "httpx", + "pandas", # utilisé pour la création de certains graphiques + "unidecode", + "dash-leaflet", + "dash-extensions", ] [project.optional-dependencies] dev = [ - "pytest", - "pytest-env", - "pre-commit", - "selenium", - "webdriver-manager", - "dash[testing]", - "fastexcel" + "pytest", + "pytest-env", + "pre-commit", + "selenium", + "webdriver-manager", + "dash[testing]", + "fastexcel", ] [tool.pytest.ini_options] -pythonpath = [ - "src" -] -testpaths = [ - "tests" -] +pythonpath = ["src"] +testpaths = ["tests"] env = [ - "DATA_FILE_PARQUET_PATH=tests/test.parquet", - "DEVELOPMENT=true", - "DATA_SCHEMA_PATH=/home/colin/git/decp-processing/dist/schema.json" + "DATA_FILE_PARQUET_PATH=tests/test.parquet", + "DEVELOPMENT=true", + "DATA_SCHEMA_PATH=/home/colin/git/decp-processing/dist/schema.json", ] addopts = "-p no:warnings" diff --git a/src/app.py b/src/app.py index 7a56058..e0456ad 100644 --- a/src/app.py +++ b/src/app.py @@ -13,7 +13,7 @@ load_dotenv() # os.environ["DATA_FILE_PARQUET_PATH"] -development = os.getenv("DEVELOPMENT").lower() == "true" +development = os.getenv("DEVELOPMENT", "").lower() == "true" meta_tags = [ {"name": "viewport", "content": "width=device-width, initial-scale=1"}, diff --git a/src/pages/acheteur.py b/src/pages/acheteur.py index 623af4c..7fd31aa 100644 --- a/src/pages/acheteur.py +++ b/src/pages/acheteur.py @@ -39,7 +39,7 @@ from src.utils import ( ) -def get_title(acheteur_id: str = None) -> str: +def get_title(acheteur_id: str | None = None) -> str: acheteur_nom = df_acheteurs.filter(pl.col("acheteur_id") == acheteur_id).select( "acheteur_nom" ) @@ -326,13 +326,13 @@ def update_acheteur_stats(data): Input(component_id="acheteur_url", component_property="pathname"), Input(component_id="acheteur_year", component_property="value"), ) -def get_acheteur_marches_data(url, acheteur_year: str) -> tuple: +def get_acheteur_marches_data(url, ach_year: str) -> tuple: acheteur_siret = url.split("/")[-1] lff = df.lazy() lff = lff.filter(pl.col("acheteur_id") == acheteur_siret) - if acheteur_year and acheteur_year != "Toutes les années": - acheteur_year = int(acheteur_year) - lff = lff.filter(pl.col("dateNotification").dt.year() == acheteur_year) + if ach_year and ach_year != "Toutes les années": + ach_year: int = int(ach_year) + lff = lff.filter(pl.col("dateNotification").dt.year() == ach_year) lff = lff.sort(["dateNotification", "uid"], descending=True, nulls_last=True) dff: pl.DataFrame = lff.collect(engine="streaming") download_disabled, download_text, download_title = get_button_properties(dff.height) @@ -412,7 +412,12 @@ def download_acheteur_data( prevent_initial_call=True, ) def download_filtered_acheteur_data( - data, n_clicks, acheteur_nom, filter_query, sort_by, hidden_columns: list = None + data, + n_clicks, + acheteur_nom, + filter_query, + sort_by, + hidden_columns: list | None = None, ): lff: pl.LazyFrame = pl.LazyFrame( data diff --git a/src/utils.py b/src/utils.py index 934ee56..204c1d1 100644 --- a/src/utils.py +++ b/src/utils.py @@ -699,21 +699,21 @@ def prepare_table_data( def prepare_dashboard_data( lff: pl.LazyFrame, - dashboard_year, - dashboard_acheteur_id, - dashboard_acheteur_categorie, - dashboard_acheteur_departement_code, - dashboard_titulaire_id, - dashboard_titulaire_categorie, - dashboard_titulaire_departement_code, - dashboard_marche_type, - dashboard_marche_objet, - dashboard_marche_code_cpv, - dashboard_marche_considerations_sociales, - dashboard_marche_considerations_environnementales, - dashboard_marche_techniques, - dashboard_marche_innovant, - dashboard_marche_sous_traitance_declaree, + dashboard_year=None, + dashboard_acheteur_id=None, + dashboard_acheteur_categorie=None, + dashboard_acheteur_departement_code=None, + dashboard_titulaire_id=None, + dashboard_titulaire_categorie=None, + dashboard_titulaire_departement_code=None, + dashboard_marche_type=None, + dashboard_marche_objet=None, + dashboard_marche_code_cpv=None, + dashboard_marche_considerations_sociales=None, + dashboard_marche_considerations_environnementales=None, + dashboard_marche_techniques=None, + dashboard_marche_innovant=None, + dashboard_marche_sous_traitance_declaree=None, dashboard_montant_min=None, dashboard_montant_max=None, ) -> pl.LazyFrame: @@ -728,20 +728,28 @@ def prepare_dashboard_data( lff = lff.filter(pl.col("acheteur_id").str.contains(dashboard_acheteur_id)) else: if dashboard_acheteur_categorie: - lff = lff.filter(pl.col("acheteur_categorie") == dashboard_acheteur_categorie) + lff = lff.filter( + pl.col("acheteur_categorie") == dashboard_acheteur_categorie + ) if dashboard_acheteur_departement_code: lff = lff.filter( - pl.col("acheteur_departement_code").is_in(dashboard_acheteur_departement_code) + pl.col("acheteur_departement_code").is_in( + dashboard_acheteur_departement_code + ) ) if dashboard_titulaire_id: lff = lff.filter(pl.col("titulaire_id").str.contains(dashboard_titulaire_id)) else: if dashboard_titulaire_categorie: - lff = lff.filter(pl.col("titulaire_categorie") == dashboard_titulaire_categorie) + lff = lff.filter( + pl.col("titulaire_categorie") == dashboard_titulaire_categorie + ) if dashboard_titulaire_departement_code: lff = lff.filter( - pl.col("titulaire_departement_code").is_in(dashboard_titulaire_departement_code) + pl.col("titulaire_departement_code").is_in( + dashboard_titulaire_departement_code + ) ) if dashboard_marche_type: @@ -756,8 +764,13 @@ def prepare_dashboard_data( if dashboard_marche_innovant and dashboard_marche_innovant != "all": lff = lff.filter(pl.col("marcheInnovant") == dashboard_marche_innovant) - if dashboard_marche_sous_traitance_declaree and dashboard_marche_sous_traitance_declaree != "all": - lff = lff.filter(pl.col("sousTraitanceDeclaree") == dashboard_marche_sous_traitance_declaree) + if ( + dashboard_marche_sous_traitance_declaree + and dashboard_marche_sous_traitance_declaree != "all" + ): + lff = lff.filter( + pl.col("sousTraitanceDeclaree") == dashboard_marche_sous_traitance_declaree + ) if dashboard_marche_techniques: lff = lff.filter(