Refonte Domo91.py, mot de passe bcrypt

This commit is contained in:
2025-08-19 22:15:38 +02:00
parent 0f607cbf17
commit 8605965f11
7 changed files with 393 additions and 135 deletions

View File

@@ -17,7 +17,7 @@ st.set_page_config(page_title="Domo91 - Surveillance", layout="wide")
if "authenticated" not in st.session_state:
st.session_state["authenticated"] = False
st.session_state["role"] = None
st.session_state["lieu_autorise"] = None
st.session_state["site_autorise"] = None
st.title("📡 Supervision Températures")
@@ -154,8 +154,8 @@ if "authenticated" not in st.session_state:
st.session_state["authenticated"] = False
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
if "site_autorise" not in st.session_state:
st.session_state["site_autorise"] = None
# --- Connexion utilisateur dans la sidebar ---
st.sidebar.header("🔐 Connexion")
@@ -178,7 +178,7 @@ if not st.session_state.get("authenticated"):
st.stop()
st.session_state["authenticated"] = True
st.session_state["role"] = result["role"]
st.session_state["lieu_autorise"] = result["Lieu"]
st.session_state["site_autorise"] = result["Lieu"]
st.success(f"Connecté comme {result['role']} ({result['Lieu']})")
# Enregistrement de la connexion dans Connexion_Log
try:
@@ -202,31 +202,12 @@ else:
if st.sidebar.button("🔓 Déconnexion", key="logout_sidebar"):
st.session_state["authenticated"] = False
st.session_state["role"] = None
st.session_state["lieu_autorise"] = None
st.session_state["site_autorise"] = None
st.rerun()
def hash_password(password):
return bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
def ajouter_utilisateur(utilisateur, mot_de_passe, role, lieu, expiration):
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
cursor.execute("SELECT * FROM MotsDePasse WHERE utilisateur = %s", (utilisateur,))
if cursor.fetchone():
return False, "❌ Utilisateur déjà existant."
hash_mdp = hash_password(mot_de_passe)
cursor.execute("""
INSERT INTO MotsDePasse (utilisateur, mot_de_passe, role, Lieu, Expiration)
VALUES (%s, %s, %s, %s, %s)
""", (utilisateur, hash_mdp, role, lieu, expiration))
conn.commit()
cursor.close()
conn.close()
return True, "✅ Utilisateur ajouté avec succès."
except Exception as e:
return False, f"⚠️ Erreur : {e}"
def afficher_gestion_expiration(conn):
st.subheader("🔐 Gestion des expirations d'accès")
@@ -269,7 +250,7 @@ def afficher_gestion_expiration(conn):
# 📄 Affichage bouton PDF si une date est choisie
site_pdf = (
st.session_state.get("lieu_autorise")
st.session_state.get("site_autorise")
if st.session_state.get("role") != "superviseur"
else st.session_state.get("selected_site")
@@ -285,7 +266,7 @@ if site_pdf and date_pdf:
# --- Forcer une alerte de test dynamique (réservé aux superviseurs)
if st.session_state.get("authenticated") and st.session_state.get("role") == "superviseur":
site_actuel = (
st.session_state.get("lieu_autorise") or "Saclay"
st.session_state.get("site_autorise") or "Saclay"
if st.session_state.get("role") != "superviseur"
else st.session_state.get("selected_site")
)
@@ -338,14 +319,14 @@ if st.session_state.get("authenticated") and st.session_state.get("role") == "su
if st.button("🔓 Déconnexion", key="logout_main"):
st.session_state["authenticated"] = False
st.session_state["role"] = None
st.session_state["lieu_autorise"] = None
st.session_state["site_autorise"] = None
st.rerun()
st.markdown("---")
st.subheader("📄 Rapport PDF")
if "selected_date" in st.session_state:
if st.button("📅 Télécharger l'état du jour (PDF)"):
site = st.session_state["lieu_autorise"]
site = st.session_state["site_autorise"]
date_val = st.session_state["selected_date"].strftime("%Y-%m-%d")
generer_pdf(site, date_val, periode)
else:
@@ -382,10 +363,10 @@ if st.session_state["authenticated"]:
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
if "site_autorise" not in st.session_state:
st.session_state["site_autorise"] = None
site_selectionne = (
st.session_state["lieu_autorise"]
st.session_state["site_autorise"]
if st.session_state["role"] != "superviseur"
else st.session_state.get("selected_site", "Saclay")
)
@@ -421,7 +402,46 @@ if st.session_state["authenticated"]:
onglet = st.sidebar.radio("📁 Navigation", onglets_possibles, index=onglets_possibles.index(onglet))
st.session_state["onglet_actif"] = onglet
# --- ONGLET ACCUEIL ---
# --- Bandeau Alertes ---
try:
conn = get_connection()
cursor = conn.cursor(dictionary=True)
# Récupérer le site autorisé depuis la session
site = st.session_state.get("lieu_autorise")
if site:
# Lecture des alertes non acquittées pour ce site
cursor.execute(f"""
SELECT Id, Sonde, Debut_defaut, Etat
FROM Alertes_{site}
WHERE Etat != 'Acquitté'
ORDER BY Debut_defaut DESC
""")
alertes = cursor.fetchall()
if alertes:
st.markdown(
f"<div style='background-color:#ffcccc;padding:10px;border-radius:8px;'>"
f"🚨 <b>{len(alertes)} alerte(s) non résolue(s)</b> sur <b>{site}</b>"
f"</div>",
unsafe_allow_html=True
)
else:
st.markdown(
f"<div style='background-color:#ccffcc;padding:10px;border-radius:8px;'>"
f"✅ Aucune alerte en cours sur <b>{site}</b>"
f"</div>",
unsafe_allow_html=True
)
cursor.close()
conn.close()
except Exception as e:
st.error(f"Erreur lors de la récupération des alertes : {e}")
# --- ONGLET ACCUEIL ---
if onglet == "Accueil":
st.markdown("## Sélection du site et de la date")
try:
@@ -432,12 +452,12 @@ if st.session_state["authenticated"]:
site_selectionne = st.selectbox("📍 Choisissez un site :", sites_possibles)
st.session_state["selected_site"] = site_selectionne
else:
site_selectionne = st.session_state["lieu_autorise"]
site_selectionne = st.session_state["site_autorise"]
st.info(f"Site imposé : {site_selectionne}")
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")
site_selectionne = st.session_state.get("site_autorise") or st.session_state.get("selected_site")
if not site_selectionne:
st.warning("Aucun site sélectionné.")
@@ -514,7 +534,7 @@ if st.session_state["authenticated"]:
cursor = conn.cursor(dictionary=True)
site = (
st.session_state["lieu_autorise"]
st.session_state["site_autorise"]
if st.session_state["role"] != "superviseur"
else st.session_state.get("selected_site", "Saclay")
)
@@ -589,7 +609,7 @@ if st.session_state["authenticated"]:
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")
st.session_state.get("site_autorise")
if st.session_state.get("role") != "superviseur"
else st.session_state.get("selected_site")
)
@@ -662,7 +682,7 @@ if st.session_state["authenticated"]:
st.markdown("</div><br>", 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 :",
lieu = st.session_state.get("site_autorise") if role != "superviseur" else st.selectbox("Choisir un lieu :",
["Saclay", "Meudon"])
if not lieu:
st.warning("Aucun site sélectionné.")