diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/data/app.db b/app/app_db/app.db similarity index 98% rename from data/app.db rename to app/app_db/app.db index f5f86da..74f37a8 100644 Binary files a/data/app.db and b/app/app_db/app.db differ diff --git a/app/db.py b/app/app_db/app_db.py similarity index 71% rename from app/db.py rename to app/app_db/app_db.py index abadd2f..5386aa7 100644 --- a/app/db.py +++ b/app/app_db/app_db.py @@ -1,11 +1,10 @@ import sqlite3 from pathlib import Path -import bcrypt import pandas as pd -BASE_DIR = Path(__file__).resolve().parent.parent -DB_PATH = BASE_DIR / "data" / "app.db" - +BASE_DIR = Path(__file__).resolve().parent +# DB_PATH = BASE_DIR / "app_db" / "app.db" +DB_PATH = BASE_DIR / "app.db" def get_conn(): # check_same_thread=False, damit Streamlit mehrere Threads nutzen kann @@ -14,4 +13,5 @@ def get_conn(): def get_list(sql, params=None): conn = get_conn() df = pd.read_sql_query(sql, conn, params=params) + conn.close() return df \ No newline at end of file diff --git a/app/auth.py b/app/auth.py index 7a82f02..37ff279 100644 --- a/app/auth.py +++ b/app/auth.py @@ -2,7 +2,7 @@ from contextlib import closing import bcrypt -from db import get_conn #, create_user, verify_user, get_role_for_user +from app_db.app_db import get_conn # --------------------------------------------------------------------------- @@ -12,7 +12,7 @@ from db import get_conn #, create_user, verify_user, get_role_for_user def create_user( username: str, password: str, - role_id: str = "user", + role_id: int = 1, email: str | None = None, firstname: str | None = None, lastname: str | None = None diff --git a/app/auth_runtime.py b/app/auth_runtime.py index 7223142..8015909 100644 --- a/app/auth_runtime.py +++ b/app/auth_runtime.py @@ -9,6 +9,7 @@ from auth import load_credentials_from_db, needs_password_change, update_passwor def get_authenticator(): with open("config/auth.yaml", "r", encoding="utf-8") as f: base_config = yaml.load(f, Loader=SafeLoader) + db_creds = load_credentials_from_db() base_config["credentials"] = db_creds diff --git a/app/data/__init__.py b/app/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/data/db.py b/app/data/db.py new file mode 100644 index 0000000..330dad0 --- /dev/null +++ b/app/data/db.py @@ -0,0 +1,36 @@ +from sqlalchemy import create_engine, Text +import pandas as pd +from dotenv import load_dotenv +from pathlib import Path +from urllib.parse import quote +import os +import logging + + +env_path = Path("config/settings.env") +load_dotenv(env_path) + +oracle_conn_str = os.getenv("oracle_conn_str") +co_dw_conn_str = os.getenv("co_dw_conn_str") +co_daten_conn_str = os.getenv("co_daten_conn_str") + +def get_conn(db): + match db: + case "oracle": + engine = create_engine(oracle_conn_str) + case "co_dw": + engine = create_engine(co_dw_conn_str) + case "co_daten": + engine = create_engine(co_dw_conn_str) + case _: + logging.info(f"Datenbank {db} konnte nicht gefunden werden") + return engine + +# def get_data(db): +# engine = get_conn(db) +# with engine.connect() as conn: +# print(engine) +# return + +# if __name__ == "__main__": +# get_data("co_daten") \ No newline at end of file diff --git a/app/data/scriptloader.py b/app/data/scriptloader.py new file mode 100644 index 0000000..6ff9b5b --- /dev/null +++ b/app/data/scriptloader.py @@ -0,0 +1,10 @@ +from pathlib import Path + +def get_sql(filename): + sql_query = Path(f"app/data/sql/{filename}.sql").read_text() + return sql_query + + + +if __name__ == "__main__": + print(get_sql("sales_umsatz")) diff --git a/app/data/sql/co_kostenobjekte.sql b/app/data/sql/co_kostenobjekte.sql new file mode 100644 index 0000000..72ace99 --- /dev/null +++ b/app/data/sql/co_kostenobjekte.sql @@ -0,0 +1 @@ +select * from bi.Dim_Kostenobjekt \ No newline at end of file diff --git a/app/data/sql/sales_umsatz.sql b/app/data/sql/sales_umsatz.sql new file mode 100644 index 0000000..78e88b9 --- /dev/null +++ b/app/data/sql/sales_umsatz.sql @@ -0,0 +1 @@ +select * from umsatz \ No newline at end of file diff --git a/app/main.py b/app/main.py index 0e8efcd..ab63be8 100644 --- a/app/main.py +++ b/app/main.py @@ -1,7 +1,16 @@ import streamlit as st +import logging +from logging_config import setup_logging from version import __version__ from auth_runtime import require_login from ui.sidebar import build_sidebar +import os + +APP_ENV = os.environ.get("APP_ENV", "dev") + +logger = setup_logging(APP_ENV) +#logger.info(f"Starting migration - APP-Version {__version__}") +logger = logging.getLogger(__name__) def main(): st.set_page_config( diff --git a/app/migrate.py b/app/migrate.py index f681fc2..1a7156d 100644 --- a/app/migrate.py +++ b/app/migrate.py @@ -10,18 +10,17 @@ from auth import create_user APP_ENV = os.environ.get("APP_ENV", "dev") logger = setup_logging(APP_ENV) - logger.info(f"Starting migration - APP-Version {__version__}") - logger = logging.getLogger(__name__) BASE_DIR = Path(__file__).resolve().parents[1] -DB_DIR = BASE_DIR / "data" +DB_DIR = BASE_DIR / "app" / "app_db" DB_PATH = DB_DIR / "app.db" MIGRATIONS_DIR = BASE_DIR / "migrations" ADMIN_USERNAME = "admin" +print(BASE_DIR) def get_connection() -> sqlite3.Connection: DB_DIR.mkdir(exist_ok=True) @@ -91,6 +90,11 @@ def admin_exists() -> bool: "SELECT 1 FROM users WHERE username = ?", (ADMIN_USERNAME,), ).fetchone() + if row is not None: + print(row[0]) + else: + print(ADMIN_USERNAME) + print("Kein Admin gefunden") return row is not None @@ -111,9 +115,9 @@ def create_admin_user(): ok = create_user( username=ADMIN_USERNAME, password=pw1, - role="admin", + role_id=1, email="admin@co_app", - firstname="co_app", + firstname="***", lastname="admin" ) diff --git a/app/pages/__init__.py b/app/pages/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/pages/costobjects.py b/app/pages/costobjects.py new file mode 100644 index 0000000..12c7ea5 --- /dev/null +++ b/app/pages/costobjects.py @@ -0,0 +1,24 @@ +import streamlit as st +import pandas as pd +from data.scriptloader import get_sql +from data.db import get_conn + + + +def load_data(): + sql = get_sql("co_kostenobjekte") + print(sql) + engine = get_conn("co_dw") + with engine.connect() as conn: + df = pd.read_sql(sql, engine) + print(df) + return df + +st.dataframe(load_data()) + + + + +if __name__ == "__main__": + df = load_data() + print(df) \ No newline at end of file diff --git a/app/pages/user.py b/app/pages/user.py index 104caa5..0dd9ae1 100644 --- a/app/pages/user.py +++ b/app/pages/user.py @@ -1,7 +1,7 @@ import streamlit as st from auth_runtime import require_login -from ui.sidebar import build_sidebar, hide_sidebar_if_logged_out -from auth import get_fullname_for_user, create_user +from ui.sidebar import hide_sidebar_if_logged_out +from auth import create_user hide_sidebar_if_logged_out() diff --git a/app/ui/sidebar.py b/app/ui/sidebar.py index 92b09fa..8362646 100644 --- a/app/ui/sidebar.py +++ b/app/ui/sidebar.py @@ -1,8 +1,8 @@ from contextlib import closing import streamlit as st from auth import get_fullname_for_user, get_role_for_user -from db import get_conn, get_list -import sqlite3 +from app_db.app_db import get_conn, get_list +# import sqlite3 def build_sidebar(): diff --git a/config/settings.env b/config/settings.env index e69de29..8be8af2 100644 --- a/config/settings.env +++ b/config/settings.env @@ -0,0 +1,10 @@ +# Databases + +# Oracle +oracle_conn_str=oracle+oracledb://sp84p:data@ora:1522/?service_name=prod84 + +# gmn-conn\co_dw +co_dw_conn_str = mssql+pyodbc://co_app:JRHmi1KLwjgnF6@gmn-cont\controlling/co_dw?driver=ODBC+Driver+18+for+SQL+Server&TrustServerCertificate=yes + +# gmn-conn\co_daten +co_daten_conn_str = mssql+pyodbc://dw_user:Schneewittchen%4089887%%21@gmn-cont\controlling/co_daten?driver=ODBC+Driver+18+for+SQL+Server&TrustServerCertificate=yes \ No newline at end of file