diff --git a/app/app_db/app.db b/app/app_db/app.db index 6d16786..27385d3 100644 Binary files a/app/app_db/app.db and b/app/app_db/app.db differ diff --git a/app/app_db/app_db.py b/app/app_db/app_db.py index 6ca38a0..262707c 100644 --- a/app/app_db/app_db.py +++ b/app/app_db/app_db.py @@ -21,6 +21,13 @@ def get_list(sql, params=None): conn.close() return df +def get_value(sql, params=None): + conn = get_conn() + df = pd.read_sql_query(sql, conn, params=params) + conn.close() + value = df.iloc[0,0] + return value + def send_cmd(sql, params=None): try: with get_conn() as conn: diff --git a/app/pages/groups.py b/app/pages/groups.py new file mode 100644 index 0000000..b0ff837 --- /dev/null +++ b/app/pages/groups.py @@ -0,0 +1,124 @@ +import streamlit as st +from auth_runtime import require_login +# from ui.sidebar import build_sidebar +from pathlib import Path +from tools.load_css import load_css +from app_db.app_db import get_list, send_cmd +from tools.numgen import get_num + + +DASH_NAME = Path(__file__).stem + +load_css() + +st.set_page_config(page_title="Co-App Benutzer", page_icon=":material/person:", layout="wide", initial_sidebar_state="collapsed") + +authenticator = require_login() +st.session_state["authenticator"] = authenticator + +def sidebar(): + + fullname = st.session_state.get("fullname") + role_text = st.session_state.get("role_text") + + with st.sidebar: + + st.logo("app/images/GMN_Logo_neu_rgb.png", size="small") + st.markdown(f"**{fullname}** ({role_text})") + + col1, col2 = st.columns([2,2]) + with col1: + authenticator.logout("Logout") + with col2: + if st.button("Home", use_container_width=True, icon=":material/home:"): + st.switch_page("pages/home.py") + + groups() + + +def groups(): + + if "selected_user_id" not in st.session_state: + st.session_state.selected_user_id = None + if st.button(label="test"): + st.info(get_num("numgen_group", step=10)) + #-------------------------------------------------------------------------------------------------- + # Rollenverwaltung + #-------------------------------------------------------------------------------------------------- + + + # df = get_list(""" + # select + # u.id, + # u.username, + # u.firstname, + # u.lastname, + # u.role_id || ' | ' || r.role_text as role, + # u.new_pwd, + # u.active + # from + # users u + # left join roles r + # on u.role_id = r.role_id + # """) + + + + # col_find_role, col_create_role, col_modify_role, col_delete_role = st.columns([3,2,2,2], vertical_alignment="bottom") + + # with col_find_role: + # 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:"): + # dialog_create_user() + # if "save_msg" in st.session_state: + # st.toast(st.session_state.save_msg) + # del st.session_state.save_msg + + # with col_modify_user: + # if st.button(label="Benutzer bearbeiten", use_container_width=True, icon=":material/person:"): + # 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:"): + # 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 + + + + + # if txt_search.strip(): + # txt_search_norm = txt_search.strip().lower() + # mask = ( + # 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() + + # event = st.dataframe(df_view,key="data", on_select="rerun", selection_mode="single-row") + # rows = event.selection.rows + # if rows: + # row_idx = rows[0] + # st.session_state.selected_user_id = int(df_view.iloc[row_idx]["id"]) + # else: + # st.session_state.selected_user_id = None + + + +if __name__ == "__main__": + sidebar() diff --git a/app/pages/user.py b/app/pages/user.py index b7fd78a..16e418d 100644 --- a/app/pages/user.py +++ b/app/pages/user.py @@ -1,182 +1,6 @@ - - -# import streamlit as st -# import pandas as pd - -# from db_users import init_db, get_user, update_user, set_password # wie zuvor -# from db_users_search import search_users # wie zuvor - -# st.set_page_config(layout="wide") -# init_db() - -# if "selected_user_id" not in st.session_state: -# st.session_state.selected_user_id = None - -# def open_edit(user_id: int): -# st.session_state.selected_user_id = user_id -# st.session_state.show_edit = True - -# @st.dialog("Benutzer bearbeiten") -# def edit_user_dialog(user_id: int): -# user = get_user(user_id) -# if not user: -# st.error("Benutzer nicht gefunden.") -# return - -# st.markdown(f"**{user['username']}** (ID {user['id']})") - -# with st.form("edit_user_form"): -# display_name = st.text_input("Anzeigename", value=user.get("display_name") or "") -# email = st.text_input("E-Mail", value=user.get("email") or "") -# role = st.selectbox("Rolle", ["user", "admin"], index=0 if user["role"] == "user" else 1) -# is_active = st.checkbox("Aktiv", value=bool(user["is_active"])) -# save = st.form_submit_button("Speichern") - -# if save: -# update_user(user_id, display_name, email, role, is_active) -# st.success("Gespeichert.") -# st.session_state.show_edit = False -# st.rerun() - -# st.divider() - -# st.markdown("**Passwort zurücksetzen**") -# with st.form("pw_form", clear_on_submit=True): -# pw = st.text_input("Neues Passwort", type="password") -# pw_save = st.form_submit_button("Passwort setzen") -# if pw_save: -# if not pw: -# st.error("Bitte Passwort eingeben.") -# else: -# set_password(user_id, pw) -# st.success("Passwort aktualisiert.") -# st.session_state.show_edit = False -# st.rerun() - - -# st.title("Benutzerverwaltung") - -# q = st.text_input("Suche", placeholder="username / Name / E-Mail") -# rows, total = search_users(q, limit=20, offset=0) - -# st.caption(f"{total} Treffer") -# for r in rows: -# c1, c2, c3, c4 = st.columns([2, 2, 3, 1]) -# c1.write(r["username"]) -# c2.write(r.get("display_name") or "") -# c3.write(r.get("email") or "") -# if c4.button("Ändern", key=f"edit_{r['id']}"): -# open_edit(r["id"]) - -# # Dialog öffnen, wenn Flag gesetzt -# if st.session_state.get("show_edit") and st.session_state.selected_user_id: -# edit_user_dialog(int(st.session_state.selected_user_id)) - - - - - - - - -# # 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() - - - - - - - - - import streamlit as st from auth_runtime import require_login -from ui.sidebar import build_sidebar +# from ui.sidebar import build_sidebar from auth import create_user from pathlib import Path from tools.load_css import load_css diff --git a/app/tools/numgen.py b/app/tools/numgen.py new file mode 100644 index 0000000..2dc53de --- /dev/null +++ b/app/tools/numgen.py @@ -0,0 +1,20 @@ +from app_db.app_db import get_value, send_cmd +from logging_config import setup_logging +import os + +APP_ENV = os.environ.get("APP_ENV", "dev") +logger = setup_logging(APP_ENV) + +def get_num(numgen, step=10): + num = get_value(f"select param_value from param where parameter = '{numgen}'") + print(int(num) + step) + update_num(num, 10, numgen) + return num + +def update_num(num, step, numgen): + try: + send_cmd(f"update param set param_value = {int(num) + step} where parameter = '{numgen}'") + return True + except: + logger.warning(f"Fehler beim Hochzählen von {numgen}. Bitte manuel ändern!") + return False \ No newline at end of file diff --git a/app/ui/sidebar.py b/app/ui/sidebar.py index c841314..af03fb1 100644 --- a/app/ui/sidebar.py +++ b/app/ui/sidebar.py @@ -70,7 +70,7 @@ def build_sidebar(): # Streamlit-Page if dash_type == "page" and isinstance(page_file, str) and page_file.strip(): - st.page_link(f"pages/{page_file}.py", label=label) + st.page_link(f"pages/{page_file}.py", label=label, help="Das ist die Hilfe") # Externer Link elif dash_type == "url" and isinstance(page_file, str) and page_file.strip(): diff --git a/migrations/20251130_191100_add_table_dashboards.sql b/migrations/20251130_191100_add_table_dashboards.sql index e83ae0f..31710e0 100644 --- a/migrations/20251130_191100_add_table_dashboards.sql +++ b/migrations/20251130_191100_add_table_dashboards.sql @@ -11,7 +11,7 @@ create table if not exists dashboards ( ); create table if not exists groups ( - group_id text unique not null, + group_id integer unique not null, group_text text not null, group_description text, active integer not null default 1, diff --git a/migrations/20251218_211700_add_table_param.sql b/migrations/20251218_211700_add_table_param.sql new file mode 100644 index 0000000..e26c815 --- /dev/null +++ b/migrations/20251218_211700_add_table_param.sql @@ -0,0 +1,14 @@ +begin; + +create table if not exists param ( + parameter text unique not null, + parameter_text text not null, + param_description text, + param_value text not null, + date_create TEXT NOT NULL DEFAULT (datetime('now')), + id integer primary key autoincrement +); + +INSERT INTO schema_version (version) VALUES ('20251218_211700_add_table_param'); + +COMMIT; \ No newline at end of file