diff --git a/domo91.py b/domo91.py index 6dec4ee..4c7a1fc 100644 --- a/domo91.py +++ b/domo91.py @@ -28,6 +28,8 @@ db_config = { "password": os.getenv("DB_PASSWORD"), "database": os.getenv("DB_NAME") } +def get_connection(): + return mysql.connector.connect(**db_config) # --- Fonction de génération PDF --- def generer_pdf(site, date_str): @@ -137,7 +139,7 @@ if not st.session_state.get("authenticated"): st.success(f"Connecté comme {result['role']} ({result['Lieu']})") # Enregistrement de la connexion dans Connexion_Log try: - now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + now = datetime.datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") cursor.execute(""" INSERT INTO Connexion_Log (Utilisateur, Lieu, Date_Connexion) VALUES (%s, %s, %s) @@ -208,7 +210,7 @@ if st.session_state.get("authenticated") and st.session_state.get("role") == "su sonde_test = st.sidebar.selectbox("Choisir une sonde :", sondes_dispo) if st.sidebar.button("🔔 Forcer une alerte de test"): - now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + now = datetime.datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") try: conn = mysql.connector.connect(**db_config) cursor = conn.cursor() @@ -241,6 +243,28 @@ if st.session_state.get("authenticated") and st.session_state.get("role") == "su generer_pdf(site, date_val) else: st.info("Sélectionnez une date pour activer la génération PDF.") +# Récupération des sondes actives +def get_sondes_par_lieu(lieu): + conn = get_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute("SELECT Id, Sonde, En_entretien FROM Chambres_froides WHERE Lieu = %s", (lieu,)) + sondes = cursor.fetchall() + conn.close() + return sondes + +# Mise à jour statut entretien +def maj_entretien(sonde_id, statut, utilisateur): + conn = get_connection() + cursor = conn.cursor() + cursor.execute("UPDATE Chambres_froides SET En_entretien = %s WHERE Id = %s", (statut, sonde_id)) + # Insertion dans Connexion_log + action = "Mise en entretien" if statut else "Sortie d'entretien" + cursor.execute( + "INSERT INTO Connexion_Log (Utilisateur, Lieu, Date_Connexion, Action) VALUES (%s, %s, %s, %s)", + (utilisateur, lieu, datetime.datetime.now(), action) + ) + conn.commit() + conn.close() # --- CONTENU PRINCIPAL SI AUTHENTIFIÉ --- if st.session_state["authenticated"]: @@ -278,11 +302,17 @@ if st.session_state["authenticated"]: st.error(f"Erreur lors de la récupération des alertes : {e}") # --- NAVIGATION --- - if st.session_state["role"] == "superviseur": - onglet = st.sidebar.radio("📁 Navigation", ["Accueil", "Statistiques", "Traffic"]) + if st.session_state.get("authenticated"): + + # Navigation (onglets dynamiques selon rôle) + if st.session_state["role"] == "superviseur": + onglets_possibles = ["Accueil", "Statistiques", "Entretien", "Traffic"] + else: + onglets_possibles = ["Accueil", "Entretien"] + + onglet = st.sidebar.radio("📁 Navigation", onglets_possibles) + # --- ONGLET ACCUEIL --- - else: - onglet = "Accueil" if onglet == "Accueil": st.markdown("## Sélection du site et de la date") try: @@ -298,7 +328,11 @@ if st.session_state["authenticated"]: selected_date = st.date_input("📅 Date du relevé", value=date.today()) st.session_state["selected_date"] = selected_date + site_selectionne = st.session_state.get("lieu_autorise") or st.session_state.get("selected_site") + if not site_selectionne: + st.warning("Aucun site sélectionné.") + st.stop() cursor.execute( f"SELECT * FROM `{site_selectionne}` WHERE DATE(Date) = %s ORDER BY Sonde, Date DESC", (selected_date.strftime("%Y-%m-%d"),) @@ -362,6 +396,7 @@ if st.session_state["authenticated"]: except Exception as e: st.error(f"Erreur MySQL : {e}") + # ---- ONGLET STATISTIQUES --- elif onglet == "Statistiques": st.markdown("## 📈 Statistiques de température") @@ -407,32 +442,15 @@ if st.session_state["authenticated"]: except Exception as e: st.error(f"Erreur chargement statistiques : {e}") - # --- Affichage automatique des alertes non acquittées --- - site_selectionne = ( - st.session_state.get("lieu_autorise") - if st.session_state.get("role") != "superviseur" - else st.session_state.get("selected_site") - ) - try: - conn = mysql.connector.connect(**db_config) - cursor = conn.cursor(dictionary=True) - - table_alertes = f"Alertes_{site_selectionne}" - - cursor.close() - conn.close() - except Exception as e: - st.error(f"Erreur lors de la récupération des alertes : {e}") - # --- 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.sidebar.text_input("Nom de la nouvelle sonde :") - seuil_max = st.sidebar.number_input("Température maximale autorisée :", min_value=-50.0, - max_value=50.0, value=6.0, step=0.1) + nouvelle_sonde = st.text_input("Nom de la nouvelle sonde :") + seuil_max = st.number_input("Température maximale autorisée :", min_value=-50.0, max_value=50.0, + value=6.0, step=0.1) - if st.sidebar.button("➕ Ajouter la nouvelle sonde"): + if st.form_submit_button("➕ Ajouter la nouvelle sonde"): try: conn = mysql.connector.connect(**db_config) cursor = conn.cursor() @@ -460,7 +478,24 @@ if st.session_state["authenticated"]: except Exception as e: st.error(f"Erreur lors de l'ajout de la sonde : {e}") + # --- Affichage automatique des alertes non acquittées --- + site_selectionne = ( + st.session_state.get("lieu_autorise") + if st.session_state.get("role") != "superviseur" + else st.session_state.get("selected_site") + ) + try: + conn = mysql.connector.connect(**db_config) + cursor = conn.cursor(dictionary=True) + table_alertes = f"Alertes_{site_selectionne}" + + cursor.close() + conn.close() + except Exception as e: + st.error(f"Erreur lors de la récupération des alertes : {e}") + + if st.session_state["role"] == "superviseur": 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) @@ -511,6 +546,52 @@ if st.session_state["authenticated"]: except Exception as e: st.error(f"Erreur SQL (admin) : {e}") +# --- ONGLET ENTRETIEN --- + elif onglet == "Entretien": + st.markdown("## 🧰 Gestion des sondes en entretien") + role = st.session_state.get("role", "utilisateur") + lieu = st.session_state.get("lieu_autorise") if role != "superviseur" else st.selectbox("Choisir un lieu :", + ["Saclay", "Meudon"]) + if not lieu: + st.warning("Aucun site sélectionné.") + st.stop() + else: + st.info(f"Site imposé : {lieu}" if role != "superviseur" else "") + + + def get_sondes_par_lieu(lieu): + conn = mysql.connector.connect(**db_config) + cursor = conn.cursor(dictionary=True) + cursor.execute("SELECT Id, Sonde, En_entretien FROM Chambres_froides WHERE Lieu = %s", (lieu,)) + sondes = cursor.fetchall() + cursor.close() + conn.close() + return sondes + + + def maj_entretien(sonde_id, en_entretien, utilisateur, cible): + conn = mysql.connector.connect(**db_config) + cursor = conn.cursor() + cursor.execute("UPDATE Chambres_froides SET En_entretien = %s WHERE Id = %s", (en_entretien, sonde_id)) + cursor.execute( + "INSERT INTO Connexion_Log (Utilisateur, Lieu, Date_Connexion, Action, Cible) VALUES (%s, %s, %s, %s, %s)", + (utilisateur, lieu, datetime.datetime.now(), f"{'Mise' if en_entretien else 'Retrait'} en entretien", + cible)) + conn.commit() + cursor.close() + conn.close() + + + try: + sondes = get_sondes_par_lieu(lieu) + for sonde in sondes: + checked = st.checkbox(f"{sonde['Sonde']} (ID: {sonde['Id']})", value=sonde['En_entretien'], + key=f"entretien_{sonde['Id']}") + if checked != sonde['En_entretien']: + maj_entretien(sonde['Id'], checked, st.session_state.get("utilisateur", "Inconnu"), sonde['Sonde']) + st.success(f"{sonde['Sonde']} {'mise' if checked else 'retirée'} en entretien.") + except Exception as e: + st.error(f"Erreur lors du chargement des sondes : {e}") # --- ONGLET TRAFFIC ------ elif onglet == "Traffic": @@ -538,5 +619,4 @@ if st.session_state["authenticated"]: st.error(f"Erreur MySQL : {err}") except Exception as err: - st.error(f"Erreur MySQL : {err}") - + st.error(f"Erreur MySQL : {err}") \ No newline at end of file