diff --git a/alerte_sms.py b/alerte_sms.py index 35c11bc..1ff136d 100644 --- a/alerte_sms.py +++ b/alerte_sms.py @@ -26,7 +26,7 @@ def journaliser_sms(message, site, phone_number): def envoyer_sms_ovh(message, site): phone_numbers = PHONE_NUMBERS_BY_SITE.get(site) - if not phone_numbers: + if not phone_numbers or phone_numbers == ['']: print(f"[!] Aucun numéro défini pour le site {site}. SMS non envoyé.") return None diff --git a/domo91.py b/domo91.py index a20c7f2..9b08b77 100644 --- a/domo91.py +++ b/domo91.py @@ -78,7 +78,7 @@ def generer_pdf(site, date_str, periode): self.cell(0, 10, "Rapport de surveillance des sondes", ln=1, align="C") self.set_font("Arial", "", 12) self.cell(0, 10, f"Date : {date_str}", ln=1, align="C") - self.cell(0, 10, f"Période : {getattr(self, 'periode', '')}", ln=1, align="C") + self.cell(0, 10, f"Periode : {getattr(self, 'periode', '')}", ln=1, align="C") self.ln(5) def site_info(self, site_name): @@ -175,6 +175,11 @@ if not st.session_state.get("authenticated"): cursor.execute("SELECT * FROM MotsDePasse WHERE utilisateur = %s", (login,)) result = cursor.fetchone() if result and result["mot_de_passe"] == password: + if result["Expiration"] and result["Expiration"] < date.today(): + st.sidebar.error("⛔ Votre accès a expiré. Veuillez contacter un administrateur.") + cursor.close() + conn.close() + st.stop() st.session_state["authenticated"] = True st.session_state["role"] = result["role"] st.session_state["lieu_autorise"] = result["Lieu"] @@ -216,7 +221,7 @@ if site_pdf and date_pdf: st.sidebar.subheader("📄 Rapport PDF") if st.sidebar.button("📥 Télécharger l’état du jour (PDF)", key="pdf_btn"): periode = st.session_state.get("selected_periode", "Toute la journée") - generer_pdf(site_pdf, date_pdf.strftime("%Y-%m-%d"), periode) + generer_pdf(site_pdf, date, periode) # --- Forcer une alerte de test dynamique (réservé aux superviseurs) if st.session_state.get("authenticated") and st.session_state.get("role") == "superviseur": @@ -283,7 +288,7 @@ if st.session_state.get("authenticated") and st.session_state.get("role") == "su if st.button("📅 Télécharger l'état du jour (PDF)"): site = st.session_state["lieu_autorise"] date_val = st.session_state["selected_date"].strftime("%Y-%m-%d") - generer_pdf(site, date_val) + generer_pdf(site, date_val, periode) else: st.info("Sélectionnez une date pour activer la génération PDF.") # Récupération des sondes actives @@ -344,16 +349,18 @@ if st.session_state["authenticated"]: except Exception as e: st.error(f"Erreur lors de la récupération des alertes : {e}") - # --- NAVIGATION --- - if st.session_state.get("authenticated"): + # --- NAVIGATION --- (toujours défini, évite les erreurs) + onglet = st.session_state.get("onglet_actif", "Accueil") - # Navigation (onglets dynamiques selon rôle) + if st.session_state.get("authenticated"): 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 = st.sidebar.radio("📁 Navigation", onglets_possibles, index=onglets_possibles.index(onglet)) + st.session_state["onglet_actif"] = onglet # --- ONGLET ACCUEIL --- if onglet == "Accueil": @@ -592,6 +599,47 @@ if st.session_state["authenticated"]: # --- ONGLET ENTRETIEN --- elif onglet == "Entretien": st.markdown("## 🧰 Gestion des sondes en entretien") + + # --- Gérer les expirations comptes --- + def afficher_gestion_expiration(conn): + st.subheader("🔐 Gestion des expirations d'accès") + + # Récupérer les utilisateurs avec leurs dates d'expiration + cursor = conn.cursor(dictionary=True) + cursor.execute("SELECT Id, utilisateur, Expiration FROM MotsDePasse") + users = cursor.fetchall() + cursor.close() + + df = pd.DataFrame(users) + df['Expiration'] = pd.to_datetime(df['Expiration']).dt.date + + for _, row in df.iterrows(): + est_expire = row['Expiration'] < date.today() + fond = "#ffe6e6" if est_expire else "#f8f9fa" # rouge clair si expiré, gris clair sinon + with st.container(): + st.markdown(f"
", + unsafe_allow_html=True) + col1, col2, col3 = st.columns([4, 2, 1]) + with col1: + st.markdown(f"**Utilisateur :** {row['utilisateur']}") + if est_expire: + st.markdown("⛔ Accès expiré", + unsafe_allow_html=True) + + with col2: + new_date = st.date_input("Expiration", row['Expiration'], key=f"exp_{row['Id']}") + with col3: + if st.button("✅", key=f"save_{row['Id']}"): + try: + cursor = conn.cursor() + cursor.execute("UPDATE MotsDePasse SET Expiration = %s WHERE Id = %s", + (new_date, row['Id'])) + conn.commit() + st.success(f"✅ {row['utilisateur']} mis à jour") + cursor.close() + except Exception as e: + st.error(f"Erreur : {e}") + st.markdown("

", unsafe_allow_html=True) 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"]) @@ -601,7 +649,6 @@ if st.session_state["authenticated"]: 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) @@ -611,14 +658,13 @@ if st.session_state["authenticated"]: 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", + (utilisateur, lieu, datetime.now(), f"{'Mise' if en_entretien else 'Retrait'} en entretien", cible)) conn.commit() cursor.close() @@ -636,7 +682,17 @@ if st.session_state["authenticated"]: except Exception as e: st.error(f"Erreur lors du chargement des sondes : {e}") -# --- ONGLET TRAFFIC ------ + # 👉 Gestion des expirations visibles uniquement pour les superviseurs + if role == "superviseur": + try: + conn = mysql.connector.connect(**db_config) + afficher_gestion_expiration(conn) + conn.close() + except Exception as e: + st.error(f"Erreur lors du chargement des comptes : {e}") + + + # --- ONGLET TRAFFIC ------ elif onglet == "Traffic": st.markdown("## 🚦 Connexions récentes") try: