diff --git a/domo91.py b/domo91.py index efb8231..e26270b 100644 --- a/domo91.py +++ b/domo91.py @@ -26,8 +26,10 @@ db_config = { "database": "Sondes" } + # --- 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}") try: conn = mysql.connector.connect(**db_config) cursor = conn.cursor(dictionary=True) @@ -35,23 +37,7 @@ def generer_pdf(site, date_str): cursor.execute(f"SELECT Sonde, Date, Temperature FROM `{site}` WHERE DATE(Date) = %s ORDER BY Sonde, Date", (date_str,)) rows = cursor.fetchall() df = pd.DataFrame(rows) - df["Heure"] = pd.to_datetime(df["Date"]) - - # --- Appliquer les filtres de l'utilisateur --- - sonde_choisie = st.session_state.get("sonde_selectionnee") - tranche = st.session_state.get("tranche_horaire") - if sonde_choisie: - df = df[df["Sonde"] == sonde_choisie] - if tranche: - heure = df["Heure"].dt.hour - if tranche == "Matin (6h-12h)": - df = df[(heure >= 6) & (heure < 12)] - elif tranche == "Après-midi (12h-18h)": - df = df[(heure >= 12) & (heure < 18)] - elif tranche == "Nuit (18h-6h)": - df = df[(heure >= 18) | (heure < 6)] - - df["Heure"] = df["Heure"].dt.strftime("%H:%M") + df["Heure"] = pd.to_datetime(df["Date"]).dt.strftime("%H:%M") releves = {} for sonde in df["Sonde"].unique(): @@ -81,19 +67,12 @@ def generer_pdf(site, date_str): def releves_section(self, data): self.set_font("Arial", "B", 12) self.cell(0, 10, "Relevés de température", ln=1) - col_width = self.w / 3.3 - row_height = 6 for sonde, mesures in data.items(): - if not mesures: - continue self.set_font("Arial", "B", 11) - self.cell(0, 8, f"Sonde : {sonde}", ln=1, fill=True) + self.cell(0, 8, f"Sonde : {sonde}", ln=1) self.set_font("Arial", "", 10) - for i in range(0, len(mesures), 3): - ligne = mesures[i:i+3] - for heure, temp in ligne: - self.cell(col_width, row_height, f"{heure} : {temp:.1f}°C", border=1) - self.ln() + for heure, temp in mesures: + self.cell(0, 6, f"{heure} - {temp} °C", ln=1) self.ln(2) def alertes_section(self, data): @@ -111,66 +90,21 @@ def generer_pdf(site, date_str): file_name = f"rapport_{site}_{date_str}.pdf" output_dir = "PDF" - os.makedirs(output_dir, exist_ok=True) + os.makedirs(output_dir, exist_ok=True) # 🔧 Crée le dossier si absent output_path = os.path.join(output_dir, file_name) + pdf.output(output_path) - return output_path + with open(output_path, "rb") as f: + st.download_button( + label="📥 Télécharger le rapport PDF", + data=f, + file_name=file_name, + mime="application/pdf" + ) except Exception as e: st.error(f"Erreur lors de la génération du PDF : {e}") - return None - -# Ajout du bouton dans la sidebar pour tous les utilisateurs connectés -if st.session_state.get("authenticated") and st.session_state.get("selected_date"): - site = ( - st.session_state.get("lieu_autorise") - if st.session_state.get("role") != "superviseur" - else st.session_state.get("selected_site") - ) - date_val = st.session_state["selected_date"].strftime("%Y-%m-%d") - st.session_state["site_selectionne"] = site - st.sidebar.markdown("---") - st.sidebar.subheader("📄 Impressions") - - if st.sidebar.button("📥 Générer le PDF maintenant"): - pdf_path = generer_pdf(site, date_val) - if pdf_path: - st.session_state["pdf_path"] = pdf_path - - if "pdf_path" in st.session_state: - with open(st.session_state["pdf_path"], "rb") as f: - st.sidebar.download_button( - label="📄 Télécharger le PDF", - data=f, - file_name=os.path.basename(st.session_state["pdf_path"]), - mime="application/pdf", - key="pdf_download_button" - ) - -# Ajout du bouton dans la sidebar pour tous les utilisateurs connectés -if st.session_state.get("authenticated") and st.session_state.get("selected_date"): - site = ( - st.session_state.get("lieu_autorise") - if st.session_state.get("role") != "superviseur" - else st.session_state.get("selected_site") - ) - date_val = st.session_state["selected_date"].strftime("%Y-%m-%d") - st.session_state["site_selectionne"] = site - st.sidebar.markdown("---") - st.sidebar.subheader("📄 Impressions") - generer_pdf(site, date_val) -# Ajout du bouton dans la sidebar pour tous les utilisateurs connectés -if st.session_state.get("authenticated") and st.session_state.get("selected_date"): - site = ( - st.session_state.get("lieu_autorise") - if st.session_state.get("role") != "superviseur" - else st.session_state.get("selected_site") - ) - date_val = st.session_state["selected_date"].strftime("%Y-%m-%d") - st.sidebar.markdown("---") - st.sidebar.subheader("📄 Impressions") - generer_pdf(site, date_val) # --- Initialisation des variables de session --- if "authenticated" not in st.session_state: @@ -180,9 +114,7 @@ if "role" not in st.session_state: if "lieu_autorise" not in st.session_state: st.session_state["lieu_autorise"] = None -# --- Sidebar (connexion + bouton PDF) --- - -# 🔐 Connexion (toujours affichée) +# --- Connexion utilisateur dans la sidebar --- st.sidebar.header("🔐 Connexion") if not st.session_state.get("authenticated"): login = st.sidebar.text_input("Nom d'utilisateur") @@ -198,6 +130,7 @@ if not st.session_state.get("authenticated"): st.session_state["role"] = result["role"] st.session_state["lieu_autorise"] = result["Lieu"] st.success(f"Connecté comme {result['role']} ({result['Lieu']})") + st.rerun() else: st.sidebar.error("Identifiants invalides") cursor.close() @@ -206,14 +139,28 @@ if not st.session_state.get("authenticated"): st.sidebar.error(f"Erreur lors de la connexion à la base : {e}") else: st.sidebar.success(f"Connecté ({st.session_state['role']})") - if st.sidebar.button("🔓 Déconnexion"): + 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.rerun() -# 🔔 Forcer une alerte de test dynamique avec choix de la sonde -if st.session_state.get("authenticated"): +# 📄 Affichage bouton PDF si une date est choisie +site_pdf = ( + st.session_state.get("lieu_autorise") + if st.session_state.get("role") != "superviseur" + else st.session_state.get("selected_site") +) +date_pdf = st.session_state.get("selected_date") +if site_pdf and date_pdf: + st.sidebar.markdown("---") + st.sidebar.subheader("📄 Rapport PDF") + if st.sidebar.button("📥 Télécharger l’état du jour (PDF)", key="pdf_btn"): + generer_pdf(site_pdf, date_pdf.strftime("%Y-%m-%d")) + + +# 🔔 Forcer une alerte de test dynamique avec choix de la sonde (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") if st.session_state.get("role") != "superviseur" @@ -253,7 +200,7 @@ if st.session_state.get("authenticated"): else: st.success(f"Connecté ({st.session_state['role']})") - if st.button("🔓 Déconnexion"): + if st.button("🔓 Déconnexion", key="logout_main"): st.session_state["authenticated"] = False st.session_state["role"] = None st.session_state["lieu_autorise"] = None @@ -297,7 +244,6 @@ if st.session_state["authenticated"]: df["Date"] = pd.to_datetime(df["Date"]) sondes = sorted(df["Sonde"].unique()) sonde_choisie = st.selectbox("🧪 Choisissez une sonde :", sondes) - st.session_state["sonde_selectionnee"] = sonde_choisie df_sonde = df[df["Sonde"] == sonde_choisie] # Ajouter une colonne Heure pour faciliter les filtres @@ -306,7 +252,7 @@ if st.session_state["authenticated"]: # Filtrage par tranche horaire tranche = st.radio("🕒 Tranche horaire :", ["Toute la journée", "Matin (6h-12h)", "Après-midi (12h-18h)", "Nuit (18h-6h)"]) - st.session_state["tranche_horaire"] = tranche + if tranche == "Matin (6h-12h)": df_sonde = df_sonde[(df_sonde["Heure"] >= 6) & (df_sonde["Heure"] < 12)] elif tranche == "Après-midi (12h-18h)": @@ -375,7 +321,7 @@ if st.session_state["authenticated"]: except Exception as e: st.error(f"Erreur MySQL : {e}") if st.session_state["role"] == "superviseur": - with st.expander("➕ Ajouter une nouvelle chambre froide", expanded=False): + 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) @@ -432,13 +378,13 @@ if st.session_state["role"] == "superviseur": temp_max = chambre["Temp_Max"] moins, val, plus = st.columns([1, 2, 1]) with moins: - if st.button("➖", key=f"moins_{chambre['Id']}"): + 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']}"): + if st.button("+", key=f"plus_{chambre['Id']}"): temp_max += 1 if new_etat != chambre["Etat"] or temp_max != chambre["Temp_Max"]: