From c3ed5e40ad4a543199218131e0b8a48709ee96ce Mon Sep 17 00:00:00 2001 From: Michel Date: Thu, 24 Apr 2025 16:05:16 +0200 Subject: [PATCH] =?UTF-8?q?24/04/25=F0=9F=94=84=20Mise=20=C3=A0=20jour=20d?= =?UTF-8?q?es=20fichiers=20modifi=C3=A9s=20depuis=20develop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domo91.py | 160 +++++++++++++++++++++++++++--------------------------- 1 file changed, 81 insertions(+), 79 deletions(-) diff --git a/domo91.py b/domo91.py index f243e91..3ec8497 100644 --- a/domo91.py +++ b/domo91.py @@ -1,5 +1,7 @@ # Application Gestion de sondes # -*- coding: utf-8 -*- +from logging import exception + import streamlit as st import mysql.connector import pandas as pd @@ -23,13 +25,14 @@ if "authenticated" not in st.session_state: st.title("📡 Supervision Températures") -db_config ={ +db_config = { "host": os.getenv("DB_HOST"), "user": os.getenv("DB_USER"), "password": os.getenv("DB_PASSWORD"), "database": os.getenv("DB_NAME") } + # --- Fonction de génération PDF --- def generer_pdf(site, date_str): st.info(f"Génération du rapport PDF pour {site} à la date {date_str}") @@ -237,7 +240,11 @@ if st.session_state["authenticated"]: try: conn = mysql.connector.connect(**db_config) cursor = conn.cursor(dictionary=True) + if "role" not in st.session_state: + st.session_state["role"] = None + if "lieu_autorise" not in st.session_state: + st.session_state["lieu_autorise"] = None site_selectionne = ( st.session_state["lieu_autorise"] if st.session_state["role"] != "superviseur" @@ -315,8 +322,8 @@ if st.session_state["authenticated"]: seuil_temp = seuil["Temp_Max"] if seuil else 10 st.subheader("📊 Tableau des relevés") - df_filtré = df_sonde.copy() - df_filtré = df_filtré.drop(columns="Id", errors="ignore") + df_filtre = df_sonde.copy() + df_filtre = df_filtre.drop(columns="Id", errors="ignore") def surlignage_temp(val): @@ -328,12 +335,12 @@ if st.session_state["authenticated"]: return "" - styled_df = df_filtré.style.applymap(surlignage_temp, subset=["Temperature"]) + styled_df = df_filtre.style.applymap(surlignage_temp, subset=["Temperature"]) st.dataframe(styled_df, use_container_width=True) st.subheader("📈 Évolution de la température") fig, ax = plt.subplots(figsize=(10, 4)) - ax.plot(df_filtré["Date"], df_filtré["Temperature"], marker='o', label="Température") + ax.plot(df_filtre["Date"], df_filtre["Temperature"], marker='o', label="Température") ax.axhline(seuil_temp, color='red', linestyle='--', label=f"Seuil {seuil_temp}°C") ax.set_xlabel("Heure") ax.set_ylabel("Température (°C)") @@ -404,85 +411,80 @@ if st.session_state["authenticated"]: except Exception as e: st.error(f"Erreur lors de la récupération des alertes : {e}") - except Exception as err: - st.error(f"Erreur MySQL : {e}") -if st.session_state["role"] == "superviseur": - with st.expander("+ Ajouter une nouvelle chambre froide", expanded=False): - with st.form("ajout_sonde"): - nouvelle_sonde = st.text_input("Nom de la sonde") - temp_max = st.number_input("Température maximale autorisée (°C)", value=4) - etat_on = st.checkbox("État actif (ON)", value=True) + # --- Fonctionnalités administrateur : ajout et gestion des chambres froides --- + if st.session_state["role"] == "superviseur": + with st.expander("+ Ajouter une nouvelle chambre froide", expanded=False): + with st.form("ajout_sonde"): + nouvelle_sonde = st.text_input("Nom de la sonde") + temp_max = st.number_input("Température maximale autorisée (°C)", value=4) + etat_on = st.checkbox("État actif (ON)", value=True) + + submitted = st.form_submit_button("✅ Ajouter") + if submitted: + try: + conn_add = mysql.connector.connect(**db_config) + cursor_add = conn_add.cursor() + cursor_add.execute( + "INSERT INTO Chambres_froides (Lieu, Sonde, Temp_Max, Status) VALUES (%s, %s, %s, %s)", + (site, nouvelle_sonde, temp_max, "ON" if etat_on else "OFF") + ) + conn_add.commit() + cursor_add.close() + conn_add.close() + st.success(f"Sonde '{nouvelle_sonde}' ajoutée avec succès au site {site} 🎉") + st.session_state["refresh_admin"] = random.randint(1000, 9999) + except Exception as e: + st.error(f"Erreur lors de l'ajout : {e}") + + with st.expander("🛠️ Gestion des chambres froides (administrateur)", expanded=True): + if st.button("🔄 Actualiser la liste"): + st.session_state["refresh_admin"] = random.randint(0, 9999) - submitted = st.form_submit_button("✅ Ajouter") - if submitted: try: - conn_add = mysql.connector.connect(**db_config) - cursor_add = conn_add.cursor() + conn_admin = mysql.connector.connect(**db_config) + cursor_admin = conn_admin.cursor(dictionary=True) + cursor_admin.execute("SELECT * FROM Chambres_froides WHERE Lieu = %s", (site,)) + chambres = cursor_admin.fetchall() - cursor_add.execute( - "INSERT INTO Chambres_froides (Lieu, Sonde, Temp_Max, Status) VALUES (%s, %s, %s, %s)", - (site_selectionne, nouvelle_sonde, temp_max, "ON" if etat_on else "OFF") - ) - conn_add.commit() - cursor_add.close() - conn_add.close() + if not chambres: + st.warning("Aucune chambre froide pour ce site.") + else: + for chambre in chambres: + col1, col2, col3 = st.columns([3, 1, 2]) + with col1: + st.markdown(f"**{chambre['Sonde']}**") - st.success(f"Sonde '{nouvelle_sonde}' ajoutée avec succès au site {site_selectionne} 🎉") + with col2: + etat = st.checkbox("ON", value=(chambre["Etat"] == "ON"), + key=f"etat_{chambre['Id']}_{st.session_state.get('refresh_admin', 0)}") + new_etat = "ON" if etat else "OFF" - # Refresh immédiat - st.session_state["refresh_admin"] = random.randint(1000, 9999) + with col3: + temp_max = chambre["Temp_Max"] + moins, val, plus = st.columns([1, 2, 1]) + with moins: + if st.button("▼", key=f"moins_{chambre['Id']}"): + temp_max -= 1 + with val: + st.markdown(f"
{temp_max}°C
", + unsafe_allow_html=True) + with plus: + if st.button("▲", key=f"plus_{chambre['Id']}"): + temp_max += 1 + + if new_etat != chambre["Etat"] or temp_max != chambre["Temp_Max"]: + cursor_admin.execute( + "UPDATE Chambres_froides SET Etat = %s, Temp_Max = %s WHERE Id = %s", + (new_etat, temp_max, chambre["Id"]) + ) + conn_admin.commit() + st.success(f"{chambre['Sonde']} mise à jour") + + cursor_admin.close() + conn_admin.close() except Exception as e: - st.error(f"Erreur lors de l'ajout : {e}") - with st.expander("🛠️ Gestion des chambres froides (administrateur)", expanded=True): + st.error(f"Erreur SQL (admin) : {e}") - # Bouton d'actualisation - if st.button("🔄 Actualiser la liste"): - st.session_state["refresh_admin"] = random.randint(0, 9999) # Force le rerun - - try: - conn_admin = mysql.connector.connect(**db_config) - cursor_admin = conn_admin.cursor(dictionary=True) - - cursor_admin.execute("SELECT * FROM Chambres_froides WHERE Lieu = %s", (site_selectionne,)) - chambres = cursor_admin.fetchall() - - if not chambres: - st.warning("Aucune chambre froide pour ce site.") - else: - for chambre in chambres: - col1, col2, col3 = st.columns([3, 1, 2]) - with col1: - st.markdown(f"**{chambre['Sonde']}**") - - with col2: - etat = st.checkbox("ON", value=(chambre["Etat"] == "ON"), - key=f"etat_{chambre['Id']}_{st.session_state.get('refresh_admin', 0)}") - new_etat = "ON" if etat else "OFF" - - with col3: - temp_max = chambre["Temp_Max"] - moins, val, plus = st.columns([1, 2, 1]) - with moins: - if st.button("▼", key=f"moins_{chambre['Id']}"): - temp_max -= 1 - with val: - st.markdown(f"
{temp_max}°C
", - unsafe_allow_html=True) - with plus: - if st.button("▲", key=f"plus_{chambre['Id']}"): - temp_max += 1 - - if new_etat != chambre["Etat"] or temp_max != chambre["Temp_Max"]: - cursor_admin.execute( - "UPDATE Chambres_froides SET Etat = %s, Temp_Max = %s WHERE Id = %s", - (new_etat, temp_max, chambre["Id"]) - ) - conn_admin.commit() - st.success(f"{chambre['Sonde']} mise à jour") - - cursor_admin.close() - conn_admin.close() - - except Exception as e: - st.error(f"Erreur SQL (admin) : {e}") + except exception as err: + st.error(f"Erreur MySQL : {err}")