diff --git a/pyproject.toml b/pyproject.toml index e154584..faf5c6e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,8 @@ dependencies = [ "gunicorn", "dash-bootstrap-components", "python-dotenv", - "xlsxwriter" + "xlsxwriter", + "plotly[express]", ] [project.optional-dependencies] diff --git a/src/app.py b/src/app.py index bbd5bf0..2e0873b 100644 --- a/src/app.py +++ b/src/app.py @@ -1,8 +1,17 @@ +import logging + import dash_bootstrap_components as dbc from dash import Dash, dcc, html, page_container, page_registry app = Dash(external_stylesheets=[dbc.themes.UNITED], title="decp.info", use_pages=True) +logger = logging.getLogger("decp.info") +logging.basicConfig( + format="%(asctime)s %(levelname)-8s %(message)s", + level=logging.INFO, + datefmt="%Y-%m-%d %H:%M:%S", +) + app.index_string = """ diff --git a/src/pages/home.py b/src/pages/home.py index 6e9faf2..adb3c36 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -1,45 +1,21 @@ -import logging -import os from datetime import datetime -from time import sleep import polars as pl from dash import Input, Output, State, callback, dash_table, dcc, html, register_page from dotenv import load_dotenv -from polars.exceptions import ComputeError from src.utils import ( add_annuaire_link, booleans_to_strings, + df, format_number, + logger, numbers_to_strings, split_filter_part, ) -logger = logging.getLogger("decp.info") -logging.basicConfig( - format="%(asctime)s %(levelname)-8s %(message)s", - level=logging.INFO, - datefmt="%Y-%m-%d %H:%M:%S", -) - load_dotenv() -# Chargement du fichier parquet -# Le fichier est chargé en mémoire, ce qui est plus rapide qu'une base de données pour le moment. -# On utilise polars pour la rapidité et la facilité de manipulation des données. - -try: - logger.info( - f"Lecture du fichier parquet ({os.getenv('DATA_FILE_PARQUET_PATH')})..." - ) - df: pl.DataFrame = pl.read_parquet(os.getenv("DATA_FILE_PARQUET_PATH")) -except ComputeError: - # Le fichier est probablement en cours de mise à jour - logger.info("Échec, nouvelle tentative dans 10s...") - sleep(seconds=10) - df: pl.DataFrame = pl.read_parquet(os.getenv("DATA_FILE_PARQUET_PATH")) - schema = df.schema df_filtered = pl.DataFrame() lf: pl.LazyFrame = df.lazy() diff --git a/src/utils.py b/src/utils.py index 2bf785a..58b189a 100644 --- a/src/utils.py +++ b/src/utils.py @@ -1,5 +1,13 @@ +import logging +import os +from time import sleep + import polars as pl import polars.selectors as cs +from dotenv import load_dotenv +from polars.exceptions import ComputeError + +load_dotenv() operators = [ ["s<", "<"], @@ -7,6 +15,13 @@ operators = [ ["icontains", "contains"], ] +logger = logging.getLogger("decp.info") +logging.basicConfig( + format="%(asctime)s %(levelname)-8s %(message)s", + level=logging.INFO, + datefmt="%Y-%m-%d %H:%M:%S", +) + def split_filter_part(filter_part): print("filter part", filter_part) @@ -69,3 +84,24 @@ def numbers_to_strings(lf: pl.LazyFrame) -> pl.LazyFrame: def format_number(number) -> str: number = "{:,}".format(number).replace(",", " ") return number + + +def get_decp_data() -> pl.DataFrame: + # Chargement du fichier parquet + # Le fichier est chargé en mémoire, ce qui est plus rapide qu'une base de données pour le moment. + # On utilise polars pour la rapidité et la facilité de manipulation des données. + + try: + logger.info( + f"Lecture du fichier parquet ({os.getenv('DATA_FILE_PARQUET_PATH')})..." + ) + ddf: pl.DataFrame = pl.read_parquet(os.getenv("DATA_FILE_PARQUET_PATH")) + except ComputeError: + # Le fichier est probablement en cours de mise à jour + logger.info("Échec, nouvelle tentative dans 10s...") + sleep(10) + ddf: pl.DataFrame = pl.read_parquet(os.getenv("DATA_FILE_PARQUET_PATH")) + return ddf + + +df = get_decp_data()