|
- 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
|