diff --git a/app/app_db/app.db b/app/app_db/app.db index d98c97b..6dec818 100644 Binary files a/app/app_db/app.db and b/app/app_db/app.db differ diff --git a/app/pages/user.py b/app/pages/user.py index 3ca3d63..675dc90 100644 --- a/app/pages/user.py +++ b/app/pages/user.py @@ -182,6 +182,7 @@ from pathlib import Path from tools.load_css import load_css from app_db.app_db import get_list, send_cmd from ui.selectboxes import get_roles, get_id +import bcrypt DASH_NAME = Path(__file__).stem # Hier muss die dash_id aus der DB stehen -> wird gegen die session_state geprüft (User-Berechtigung) @@ -266,9 +267,10 @@ def dialog_modify_user(id): sql = """ select u.id, - u.username, + u.username as user, -- ACHTUNG: nicht mit username arbeiten, da Überschneidung in sessionstate!! u.firstname, u.lastname, + u.email, u.role_id || ' | ' || r.role_text as role, r.role_text, u.new_pwd, @@ -284,7 +286,7 @@ def dialog_modify_user(id): # df = get_list("select username from users where id = ?",(id,)) - st.session_state.orig_user_data = df + # st.session_state.orig_user_data = df df_roles = get_roles() @@ -295,27 +297,52 @@ def dialog_modify_user(id): except: idx = None - txt_username = st.text_input("Benutzername", value=df.iloc[0]["username"]) - txt_firstname = st.text_input("Vorname",df.iloc[0]["firstname"]) - txt_lastname = st.text_input("Nachname",df.iloc[0]["username"]) - txt_email = st.text_input("Email", df.iloc[0]["username"]) - txt_pwd = st.text_input("Passwort", placeholder="Neues Passwort eingeben", type="password") - new_pwd = st.checkbox("Neues Passwort",df.iloc[0]["new_pwd"]) - cmb_role = st.selectbox("Rolle", roles, placeholder="Rolle auswählen", index=idx) + txt_username = st.text_input(label="Benutzername", value=df.iloc[0]["user"]) + txt_firstname = st.text_input(label="Vorname", value=df.iloc[0]["firstname"]) + txt_lastname = st.text_input(label="Nachname", value=df.iloc[0]["lastname"]) + txt_email = st.text_input(label="Email", value=df.iloc[0]["email"]) + txt_pwd = st.text_input(label="Passwort", placeholder="Neues Passwort eingeben", type="password") + new_pwd = st.checkbox(label="Neues Passwort", value=df.iloc[0]["new_pwd"]) + cmb_role = st.selectbox(label="Rolle", options=roles, placeholder="Rolle auswählen", index=idx) + + + if st.button("Save"): + pw_hash = bcrypt.hashpw(txt_pwd.encode("utf-8"), bcrypt.gensalt()).decode("utf-8") + + if txt_pwd and txt_pwd.strip(): + sql = """ + update users set + username = ?, + firstname = ?, + lastname = ?, + email = ?, + password_hash = ?, + new_pwd = ?, + role_id = ? + where id = ? + """ + params = (txt_username, txt_firstname, txt_lastname, txt_email, pw_hash, new_pwd, get_id(cmb_role), id) + # send_cmd(sql,(txt_username, txt_firstname, txt_lastname, txt_email, pw_hash, new_pwd, get_id(cmb_role), id)) + else: + sql = """ + update users set + username = ?, + firstname = ?, + lastname = ?, + email = ?, + new_pwd = ?, + role_id = ? + where id = ? + """ + params = (txt_username, txt_firstname, txt_lastname, txt_email, new_pwd, get_id(cmb_role), id) + # send_cmd(sql,(txt_username, txt_firstname, txt_lastname, txt_email, new_pwd, get_id(cmb_role), id)) + print (params) + if send_cmd(sql, params): + st.session_state.save_msg = f"✅ Benutzer '{txt_username}' erfolgreich geändert" + else: + st.session_state.save_msg = "❌ Fehler beim Speichern" + st.rerun() - # if st.button("Save"): - # if create_user( - # username=txt_username, - # firstname=txt_firstname, - # lastname=txt_lastname, - # email=txt_email, - # role_id=get_id(cmb_role), - # password=txt_pwd - # ): - # st.session_state.save_msg = f"✅ Benutzer '{txt_username}' erfolgreich gespeichert" - # else: - # st.session_state.save_msg = "❌ Fehler beim Speichern" - # st.rerun() def user(): @@ -353,7 +380,7 @@ def user(): col_find_user, col_create_user, col_modify_user, col_delete_user = st.columns([3,2,2,2], vertical_alignment="bottom") with col_find_user: - txt_search = st.text_input("", placeholder="Benutzer, Vorname, ...", icon=":material/search:") + txt_search = st.text_input(label="Suche", label_visibility="hidden", placeholder="Benutzer, Vorname, ...", icon=":material/search:") with col_create_user: if st.button(label="Benutzer anlegen", use_container_width=True, icon=":material/person_add:"): @@ -364,11 +391,20 @@ def user(): with col_modify_user: if st.button(label="Benutzer bearbeiten", use_container_width=True, icon=":material/person:"): - dialog_modify_user(st.session_state.selected_user_id) - + if not st.session_state.selected_user_id is None: + dialog_modify_user(st.session_state.selected_user_id) + else: + st.toast("❌ Bitte erst eine Zeile auswählen") + if "save_msg" in st.session_state: + st.toast(st.session_state.save_msg) + del st.session_state.save_msg + with col_delete_user: if st.button(label="Benutzer löschen", use_container_width=True, icon=":material/person_remove:"): - dialog_delete_user(st.session_state.selected_user_id) + if not st.session_state.selected_user_id is None: + dialog_delete_user(st.session_state.selected_user_id) + else: + st.toast("❌ Bitte erst eine Zeile auswählen") if "delete_msg" in st.session_state: st.toast(st.session_state.delete_msg) del st.session_state.delete_msg @@ -379,8 +415,10 @@ def user(): if txt_search.strip(): txt_search_norm = txt_search.strip().lower() mask = ( - df["username"].fillna("").str.lower().str.contains(txt_search_norm)) - + df["username"].fillna("").str.lower().str.contains(txt_search_norm) + | df["firstname"].fillna("").str.lower().str.contains(txt_search_norm) + | df["lastname"].fillna("").str.lower().str.contains(txt_search_norm) + ) df_view = df.loc[mask].copy() else: df_view = df.copy()