From dbfc20921ace4501ed95eef1acf1ee107d269891 Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Wed, 18 Mar 2026 23:54:41 +0100 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20du=20layout=20dans=20titula?= =?UTF-8?q?ire=20et=20acheteur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/acheteur.py | 82 ++++++++++++++++++------------------ src/pages/observatoire.py | 2 +- src/pages/titulaire.py | 88 +++++++++++++++++++++------------------ 3 files changed, 91 insertions(+), 81 deletions(-) diff --git a/src/pages/acheteur.py b/src/pages/acheteur.py index 9be863c..1315e2e 100644 --- a/src/pages/acheteur.py +++ b/src/pages/acheteur.py @@ -117,44 +117,47 @@ layout = [ className="mb-2", children=[ dbc.Col( - html.Div( - className="org_infos", - children=[ - # TODO: ajouter le type d'acheteur : commune, CD, CR, etc. - html.P(["Commune : ", html.Strong(id="acheteur_commune")]), - html.P( - [ - "Département : ", - html.Strong(id="acheteur_departement"), - ] - ), - html.P(["Région : ", html.Strong(id="acheteur_region")]), - html.A( - id="acheteur_lien_annuaire", - children="Plus de détails sur l'Annuaire des entreprises", - ), - ], - ), + className="org_infos", + children=[ + # TODO: ajouter le type d'acheteur : commune, CD, CR, etc. + html.P( + [ + "Commune : ", + html.Strong(id="acheteur_commune"), + ] + ), + html.P( + [ + "Département : ", + html.Strong(id="acheteur_departement"), + ] + ), + html.P( + ["Région : ", html.Strong(id="acheteur_region")] + ), + html.A( + id="acheteur_lien_annuaire", + children="Plus de détails sur l'Annuaire des entreprises", + ), + ], width=4, ), dbc.Col( - html.Div( - children=[ - html.P(id="acheteur_titre_stats"), - html.P(id="acheteur_marches_attribues"), - html.P(id="acheteur_titulaires_differents"), - html.Button( - "Téléchargement au format Excel", - id="btn-download-data-acheteur", - className="btn btn-primary", - ), - dcc.Download(id="download-data-acheteur"), - ], - ), + children=[ + html.P(id="acheteur_titre_stats"), + html.P(id="acheteur_marches_attribues"), + html.P(id="acheteur_titulaires_differents"), + html.Button( + "Téléchargement au format Excel", + id="btn-download-data-acheteur", + className="btn btn-primary", + ), + dcc.Download(id="download-data-acheteur"), + ], width=4, ), dbc.Col( - html.Div(id="acheteur_map"), + id="acheteur_map", width=4, ), ], @@ -162,17 +165,13 @@ layout = [ dbc.Row( children=[ dbc.Col( - html.Div( - children=[ - html.H3("Top titulaires"), - html.Div(className="marches_table", id="top10_titulaires"), - ], - ), + className="marches_table", + id="top10_titulaires", width=8, ), + dbc.Col(id="acheteur-distance-histogram", width=4), ], ), - html.Div(id="acheteur-distance-histogram"), ], ), # récupérer les données de l'acheteur sur l'api annuaire @@ -373,7 +372,8 @@ def get_last_marches_data( Input(component_id="acheteur_data", component_property="data"), ) def get_top_titulaires(data): - return get_top_org_table(data, "titulaire", ["titulaire_distance", "montant"]) + table = get_top_org_table(data, "titulaire", ["titulaire_distance", "montant"]) + return make_card(fig=table, title="Top titulaires", lg=12, xl=12) @callback( @@ -522,4 +522,6 @@ def update_acheteur_distance_histogram(data): title="Distance acheteur–titulaire", subtitle="en nombre de marchés, échelle logarithmique", fig=fig, + lg=12, + xl=12, ) diff --git a/src/pages/observatoire.py b/src/pages/observatoire.py index 52ccbd4..f453871 100644 --- a/src/pages/observatoire.py +++ b/src/pages/observatoire.py @@ -138,7 +138,7 @@ layout = [ [ dcc.Markdown( """ -Les données saisies et publiées par les acheteurs comportent de nombreux montants farfelus qui sabotent les statistiques, au lieu de montants estimés avec rigueur. On parle de montant atteignant parfois les millions de milliards. Certains réutilisateurs mettent de côté ces marchés ou bien modifient les montants selon des règles fatalement arbitraires. J'ai fait le choix de ne quasiment pas modifier les données* afin de visibiliser le problème. +Les données saisies et publiées par les acheteurs comportent de nombreux montants farfelus qui sabotent les statistiques, au lieu de montants estimés avec rigueur. On parle de montants atteignant parfois les millions de milliards. Certains réutilisateurs des données mettent de côté ces marchés ou bien modifient les montants selon des règles fatalement arbitraires. J'ai fait le choix de ne quasiment pas modifier les données* afin de visibiliser le problème. Alors, on fait comment ? diff --git a/src/pages/titulaire.py b/src/pages/titulaire.py index 60b8977..158a298 100644 --- a/src/pages/titulaire.py +++ b/src/pages/titulaire.py @@ -19,7 +19,6 @@ from src.callbacks import get_top_org_table from src.figures import ( DataTable, get_distance_histogram, - make_card, make_column_picker, point_on_map, ) @@ -117,44 +116,50 @@ layout = [ className="mb-2", children=[ dbc.Col( - html.Div( - className="org_infos", - children=[ - # TODO: ajouter le type d'acheteur : commune, CD, CR, etc. - html.P(["Commune : ", html.Strong(id="titulaire_commune")]), - html.P( - [ - "Département : ", - html.Strong(id="titulaire_departement"), - ] - ), - html.P(["Région : ", html.Strong(id="titulaire_region")]), - html.A( - id="titulaire_lien_annuaire", - children="Plus de détails sur l'Annuaire des entreprises", - ), - ], - ), + className="org_infos", + children=[ + # TODO: ajouter le type d'acheteur : commune, CD, CR, etc. + html.P( + [ + "Commune : ", + html.Strong(id="titulaire_commune"), + ] + ), + html.P( + [ + "Département : ", + html.Strong(id="titulaire_departement"), + ] + ), + html.P( + [ + "Région : ", + html.Strong(id="titulaire_region"), + ] + ), + html.A( + id="titulaire_lien_annuaire", + children="Plus de détails sur l'Annuaire des entreprises", + ), + ], width=4, ), dbc.Col( - html.Div( - children=[ - html.P(id="titulaire_titre_stats"), - html.P(id="titulaire_marches_remportes"), - html.P(id="titulaire_acheteurs_differents"), - html.Button( - "Téléchargement au format Excel", - id="btn-download-data-titulaire", - className="btn btn-primary", - ), - dcc.Download(id="download-data-titulaire"), - ], - ), + children=[ + html.P(id="titulaire_titre_stats"), + html.P(id="titulaire_marches_remportes"), + html.P(id="titulaire_acheteurs_differents"), + html.Button( + "Téléchargement au format Excel", + id="btn-download-data-titulaire", + className="btn btn-primary", + ), + dcc.Download(id="download-data-titulaire"), + ], width=4, ), dbc.Col( - html.Div(id="titulaire_map"), + id="titulaire_map", width=4, ), ], @@ -165,14 +170,17 @@ layout = [ html.Div( children=[ html.H3("Top acheteurs"), - html.Div(className="marches_table", id="top10_acheteurs"), + html.Div( + className="marches_table", + id="top10_acheteurs", + ), ], ), width=8, ), + dbc.Col(id="titulaire-distance-histogram", width=4), ], ), - html.Div(id="titulaire-distance-histogram"), ], ), # récupérer les données de l'acheteur sur l'api annuaire @@ -536,8 +544,8 @@ def update_titulaire_distance_histogram(data): pl.col("titulaire_distance").cast(pl.Float64, strict=False) ) fig = get_distance_histogram(lff) - return make_card( - title="Distance acheteur–titulaire", - subtitle="en nombre de marchés, échelle logarithmique", - fig=fig, - ) + return [ + html.H3("Distance acheteur-titulaire"), + html.H6("par nombre de marchés", className="card-subtitle mb-2 text-muted"), + fig, + ]