From 970fcc542aef86922467b2fdee8062166a5cb735 Mon Sep 17 00:00:00 2001 From: Michel Date: Sat, 26 Jul 2025 10:04:07 +0200 Subject: [PATCH] =?UTF-8?q?Remise=20en=20=C3=A9tat=20Technique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 2 + scripts/Interface.py | 4 +- scripts/Technique.py | 2 +- utils/db.py | 101 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 utils/db.py diff --git a/requirements.txt b/requirements.txt index de08a2a..a813c2a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,3 +10,5 @@ paramiko~=3.5.1 python-dotenv bcrypt ovh +fpdf==1.7.2 +altair diff --git a/scripts/Interface.py b/scripts/Interface.py index b4b6ebb..9b44e57 100644 --- a/scripts/Interface.py +++ b/scripts/Interface.py @@ -173,7 +173,7 @@ if not st.session_state.get("authenticated"): try: conn = mysql.connector.connect(**db_config) cursor = conn.cursor(dictionary=True) - cursor.execute("SELECT * FROM MotsDePasse WHERE utilisateur = %s", (login,)) + cursor.execute("SELECT * FROM Sondes.MotsDePasse WHERE utilisateur = %s", (login,)) result = cursor.fetchone() def verifier_password(mot_de_passe_saisi, hash_en_base): return bcrypt.checkpw(mot_de_passe_saisi.encode('utf-8'), hash_en_base.encode('utf-8')) @@ -181,7 +181,7 @@ if not st.session_state.get("authenticated"): if result["Expiration"] and result["Expiration"] < date.today(): st.sidebar.error("⛔ Votre accès a expiré. Veuillez contacter un administrateur.") cursor.close() - conn.close() + conn.close()sondes st.stop() st.session_state["authenticated"] = True st.session_state["role"] = result["role"] diff --git a/scripts/Technique.py b/scripts/Technique.py index 5331fe3..18db695 100644 --- a/scripts/Technique.py +++ b/scripts/Technique.py @@ -104,7 +104,7 @@ if sonde_selection: ) # Insérer une alerte dans Mysql en cas de sonde défectueuse - def inserer_alerte_defaut_sonde(sonde, date_defaut): + def inserer_alerte_defaut_sonde(sonde): conn = None cursor = None try: diff --git a/utils/db.py b/utils/db.py new file mode 100644 index 0000000..b3bc0e1 --- /dev/null +++ b/utils/db.py @@ -0,0 +1,101 @@ +# utils/db.py + +import mysql.connector +import os +import sys +import logging +from datetime import datetime + + +def connect_to_mysql(db_name: str = None): + """Connexion à MySQL via variables d'environnement.""" + try: + mydb = mysql.connector.connect( + host=os.getenv("DB_HOST"), + user=os.getenv("DB_USER"), + password=os.getenv("DB_PASSWORD"), + database=db_name if db_name else os.getenv("DB_NAME") + ) + return mydb + except mysql.connector.Error as err: + logging.error(f"Erreur de connexion MySQL : {err}") + sys.exit(1) + + +def get_latest_chaufferie(): + """Renvoie les dernières valeurs par sonde dans la table 'Chaufferie'.""" + db = connect_to_mysql() + cursor = db.cursor(dictionary=True) + query = """ + SELECT c1.* + FROM Chaufferie c1 + INNER JOIN ( + SELECT Sonde, MAX(Date) AS MaxDate + FROM Chaufferie + GROUP BY Sonde + ) c2 ON c1.Sonde = c2.Sonde AND c1.Date = c2.MaxDate + ORDER BY c1.Sonde; + """ + cursor.execute(query) + result = cursor.fetchall() + cursor.close() + db.close() + return result + + +def get_history_by_sonde(sonde: str, start: datetime, end: datetime): + """Retourne l’historique des températures d’une sonde entre deux dates.""" + db = connect_to_mysql() + cursor = db.cursor(dictionary=True) + query = """ + SELECT * FROM Chaufferie + WHERE Sonde = %s AND Date BETWEEN %s AND %s + ORDER BY Date; + """ + cursor.execute(query, (sonde, start, end)) + result = cursor.fetchall() + cursor.close() + db.close() + return result + + +def verifier_utilisateur_commun(utilisateur: str, motdepasse: str): + """Vérifie si un utilisateur (non superviseur) existe dans la table MotsDePasse.""" + db = connect_to_mysql() + cursor = db.cursor(dictionary=True) + query = """ + SELECT * FROM MotsDePasse + WHERE utilisateur = %s AND motdepasse = %s AND role = 'utilisateur' + """ + cursor.execute(query, (utilisateur, motdepasse)) + result = cursor.fetchone() + cursor.close() + db.close() + return result + + +def lire_alertes_sondes(): + """Renvoie la liste des alertes non acquittées dans la table Alertes_Chaufferie.""" + db = connect_to_mysql() + cursor = db.cursor(dictionary=True) + query = """ + SELECT * FROM Alertes_Chaufferie + WHERE Etat != 'Acquitté' + ORDER BY Debut_defaut DESC + """ + cursor.execute(query) + result = cursor.fetchall() + cursor.close() + db.close() + return result + + +def acquitter_alerte(id_alerte: int): + """Met à jour une alerte comme acquittée dans la base.""" + db = connect_to_mysql() + cursor = db.cursor() + query = "UPDATE Alertes_Chaufferie SET Etat = 'Acquitté' WHERE Id = %s" + cursor.execute(query, (id_alerte,)) + db.commit() + cursor.close() + db.close()