added users administration tool

This commit is contained in:
knedlik
2025-12-15 08:21:18 +01:00
parent e2091ec677
commit 13d747827d
11 changed files with 602 additions and 76 deletions

86
app/admin_users.py Normal file
View File

@@ -0,0 +1,86 @@
# admin_users.py
import streamlit as st
import pandas as pd
from db_users import init_db, list_users, get_user, create_user, update_user, set_password, delete_user
st.set_page_config(page_title="User Admin", layout="wide")
init_db()
st.title("Benutzerverwaltung")
# --- Übersicht ---
users = list_users()
df = pd.DataFrame(users)
if df.empty:
st.info("Noch keine Benutzer vorhanden.")
df = pd.DataFrame(columns=["id","username","display_name","email","role","is_active","created_at"])
st.subheader("Übersicht")
st.dataframe(df, use_container_width=True, hide_index=True)
st.divider()
colA, colB = st.columns(2, gap="large")
# --- Neuen Benutzer anlegen ---
with colA:
st.subheader("Neuen Benutzer anlegen")
with st.form("create_user", clear_on_submit=True):
username = st.text_input("Username*", max_chars=50)
password = st.text_input("Initiales Passwort*", type="password")
display_name = st.text_input("Anzeigename")
email = st.text_input("E-Mail")
role = st.selectbox("Rolle", ["user", "admin"], index=0)
is_active = st.checkbox("Aktiv", value=True)
submitted = st.form_submit_button("Anlegen")
if submitted:
if not username or not password:
st.error("Username und Passwort sind Pflicht.")
else:
try:
create_user(username, password, display_name, email, role, is_active)
st.success("Benutzer angelegt.")
st.rerun()
except Exception as e:
st.error(f"Fehler beim Anlegen: {e}")
# --- Bestehenden Benutzer bearbeiten/löschen ---
with colB:
st.subheader("Benutzer bearbeiten / löschen")
user_ids = df["id"].tolist() if "id" in df.columns else []
selected_id = st.selectbox("Benutzer wählen", user_ids, format_func=lambda uid: f"{uid} {df.loc[df.id==uid,'username'].values[0] if len(df)>0 else uid}" if uid in user_ids else str(uid))
user = get_user(int(selected_id)) if selected_id else None
if user:
with st.form("edit_user"):
display_name2 = st.text_input("Anzeigename", value=user.get("display_name") or "")
email2 = st.text_input("E-Mail", value=user.get("email") or "")
role2 = st.selectbox("Rolle", ["user", "admin"], index=0 if user["role"]=="user" else 1)
is_active2 = st.checkbox("Aktiv", value=bool(user["is_active"]))
save = st.form_submit_button("Änderungen speichern")
if save:
update_user(int(selected_id), display_name2, email2, role2, is_active2)
st.success("Gespeichert.")
st.rerun()
st.markdown("**Passwort zurücksetzen**")
with st.form("reset_pw", clear_on_submit=True):
new_pw = st.text_input("Neues Passwort", type="password")
reset = st.form_submit_button("Passwort setzen")
if reset:
if not new_pw:
st.error("Bitte ein Passwort eingeben.")
else:
set_password(int(selected_id), new_pw)
st.success("Passwort aktualisiert.")
st.markdown("**Löschen**")
confirm = st.checkbox("Ich möchte diesen Benutzer wirklich löschen.")
if st.button("Benutzer löschen", disabled=not confirm):
delete_user(int(selected_id))
st.success("Benutzer gelöscht.")
st.rerun()