diff --git a/stats/index.py b/stats/index.py index c38589b..8608c9b 100644 --- a/stats/index.py +++ b/stats/index.py @@ -9,22 +9,24 @@ pio.templates.default = "none" app.layout = html.Div([ + dcc.Store(id='memory'), dcc.Location(id='url', refresh=False), - html.Div(id='page-content') + html.Div(id='page-content'), + html.Div(id='debug') ]) @app.callback(Output('page-content', 'children'), + # Output('debug', 'children'), Input('url', 'pathname')) def display_page(pathname): + if pathname.startswith('/siret/'): - return siret.layout + return [siret.layout] else: - return '404' + return ['Page inconnue...', pathname] if __name__ == '__main__': port = getenv('PORT', 8050) - - # Scalingo requires 0.0.0.0 as host, instead of the default 127.0.0.1 app.run_server(debug=True, host='0.0.0.0', port=int(port)) diff --git a/stats/views/siret.py b/stats/views/siret.py index ada8222..fc6944e 100644 --- a/stats/views/siret.py +++ b/stats/views/siret.py @@ -1,53 +1,83 @@ +import json from dash import html, dcc import dash_bootstrap_components as dbc import pandas as pd from dash.dependencies import Input, Output from app import app +import re SIRET = '20004525000012' -df_marches: pd.DataFrame = pd.read_csv( - 'https://decp.info/db/decp-sans-titulaires.csv?_sort=uid&acheteur.id__exact=20004525000012&_size=max&_dl=1', - true_values=['oui'], - false_values=['non']) -# df_marches = df_marches[df_marches['donneesActuelles'] == 'oui'] -df_marches['anneeNotification'] = df_marches['dateNotification'].str[:4] - - -df_attributions: pd.DataFrame = pd.read_csv( - f'https://decp.info/db/decp.csv?_sort=uid&acheteur.id__exact={SIRET}&_size=max&_dl=1', - true_values=['oui'], - false_values=['non']) -# df_attributions = df_attributions[df_attributions['donneesActuelles'] == 'oui'] -df_attributions['anneeNotification'] = df_attributions['dateNotification'].str[:4] - def fn(input_number) -> str: return '{:,.0f}'.format(input_number).replace(',', ' ') +def get_siret(pathname: str) -> str: + return pathname.split('/')[2] + + layout = html.Div(id='stats') +@app.callback(Output('memory', 'data'), + Input('url', 'pathname'), + Input('memory', 'data')) +def get_marches(pathname, data): + regex = re.compile('^/siret/[0-9a-z]{14}$') + if regex.match(pathname): + siret = get_siret(pathname) + + if type(data) == dict and data['siret']: + pass + + df_marches: pd.DataFrame = pd.read_csv( + f'https://decp.info/db/decp-sans-titulaires.csv?_sort=uid&acheteur.id__exact={siret}&_size=max&_dl=1', + true_values=['oui'], + false_values=['non']) + # df_marches = df_marches[df_marches['donneesActuelles'] == 'oui'] + df_marches['anneeNotification'] = df_marches['dateNotification'].str[:4] + + df_attributions: pd.DataFrame = pd.read_csv( + f'https://decp.info/db/decp.csv?_sort=uid&acheteur.id__exact={siret}&_size=max&_dl=1', + true_values=['oui'], + false_values=['non']) + # df_attributions = df_attributions[df_attributions['donneesActuelles'] == 'oui'] + df_attributions['anneeNotification'] = df_attributions['dateNotification'].str[:4] + + datasets = { + 'marches': df_marches.to_json(date_format='iso', orient='split'), + 'attributions': df_attributions.to_json(date_format='iso', orient='split'), + } + + return json.dumps(datasets) + + @app.callback(Output('stats', 'children'), - Input('url', 'pathname')) -def generateYears(pathname) -> [dbc.Row]: + Input('url', 'pathname'), + Input('memory', 'data')) +def generateYears(pathname, json_data) -> [dbc.Row]: siret = pathname.split('/')[2] print(siret) years = ['2022', '2021', '2020'] result = [dbc.Row([ - html.H2('Par année') - ])] + html.H2('Par année') + ])] + dataset = json.loads(json_data) + df_marches = pd.read_json(dataset['marches'], orient='split') for year in years: - df_marches_year = df_marches[df_marches['anneeNotification'] == year] - df_attributions_year = df_attributions[df_attributions['anneeNotification'] == year] + df_marches_year = df_marches[df_marches['anneeNotification'] == int(year)] + # df_attributions_year = df_attributions[df_attributions['anneeNotification'] == year] row = dbc.Row([ dbc.Col([ dbc.Row([ html.H3(year), - html.A('Télécharger les données', href=f'https://decp.info/db/decp?_sort=rowid&dateNotification__' - f'startswith={year}&acheteur.id__exact={siret}') - ]), + html.A('Télécharger les données', href=f'https://decp.info/db/decp.xlsx?' + f'_sort=rowid' + f'&dateNotification__startswith={year}' + f'&acheteur.id__exact={siret}' + f'&_size=max&_dl=1') + ]), dbc.Row([ dbc.Col([ html.H4('Marchés attribués'), @@ -55,9 +85,9 @@ def generateYears(pathname) -> [dbc.Row]: dbc.Col([ html.H4('Montant total attribué'), html.P(fn(df_marches_year['montant'].sum()) + ' euros')]), - dbc.Col([ - html.H4('Titulaires différents'), - html.P(str(df_attributions_year['titulaire.id'].unique().size))]) + # dbc.Col([ + # html.H4('Titulaires différents'), + # html.P(str(df_attributions_year['titulaire.id'].unique().size))]) ]) ]) ])