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"