import streamlit as st import psycopg2 import sqlite3 from sqlite3 import Connection from datetime import datetime import logging from typing import List, Dict import pandas as pd # Configuration du logging logging.basicConfig(level=logging.INFO, handlers=[logging.StreamHandler()]) logger = logging.getLogger(__name__) # Fonction pour obtenir la connexion à la base de données # def get_db_connection(): # try: # conn = psycopg2.connect( # host=st.secrets["DB_HOST"], # port=st.secrets["DB_PORT"], # dbname=st.secrets["DB_NAME"], # user=st.secrets["DB_USER"], # password=st.secrets["DB_PASSWORD"] # ) # return conn # except Exception as e: # logger.error(f"Erreur de connexion à la base de données: {e}") # return None def get_db_connection() -> Connection: """ Établit une connexion avec la base SQLite. Returns: Connection : le client de connexion à la base. """ try: conn = sqlite3.connect( st.secrets["DB_NAME"], check_same_thread=False ) # Spécifiez ici le chemin de votre fichier SQLite conn.row_factory = sqlite3.Row # Pour des résultats sous forme de dictionnaire return conn except sqlite3.Error as e: logger.error(f"Erreur de connexion à la base de données SQLite: {e}") return None # Connexion à la base de données pour récupérer le nombre total de recettes # def get_recipes_count(): # conn = get_db_connection() # if conn is None: # return 0 # try: # cursor = conn.cursor() # cursor.execute("SELECT COUNT(*) FROM suggestions_repas") # result = cursor.fetchone() # return result[0] # Le nombre total de recettes # except Exception as e: # logger.error(f"Erreur lors de la récupération du nombre de recettes : {e}") # return 0 # finally: # cursor.close() # conn.close() def get_recipes_count() -> int: """ Récupère le nombre total de recettes enregistrées dans la table `suggestions_repas` de la base de données SQLite. Cette fonction se connecte à la base de données SQLite, exécute une requête pour compter le nombre d'entrées dans la table `suggestions_repas`, puis retourne ce nombre. Returns: int: Le nombre total de recettes dans la table `suggestions_repas`. Retourne 0 en cas d'erreur ou si la connexion échoue. """ # Connexion à la base de données SQLite conn = get_db_connection() # Si la connexion échoue, on retourne 0 if conn is None: return 0 try: # Création du curseur pour exécuter la requête cursor = conn.cursor() # Exécution de la requête SQL pour compter les entrées de recettes dans la table 'suggestions_repas' cursor.execute("SELECT COUNT(*) FROM suggestions_repas") # Récupération du résultat de la requête result = cursor.fetchone() # Retour du nombre total de recettes return result[0] # Le nombre total de recettes except sqlite3.Error as e: # En cas d'erreur, on enregistre l'erreur dans les logs et on retourne 0 logger.error(f"Erreur lors de la récupération du nombre de recettes : {e}") return 0 finally: # Fermeture du curseur et de la connexion cursor.close() conn.close() # Fonction pour récupérer la latence moyenne des messages # def get_average_latency(): # conn = get_db_connection() # if conn is None: # return 0.0 # try: # cursor = conn.cursor() # cursor.execute("SELECT AVG(temps_traitement) FROM messages WHERE temps_traitement IS NOT NULL") # result = cursor.fetchone() # return round(result[0], 2) if result[0] is not None else 0.0 # except Exception as e: # logger.error(f"Erreur de connexion à la base de données pour la latence : {e}") # return 0.0 # finally: # cursor.close() # conn.close() def get_average_latency() -> float: """ Récupère la latence moyenne des traitements enregistrés dans la table `messages` de la base de données SQLite. Cette fonction se connecte à la base de données SQLite, exécute une requête pour calculer la moyenne des valeurs dans la colonne `temps_traitement` de la table `messages`, et retourne cette moyenne avec une précision de deux décimales. Returns: float: La latence moyenne des traitements en secondes. Retourne 0.0 en cas d'erreur ou si aucune donnée valide n'est disponible. """ # Connexion à la base de données SQLite conn = get_db_connection() # Si la connexion échoue, on retourne 0.0 if conn is None: return 0.0 try: # Création du curseur pour exécuter la requête cursor = conn.cursor() # Exécution de la requête SQL pour calculer la moyenne de la colonne 'temps_traitement' cursor.execute( "SELECT AVG(temps_traitement) FROM messages WHERE temps_traitement IS NOT NULL" ) # Récupération du résultat de la requête result = cursor.fetchone() # Retour de la moyenne arrondie à 2 décimales, ou 0.0 si aucun résultat return round(result[0], 2) if result[0] is not None else 0.0 except sqlite3.Error as e: # En cas d'erreur, on enregistre l'erreur dans les logs et on retourne 0.0 logger.error(f"Erreur de connexion à la base de données pour la latence : {e}") return 0.0 finally: # Fermeture du curseur et de la connexion cursor.close() conn.close() # Fonction pour récupérer le nombre de requêtes par jour # def get_daily_requests(): # conn = get_db_connection() # if conn is None: # return pd.DataFrame() # try: # query = """ # SELECT # DATE(timestamp) AS date, # COUNT(*) AS nombre_requetes # FROM # messages # GROUP BY # date # ORDER BY # date; # """ # df = pd.read_sql(query, conn) # return df # except Exception as e: # logger.error(f"Erreur lors de la récupération des requêtes par jour : {e}") # return pd.DataFrame() # finally: # conn.close() def get_daily_requests() -> pd.DataFrame: """ Récupère les requêtes quotidiennes à partir de la table `messages` de la base de données SQLite. Cette fonction se connecte à la base de données SQLite, exécute une requête SQL pour compter le nombre de requêtes (messages) par jour, et retourne les résultats sous forme de DataFrame pandas. Returns: pd.DataFrame: Un DataFrame contenant les dates et le nombre de requêtes pour chaque jour. Retourne un DataFrame vide en cas d'erreur. """ # Connexion à la base de données SQLite conn = get_db_connection() # Si la connexion échoue, retourner un DataFrame vide if conn is None: return pd.DataFrame() try: # Requête SQL pour récupérer le nombre de requêtes par jour query = """ SELECT DATE(timestamp) AS date, COUNT(*) AS nombre_requetes FROM messages GROUP BY date ORDER BY date; """ # Exécution de la requête et récupération du résultat sous forme de DataFrame df = pd.read_sql(query, conn) # Retour du DataFrame contenant les résultats return df except sqlite3.Error as e: # En cas d'erreur, on enregistre l'erreur dans les logs et on retourne un DataFrame vide logger.error(f"Erreur lors de la récupération des requêtes par jour : {e}") return pd.DataFrame() finally: # Fermeture de la connexion à la base de données conn.close() # Fonction pour récupérer les ingrédients depuis la base de données # def get_ingredients(): # conn = get_db_connection() # cursor = conn.cursor() # try: # cursor.execute("SELECT ingredients FROM liste_courses") # ingredients_list = cursor.fetchall() # Récupère tous les résultats # return ingredients_list # except Exception as e: # logger.error(f"Erreur lors de la récupération des requêtes par jour : {e}") # return pd.DataFrame() # finally: # # Fermer la connexion # cursor.close() # conn.close() def get_ingredients() -> list: """ Récupère la liste des ingrédients stockée dans la table `liste_courses` de la base de données SQLite. Cette fonction se connecte à la base de données SQLite, exécute une requête SQL pour récupérer la colonne `ingredients` de la table `liste_courses`, et retourne les résultats sous forme de liste. Returns: list: Une liste contenant les ingrédients récupérés de la base de données. Retourne une liste vide en cas d'erreur. """ # Connexion à la base de données SQLite conn = get_db_connection() # Si la connexion échoue, retourner une liste vide if conn is None: return [] cursor = conn.cursor() try: # Requête SQL pour récupérer la colonne 'ingredients' de la table 'liste_courses' cursor.execute("SELECT ingredients FROM liste_courses") # Récupère tous les résultats de la requête ingredients_list = cursor.fetchall() # Retourne la liste des ingrédients (sous forme de liste de tuples) return [ingredient[0] for ingredient in ingredients_list] except sqlite3.Error as e: # En cas d'erreur, on enregistre l'erreur dans les logs et on retourne une liste vide logger.error(f"Erreur lors de la récupération des ingrédients : {e}") return [] finally: # Fermeture du curseur et de la connexion à la base de données cursor.close() conn.close() # Fonction pour récupérer le coût total des requêtes # def get_total_cost(): # conn = get_db_connection() # if conn is None: # return 0.0 # try: # cursor = conn.cursor() # cursor.execute("SELECT SUM(total_cout) FROM messages WHERE total_cout IS NOT NULL") # result = cursor.fetchone() # return round(result[0], 2) if result[0] is not None else 0.0 # except Exception as e: # logger.error(f"Erreur lors de la récupération du coût total : {e}") # return 0.0 # finally: # cursor.close() # conn.close() def get_total_cost() -> float: """ Récupère le coût total des messages dans la table `messages` de la base de données SQLite. Cette fonction se connecte à la base de données SQLite, exécute une requête SQL pour récupérer la somme des valeurs présentes dans la colonne `total_cout` de la table `messages`, et retourne le total arrondi à 2 décimales. Returns: float: Le coût total des messages. Retourne 0.0 si aucune donnée n'est disponible ou en cas d'erreur. """ # Connexion à la base de données SQLite conn = get_db_connection() # Si la connexion échoue, retourner 0.0 if conn is None: return 0.0 cursor = conn.cursor() try: # Requête SQL pour récupérer la somme de la colonne 'total_cout' de la table 'messages' cursor.execute( "SELECT SUM(total_cout) FROM messages WHERE total_cout IS NOT NULL" ) # Récupère le résultat de la requête result = cursor.fetchone() # Retourne la somme arrondie à 2 décimales si un résultat est trouvé, sinon retourne 0.0 return round(result[0], 2) if result[0] is not None else 0.0 except sqlite3.Error as e: # En cas d'erreur, on log l'erreur et on retourne 0.0 logger.error(f"Erreur lors de la récupération du coût total : {e}") return 0.0 finally: # Fermeture du curseur et de la connexion à la base de données cursor.close() conn.close() # Fonction pour récupérer l'impact écologique estimé # def get_total_impact(): # conn = get_db_connection() # if conn is None: # return 0.0 # try: # cursor = conn.cursor() # cursor.execute("SELECT SUM(impact_eco) FROM messages WHERE impact_eco IS NOT NULL") # result = cursor.fetchone() # return round(result[0], 2) if result[0] is not None else 0.0 # except Exception as e: # logger.error(f"Erreur lors de la récupération de l'impact écologique : {e}") # return 0.0 # finally: # cursor.close() # conn.close() def get_total_impact() -> float: """ Récupère l'impact écologique total des messages dans la table `messages` de la base de données SQLite. Cette fonction se connecte à la base de données SQLite, exécute une requête SQL pour récupérer la somme des valeurs présentes dans la colonne `impact_eco` de la table `messages`, et retourne le total arrondi à 2 décimales. Returns: float: L'impact écologique total des messages. Retourne 0.0 si aucune donnée n'est disponible ou en cas d'erreur. """ # Connexion à la base de données SQLite conn = get_db_connection() # Si la connexion échoue, retourner 0.0 if conn is None: return 0.0 cursor = conn.cursor() try: # Requête SQL pour récupérer la somme de la colonne 'impact_eco' de la table 'messages' cursor.execute( "SELECT SUM(impact_eco) FROM messages WHERE impact_eco IS NOT NULL" ) # Récupère le résultat de la requête result = cursor.fetchone() # Retourne la somme arrondie à 2 décimales si un résultat est trouvé, sinon retourne 0.0 return round(result[0], 2) if result[0] is not None else 0.0 except sqlite3.Error as e: # En cas d'erreur, on log l'erreur et on retourne 0.0 logger.error(f"Erreur lors de la récupération de l'impact écologique : {e}") return 0.0 finally: # Fermeture du curseur et de la connexion à la base de données cursor.close() conn.close()