Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

120 řádky
5.0 KiB

  1. import streamlit as st
  2. import pandas as pd
  3. import os
  4. import time # RISOLVE: NameError: name 'time' is not defined
  5. from pathlib import Path
  6. from normalize import norm_mac
  7. def show_beacon_manager(cfg):
  8. st.subheader("🏷️ Gestione Beacon e Gruppi")
  9. paths = cfg.get("paths", {})
  10. beacon_csv = paths.get("beacons_csv", "/data/config/beacons.csv")
  11. group_csv = "/data/config/beacongroup.csv"
  12. csv_delim = paths.get("csv_delimiter", ";")
  13. # Inizializzazione session_state per il reset dei campi dopo il salva
  14. if "reset_trigger" not in st.session_state:
  15. st.session_state.reset_trigger = False
  16. def load_df(path, cols):
  17. if os.path.exists(path):
  18. try:
  19. df = pd.read_csv(path, sep=csv_delim)
  20. df.columns = [c.strip() for c in df.columns]
  21. return df
  22. except:
  23. return pd.DataFrame(columns=cols)
  24. return pd.DataFrame(columns=cols)
  25. df_beacons = load_df(beacon_csv, ["BeaconName", "MAC"])
  26. df_groups = load_df(group_csv, ["BeaconGroupName", "GroupMAC"])
  27. sub_tab1, sub_tab2 = st.tabs(["Individuali", "Gruppi"])
  28. with sub_tab1:
  29. st.markdown("### 📋 Anagrafica Beacon Singoli")
  30. edited_beacons = st.data_editor(
  31. df_beacons, num_rows="dynamic", use_container_width=True,
  32. key="editor_beacons", hide_index=True
  33. )
  34. if st.button("💾 Salva Beacon Individuali"):
  35. try:
  36. edited_beacons['MAC'] = edited_beacons['MAC'].apply(norm_mac)
  37. edited_beacons.to_csv(beacon_csv, index=False, sep=csv_delim)
  38. st.success("Anagrafica salvata!")
  39. st.rerun()
  40. except Exception as e:
  41. st.error(f"Errore: {e}")
  42. with sub_tab2:
  43. st.markdown("### 🏗️ Creazione e Gestione Gruppi")
  44. if not df_groups.empty:
  45. st.write("#### Gruppi Attivi (Vista Operatore)")
  46. mac_to_name = dict(zip(df_beacons['MAC'], df_beacons['BeaconName']))
  47. display_data = []
  48. for _, row in df_groups.iterrows():
  49. group_name = row['BeaconGroupName']
  50. macs = str(row['GroupMAC']).split(',')
  51. for m in macs:
  52. m = m.strip()
  53. display_data.append({
  54. "Gruppo": group_name,
  55. "BeaconName": mac_to_name.get(m, "Sconosciuto"),
  56. "MAC": m
  57. })
  58. # --- LOGICA PER UNIRE LE CELLE (Excel Style) ---
  59. # Trasformiamo Gruppo e BeaconName in Indici per raggrupparli visivamente
  60. df_display = pd.DataFrame(display_data)
  61. df_grouped = df_display.set_index(["Gruppo", "BeaconName"])
  62. st.dataframe(df_grouped, use_container_width=True)
  63. # RIMOZIONE SELETTIVA GRUPPO
  64. st.divider()
  65. col_del1, col_del2 = st.columns([3, 1])
  66. group_to_del = col_del1.selectbox("Seleziona gruppo da rimuovere:", df_groups["BeaconGroupName"].unique())
  67. if col_del2.button("🗑️ Rimuovi Gruppo", use_container_width=True):
  68. df_groups = df_groups[df_groups["BeaconGroupName"] != group_to_del]
  69. df_groups.to_csv(group_csv, index=False, sep=csv_delim)
  70. st.warning(f"Gruppo '{group_to_del}' rimosso.")
  71. st.rerun()
  72. else:
  73. st.info("Nessun gruppo configurato.")
  74. st.divider()
  75. st.write("#### Aggiungi o Modifica un Gruppo")
  76. # Form per l'inserimento con reset automatico
  77. with st.form("form_nuovo_gruppo", clear_on_submit=True):
  78. gn = st.text_input("Nome Gruppo (es. GBC-01)")
  79. options = [f"{n} ({m})" for n, m in zip(df_beacons["BeaconName"], df_beacons["MAC"])]
  80. selected_options = st.multiselect("Seleziona i Beacon:", options)
  81. submit = st.form_submit_button("💾 Salva Gruppo", type="primary")
  82. if submit:
  83. if gn and selected_options:
  84. selected_macs = [opt.split("(")[-1].replace(")", "") for opt in selected_options]
  85. mac_list_str = ",".join(selected_macs)
  86. if gn in df_groups["BeaconGroupName"].values:
  87. df_groups.loc[df_groups["BeaconGroupName"] == gn, "GroupMAC"] = mac_list_str
  88. else:
  89. new_row = pd.DataFrame([{"BeaconGroupName": gn, "GroupMAC": mac_list_str}])
  90. df_groups = pd.concat([df_groups, new_row], ignore_index=True)
  91. os.makedirs(os.path.dirname(group_csv), exist_ok=True)
  92. df_groups.to_csv(group_csv, index=False, sep=csv_delim)
  93. st.success(f"Gruppo '{gn}' salvato!")
  94. time.sleep(1)
  95. st.rerun()
  96. else:
  97. st.error("Dati incompleti: inserire Nome e selezionare i Beacon.")
  98. return df_beacons, df_groups