|
- import streamlit as st
- import pandas as pd
- import os
- import time # RISOLVE: NameError: name 'time' is not defined
- from pathlib import Path
- 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", ";")
-
- # Inizializzazione session_state per il reset dei campi dopo il salva
- if "reset_trigger" not in st.session_state:
- st.session_state.reset_trigger = False
-
- 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"])
-
- sub_tab1, sub_tab2 = st.tabs(["Individuali", "Gruppi"])
-
- with sub_tab1:
- st.markdown("### 📋 Anagrafica Beacon Singoli")
- 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"):
- try:
- edited_beacons['MAC'] = edited_beacons['MAC'].apply(norm_mac)
- edited_beacons.to_csv(beacon_csv, index=False, sep=csv_delim)
- st.success("Anagrafica salvata!")
- st.rerun()
- except Exception as e:
- st.error(f"Errore: {e}")
-
- with sub_tab2:
- st.markdown("### 🏗️ Creazione e Gestione Gruppi")
-
- if not df_groups.empty:
- st.write("#### Gruppi Attivi (Vista Operatore)")
- mac_to_name = dict(zip(df_beacons['MAC'], df_beacons['BeaconName']))
-
- display_data = []
- for _, row in df_groups.iterrows():
- group_name = row['BeaconGroupName']
- macs = str(row['GroupMAC']).split(',')
- for m in macs:
- m = m.strip()
- display_data.append({
- "Gruppo": group_name,
- "BeaconName": mac_to_name.get(m, "Sconosciuto"),
- "MAC": m
- })
-
- # --- LOGICA PER UNIRE LE CELLE (Excel Style) ---
- # Trasformiamo Gruppo e BeaconName in Indici per raggrupparli visivamente
- df_display = pd.DataFrame(display_data)
- df_grouped = df_display.set_index(["Gruppo", "BeaconName"])
- st.dataframe(df_grouped, use_container_width=True)
-
- # RIMOZIONE SELETTIVA GRUPPO
- st.divider()
- col_del1, col_del2 = st.columns([3, 1])
- group_to_del = col_del1.selectbox("Seleziona gruppo da rimuovere:", df_groups["BeaconGroupName"].unique())
- if col_del2.button("🗑️ Rimuovi Gruppo", use_container_width=True):
- df_groups = df_groups[df_groups["BeaconGroupName"] != group_to_del]
- df_groups.to_csv(group_csv, index=False, sep=csv_delim)
- st.warning(f"Gruppo '{group_to_del}' rimosso.")
- st.rerun()
- else:
- st.info("Nessun gruppo configurato.")
-
- st.divider()
- st.write("#### Aggiungi o Modifica un Gruppo")
-
- # Form per l'inserimento con reset automatico
- with st.form("form_nuovo_gruppo", clear_on_submit=True):
- gn = st.text_input("Nome Gruppo (es. GBC-01)")
-
- options = [f"{n} ({m})" for n, m in zip(df_beacons["BeaconName"], df_beacons["MAC"])]
- selected_options = st.multiselect("Seleziona i Beacon:", options)
-
- submit = st.form_submit_button("💾 Salva Gruppo", type="primary")
-
- if submit:
- if gn and selected_options:
- selected_macs = [opt.split("(")[-1].replace(")", "") for opt in selected_options]
- mac_list_str = ",".join(selected_macs)
-
- 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)
-
- 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}' salvato!")
- time.sleep(1)
- st.rerun()
- else:
- st.error("Dati incompleti: inserire Nome e selezionare i Beacon.")
-
- return df_beacons, df_groups
|