146 lines
5.1 KiB
Python
146 lines
5.1 KiB
Python
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'<style>{f.read()}</style>', 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()
|