import streamlit as st import pandas as pd import os from pathlib import Path # CORREZIONE: rimosso il punto per evitare ImportError from normalize import norm_mac def show_beacon_manager(cfg): st.subheader("🏷️ Gestione Beacon e Gruppi") paths = cfg.get("paths", {}) beacon_csv = paths.get("beacons_csv", "/data/config/beacons.csv") group_csv = "/data/config/beacongroup.csv" csv_delim = paths.get("csv_delimiter", ";") # --- CARICAMENTO DATI --- def load_df(path, cols): if os.path.exists(path): try: df = pd.read_csv(path, sep=csv_delim) df.columns = [c.strip() for c in df.columns] return df except: return pd.DataFrame(columns=cols) return pd.DataFrame(columns=cols) df_beacons = load_df(beacon_csv, ["BeaconName", "MAC"]) df_groups = load_df(group_csv, ["BeaconGroupName", "GroupMAC"]) # --- UI: TABS INTERNI --- sub_tab1, sub_tab2 = st.tabs(["Individuali", "Gruppi"]) with sub_tab1: st.markdown("### 📋 Anagrafica Beacon Singoli") # Editor interattivo per i beacon edited_beacons = st.data_editor( df_beacons, num_rows="dynamic", use_container_width=True, key="editor_beacons", hide_index=True ) if st.button("💾 Salva Beacon Individuali"): # Applichiamo la normalizzazione ai MAC inseriti try: edited_beacons['MAC'] = edited_beacons['MAC'].apply(norm_mac) edited_beacons.to_csv(beacon_csv, index=False, sep=csv_delim) st.success("Anagrafica Beacon salvata correttamente!") st.rerun() except Exception as e: st.error(f"Errore durante il salvataggio: {e}") with sub_tab2: st.markdown("### 🏗️ Creazione e Gestione Gruppi") # Mostra i gruppi esistenti se il file esiste if not df_groups.empty: st.write("#### Gruppi Attivi") st.dataframe(df_groups, use_container_width=True, hide_index=True) else: st.info("Nessun gruppo configurato.") st.divider() st.write("#### Aggiungi o Modifica un Gruppo") # Form per la gestione dei gruppi with st.form("form_gruppo"): gn = st.text_input("Nome Gruppo", help="Esempio: 4dBm_Power, Gruppo_A, ecc.") # Recuperiamo i beacon disponibili per popolare la selezione available_macs = df_beacons["MAC"].tolist() available_names = df_beacons["BeaconName"].tolist() options = [f"{name} ({mac})" for name, mac in zip(available_names, available_macs)] selected_options = st.multiselect("Seleziona i Beacon da includere:", options) submit = st.form_submit_button("💾 Salva Gruppo") if submit: if not gn: st.error("Inserisci un nome per il gruppo.") elif not selected_options: st.error("Seleziona almeno un beacon.") else: # Estraiamo i MAC eliminando la parte del nome selected_macs = [opt.split("(")[-1].replace(")", "") for opt in selected_options] mac_list_str = ",".join(selected_macs) # Aggiorna se esiste, altrimenti aggiungi if gn in df_groups["BeaconGroupName"].values: df_groups.loc[df_groups["BeaconGroupName"] == gn, "GroupMAC"] = mac_list_str else: new_row = pd.DataFrame([{"BeaconGroupName": gn, "GroupMAC": mac_list_str}]) df_groups = pd.concat([df_groups, new_row], ignore_index=True) # Assicuriamoci che la cartella esista os.makedirs(os.path.dirname(group_csv), exist_ok=True) df_groups.to_csv(group_csv, index=False, sep=csv_delim) st.success(f"Gruppo '{gn}' creato/aggiornato con successo!") st.rerun() if not df_groups.empty: if st.button("🗑️ Elimina tutti i Gruppi"): if os.path.exists(group_csv): os.remove(group_csv) st.warning("Configurazione gruppi rimossa.") st.rerun() return df_beacons, df_groups