Add tool numgen

This commit is contained in:
knedlik
2025-12-18 22:22:26 +01:00
parent 9435399096
commit 37d1daa052
8 changed files with 168 additions and 179 deletions

Binary file not shown.

View File

@@ -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:

124
app/pages/groups.py Normal file
View File

@@ -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()

View File

@@ -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

20
app/tools/numgen.py Normal file
View File

@@ -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

View File

@@ -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():

View File

@@ -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,

View File

@@ -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;