import streamlit as st import yaml from yaml.loader import SafeLoader import streamlit_authenticator as stauth from auth import load_credentials_from_db, get_role_for_user, create_user, needs_password_change, update_password, get_fullname_for_user from version import __version__ from dashboards import get_dashboard_renderer # --------------------------------------------------------------------------- # Login beim Starten der App # --------------------------------------------------------------------------- def login(): st.set_page_config( page_title=f"Co-App Start - V{__version__}", page_icon="🔒", layout="centered", ) # --- Config laden (Cookie, etc.) --- with open("config/auth.yaml", "r", encoding="utf-8") as f: base_config = yaml.load(f, Loader=SafeLoader) # --- Credentials dynamisch aus DB laden --- db_creds = load_credentials_from_db() base_config["credentials"] = db_creds authenticator = stauth.Authenticate( base_config["credentials"], base_config["cookie"]["name"], base_config["cookie"]["key"], base_config["cookie"]["expiry_days"], ) authenticator.login(location="main", key="Login") auth_status = st.session_state.get("authentication_status") name = st.session_state.get("name") username = st.session_state.get("username") if auth_status is False: st.error("Login fehlgeschlagen.") return if auth_status is None: st.warning("Bitte Benutzername und Passwort eingeben.") return # ---- Ab hier eingeloggt (persistenter Cookie) ---- if needs_password_change(username): st.warning("Du musst dein Passwort ändern, bevor du die Anwendung nutzen kannst.") # Damit das Formular nur einmal pro Run erscheint with st.form("pw_change_form"): pw1 = st.text_input("Neues Passwort", type="password") pw2 = st.text_input("Neues Passwort (Wiederholung)", type="password") submitted = st.form_submit_button("Passwort ändern") if submitted: if not pw1 or not pw2: st.error("Bitte beide Passwortfelder ausfüllen.") return if pw1 != pw2: st.error("Passwörter stimmen nicht überein.") return if len(pw1) < 8: st.error("Passwort sollte mindestens 8 Zeichen lang sein.") return update_password(username, pw1, reset_flag=True) st.success("Passwort wurde geändert.") # Optional: danach Seite einmal „sauber“ neu laden st.rerun() # Solange new_pwd=1 ist, KEINEN weiteren Content anzeigen return authenticator.logout("Logout", "sidebar") load_sidebar(username) # def home(username: str, role: str): # st.header("Controlling-Portal") # st.info(f"Willkommen, {username}!") # if role == "admin": # st.subheader("Admin-Bereich") # st.write("Nur Admins sehen das hier.") # with st.expander("Neuen Nutzer anlegen"): # new_u = st.text_input("Neuer Username", key="new_u") # new_fname = st.text_input("Vorname", key="new_fname") # new_lname = st.text_input("Nachname", key="new_lname") # new_email = st.text_input("E-Mail", key="new_email") # new_p = st.text_input("Neues Passwort", type="password", key="new_p") # new_role = st.selectbox("Rolle", ["user", "admin"], key="new_role") # if st.button("Anlegen"): # if new_u and new_p: # ok = create_user(new_u.strip(), new_p, new_role, new_email, new_fname, new_lname) # st.success("Nutzer angelegt.") if ok else st.error("Username bereits vorhanden oder Fehler.") # else: # st.warning("Bitte Username und Passwort eingeben.") # st.subheader("Dein Bereich") # st.write(f"Personalisierter Content für **{username}**.") # --------------------------------------------------------------------------- # Sidebar aufbauen - Daten aus app.db laden und gruppieren # --------------------------------------------------------------------------- def load_sidebar(username: str): renderer = get_dashboard_renderer(selected_code) if renderer is None: st.error(f"Kein Dashboard-Modul für '{selected_code}' gefunden.") return renderer() role = get_role_for_user(username) fullname = get_fullname_for_user(username) with st.sidebar: st.write(f"**{fullname}** ({role})") st.divider() st.markdown("### Dashboards") st.divider() st.page_link("home.py", label="Home") home(username, role) if __name__ == "__main__": login()