import streamlit as st from streamlit_option_menu import option_menu import sites.services_reporting as sr import sites.userlist as us import sites.server as s import sites.tickets as ti import sites.lastrun as lr from datetime import datetime from dateutil.relativedelta import relativedelta import mysql.connector import pandas as pd import os # Page Settings st.set_page_config(page_title="Reporting", layout="wide") start_date = datetime.today().replace(day=1) - relativedelta(months=1) end_date = datetime.today().replace(day=1) - relativedelta(days=1) # Datumsformatierung start_date_format = start_date.strftime("%Y-%m-%d") end_date_format = end_date.strftime("%Y-%m-%d") # Load custom CSS def load_css(file_name): with open(file_name) as f: st.markdown(f'', unsafe_allow_html=True) def get_customer_used_service(): mydb = mysql.connector.connect( host=os.getenv("MYSQL_HOST"), user=os.getenv("MYSQL_USER"), password=os.getenv("MYSQL_PASSWORD"), database=os.getenv("MYSQL_DATABASE") ) mycursor = mydb.cursor() mycursor.execute(f"""SELECT c.companyname, c.customer_ID, cs.services_ID,s.name from Kunden.`customers.services` cs JOIN Kunden.company c ON c.customer_ID = cs.customer_ID JOIN Kunden.services s ON s.service_ID = cs.services_ID where 1=1 GROUP by c.companyname , c.customer_ID, cs.services_ID, s.name """) myresult = mycursor.fetchall() mydb.close() return myresult def load_user_service_list(service_id, customer_id, start_date, end_date): mydb = mysql.connector.connect( host=os.getenv("MYSQL_HOST"), user=os.getenv("MYSQL_USER"), password=os.getenv("MYSQL_PASSWORD"), database=os.getenv("MYSQL_DATABASE") ) query = f""" SELECT COUNT(*) AS max_count FROM ( SELECT u.user_id, u.username, active_users.last_active_timestamp, active_users.status FROM Kunden.`users` u JOIN ( SELECT us.user_id, us.`timestamp` AS last_active_timestamp, us.status FROM Kunden.`users.services` us JOIN ( SELECT user_id, MAX(`timestamp`) AS last_active_timestamp FROM Kunden.`users.services` WHERE `timestamp` <= '{end_date}' AND customer_id = {customer_id} AND service_ID = {service_id} AND user_id NOT IN ( SELECT user_id FROM Kunden.`users.status` WHERE status = 0 AND `timestamp` < '{start_date}' AND customer_id = {customer_id} ) GROUP BY user_id ) max_timestamps ON us.user_id = max_timestamps.user_id AND us.`timestamp` = max_timestamps.last_active_timestamp WHERE us.customer_id = {customer_id} AND us.service_ID = {service_id} AND us.status = 1 ) active_users ON u.user_id = active_users.user_id ) AS max_count; """ max_user_count = pd.read_sql_query(query, mydb) mydb.close() return max_user_count.iloc[0]['max_count'] if not max_user_count.empty else 0 def home(): st.title("Dashboard") edit_start_date = start_date.strftime("%d.%m.%Y") edit_end_date = end_date.strftime("%d.%m.%Y") st.subheader(f"Übersicht {edit_start_date} - {edit_end_date}") previous_value = None columns = None c = 0 for i in get_customer_used_service(): if previous_value != i[1]: st.subheader(f"{i[0]}") columns = st.columns(3) c = 0 if not (load_user_service_list(i[2], i[1], start_date, end_date)): st.info(f"Kunde {i[0]} - Service {i[3]} - Not Data found!") else: columns[c].metric(label=f"Aktive {i[3]} User", value=load_user_service_list(i[2], i[1], start_date, end_date)) c +=1 previous_value = i[1] # Navigation bar using streamlit-option-menu with st.sidebar: selected_page = option_menu( menu_title="Navigation", # required options=["Dashboard", "Services Reporting", "User Filter", "Server", "Tickets", "Last-Run"], # required icons=["house", "bar-chart", "filter", "server", "ticket", "clock"], # optional menu_icon="cast", # optional default_index=0, # optional orientation="vertikal", # horizontal navigation ) # Page display logic based on selected option if selected_page == "Dashboard": home() elif selected_page == "Services Reporting": sr.services_reporting() elif selected_page == "User Filter": us.user_filter() elif selected_page == "Server": s.server_filter() elif selected_page == "Tickets": ti.ticket_filter() elif selected_page == "Last-Run": lr.user_filter()