From 187feee5449f340913a664ebf7eb0e8b499b38f6 Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Tue, 27 Jan 2026 17:48:34 +0100 Subject: [PATCH] Ajout d'une arborescence de departements #66 --- src/assets/style.css | 3 +- src/pages/a-propos.py | 8 +++++ src/pages/departement.py | 61 +++++++++++++++++++++++++++++++++++++++ src/pages/departements.py | 20 +++++++++++++ 4 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/pages/departement.py create mode 100644 src/pages/departements.py diff --git a/src/assets/style.css b/src/assets/style.css index a8d203d..ff06faa 100644 --- a/src/assets/style.css +++ b/src/assets/style.css @@ -254,7 +254,8 @@ summary > h3 { } } -/* CSS for the /a-propos page Layout and Table of Contents */ +/* CSS for the /a-propos page Layout and Table of Contents + Généré par Gemini 3.0 Pro */ .a-propos-container { display: flex; diff --git a/src/pages/a-propos.py b/src/pages/a-propos.py index 8ff9dab..04c6006 100644 --- a/src/pages/a-propos.py +++ b/src/pages/a-propos.py @@ -122,6 +122,14 @@ Rien d’exceptionnel, je respecte simplement la loi, qui dit que certains outil J’utilise pour cela [Matomo](https://matomo.org/), un outil [libre](https://matomo.org/free-software/), paramétré pour être en conformité avec [la recommandation « Cookies »](https://www.cnil.fr/fr/solutions-pour-les-cookies-de-mesure-daudience) de la CNIL. Cela signifie que votre adresse IP, par exemple, est anonymisée avant d’être enregistrée. Il m’est donc impossible d’associer vos visites sur ce site à votre personne.""" ), + html.H4( + "Liste des marchés par département", id="liste_marches" + ), + dcc.Markdown( + """ + - [Marchés par département](/departements) + """ + ), ], ), # Table of Contents Column diff --git a/src/pages/departement.py b/src/pages/departement.py new file mode 100644 index 0000000..7ac55b3 --- /dev/null +++ b/src/pages/departement.py @@ -0,0 +1,61 @@ +import polars as pl +from dash import Input, Output, callback, dcc, html, register_page + +from src.utils import departements, df_acheteurs_departement + +name = "Département" + + +def get_title(code): + return f"Marchés publics de {departements[code]['departement']} | decp.info" + + +def get_description(code): + return f"Marchés publics passés dans le département {departements[code]['departement']} | decp.info" + + +register_page( + __name__, + path_template="/departements/", + title=get_title, + description=get_description, + order=50, + name=name, +) + +layout = html.Div( + [ + dcc.Location(id="departement_url", refresh="callback-nav"), + html.Div(id="departement_marches"), + ] +) + + +@callback( + Output(component_id="departement_marches", component_property="children"), + Input(component_id="departement_url", component_property="pathname"), +) +def departement_marches(url): + departement = url.split("/")[-1] + acheteurs = [] + df = df_acheteurs_departement.filter( + pl.col("acheteur_departement_code") == departement + ) + for row in df.iter_rows(named=True): + p = html.P( + [ + dcc.Link( + row["acheteur_nom"], + href=url + f"/{row['acheteur_id']}", + title=f"Marchés publics de {row['acheteur_nom']}", + ), + " ", + dcc.Link( + "(page dédiée)", + href=f"/acheteurs/{row['acheteur_id']}", + title=f"Page dédiée aux marchés publics de {row['acheteur_nom']}", + ), + ] + ) + acheteurs.append(p) + return acheteurs diff --git a/src/pages/departements.py b/src/pages/departements.py new file mode 100644 index 0000000..9b122ca --- /dev/null +++ b/src/pages/departements.py @@ -0,0 +1,20 @@ +from dash import dcc, html, register_page + +from src.utils import departements + +name = "Départements" + +register_page( + __name__, + path="/departements", + title="Marchés par département | decp.info", + name="Départements", + description="Tous les marchés publics, classés par départements", +) + +layout = html.Div( + [ + html.P(dcc.Link(d["departement"], href=f"/departements/{k}")) + for k, d in departements.items() + ] +)