From 6d040c0040d0495d57bbe46d1af6916fe36b102b Mon Sep 17 00:00:00 2001 From: "sebastian.serfling" Date: Wed, 2 Apr 2025 13:33:32 +0000 Subject: [PATCH] many changes --- .gitignore | 3 + app.py | 161 +++++++---- .../ticket_export/exports/RE2025.00012.1.docx | Bin 38776 -> 39281 bytes .../ticket_export/exports/RE2025.00014.1.docx | Bin 38774 -> 39539 bytes apps/ticket_export/main.py | 8 +- apps/ticket_export/template.docx | Bin 42664 -> 42638 bytes sites/__pycache__/lastrun.cpython-39.pyc | Bin 2536 -> 2528 bytes .../services_reporting.cpython-39.pyc | Bin 10345 -> 7466 bytes sites/lastrun.py | 6 +- sites/services_reporting.py | 263 +++++++----------- 10 files changed, 213 insertions(+), 228 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..deedd2b --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +apps/ticket_export/exports/RE2025.00012.1.docx +apps/ticket_export/exports/RE2025.00013.1.docx +apps/ticket_export/exports/RE2025.00014.1.docx diff --git a/app.py b/app.py index c126d8b..1d3e03f 100644 --- a/app.py +++ b/app.py @@ -1,5 +1,6 @@ import streamlit as st from streamlit_option_menu import option_menu +from sqlalchemy import create_engine import sites.services_reporting as sr import sites.userlist as us import sites.server as s @@ -16,6 +17,8 @@ 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) +start_date_lastmonth = datetime.today().replace(day=1) - relativedelta(months=2) +end_date_lastmonth = datetime.today().replace(day=1) - relativedelta(months=1) - relativedelta(days=1) # Datumsformatierung start_date_format = start_date.strftime("%Y-%m-%d") @@ -26,7 +29,7 @@ def load_css(file_name): with open(file_name) as f: st.markdown(f'', unsafe_allow_html=True) -def get_customer_used_service(): +def get_customer_used_service(end_date): mydb = mysql.connector.connect( host=os.getenv("MYSQL_HOST"), user=os.getenv("MYSQL_USER"), @@ -36,89 +39,129 @@ def get_customer_used_service(): 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 """) + mycursor.execute(f"""SELECT cs.companyname, cs.customer_ID, cs.services_ID,cs.name from Kunden.`daily.customer.services` cs WHERE add_date LIKE '%{end_date}%'""") 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") +def load_server_list(start_date, end_date): + db_url = ( + f"mysql+mysqlconnector://{os.getenv('MYSQL_USER')}:" + f"{os.getenv('MYSQL_PASSWORD')}@{os.getenv('MYSQL_HOST')}/" + f"{os.getenv('MYSQL_DATABASE')}" ) + engine = create_engine(db_url) + query = f""" + SELECT server, cores, customer_id + FROM Kunden.`daily.spla.server` sr + WHERE sr.timestamp BETWEEN '{start_date}' AND '{end_date}' + """ + max_server_count = pd.read_sql_query(query, engine) + return max_server_count + + +def load_user_service_list(service_id, customer_id, start_date, end_date): + db_url = ( + f"mysql+mysqlconnector://{os.getenv('MYSQL_USER')}:" + f"{os.getenv('MYSQL_PASSWORD')}@{os.getenv('MYSQL_HOST')}/" + f"{os.getenv('MYSQL_DATABASE')}" + ) + engine = create_engine(db_url) 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; - + SELECT COUNT(*) AS max_count + FROM ( + SELECT username + FROM Kunden.`daily.user.enabled` sr + WHERE sr.customer_ID = {customer_id} + AND sr.services_ID = {service_id} + AND sr.timestamp BETWEEN '{start_date_format}' AND '{end_date_format}' + ) AS sub; """ - max_user_count = pd.read_sql_query(query, mydb) - mydb.close() + max_user_count = pd.read_sql_query(query, engine) return max_user_count.iloc[0]['max_count'] if not max_user_count.empty else 0 +def load_user_disabled(start_date, end_date,customer_id): + db_url = ( + f"mysql+mysqlconnector://{os.getenv('MYSQL_USER')}:" + f"{os.getenv('MYSQL_PASSWORD')}@{os.getenv('MYSQL_HOST')}/" + f"{os.getenv('MYSQL_DATABASE')}" + ) + engine = create_engine(db_url) + + query = f""" + SELECT disabledate, username, service_name, customer_name, ticketnumber, comment + FROM Kunden.`daily.user.disabled` sud + WHERE sud.disabledate BETWEEN '{start_date}' AND '{end_date}' AND customer_id = '{customer_id}' AND services_id IN (100,101,116,120) ORDER BY service_name + """ + all = pd.read_sql_query(query, engine) + return all + def home(): st.title("Dashboard") edit_start_date = start_date.strftime("%d.%m.%Y") edit_end_date = end_date.strftime("%d.%m.%Y") + edit_start_date_lastmonth = start_date_lastmonth.strftime("%d.%m.%Y") + edit_end_date_lastmonth = end_date_lastmonth.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(): + print(end_date) + for i in get_customer_used_service(end_date.strftime("%Y-%m-%d")): + print(i) if previous_value != i[1]: st.subheader(f"{i[0]}") - columns = st.columns(3) + columns = st.columns(4) + df = load_user_disabled(start_date_lastmonth, end_date_lastmonth, i[1]) + + if not df.empty: + st.text(f"Deaktivierte User {edit_start_date_lastmonth} - {edit_end_date_lastmonth}") + st.data_editor(df,use_container_width=True) c = 0 - if not (load_user_service_list(i[2], i[1], start_date, end_date)): + + active_users = load_user_service_list(i[2], i[1], start_date, end_date) + + # Filter nach dem spezifischen Service und zähle die eindeutigen Benutzernamen + disabled_users_count = 0 + if not df.empty and 'service_name' in df.columns and 'username' in df.columns: + # Annahme: i[3] enthält den Service-Namen, der mit der 'service_name'-Spalte übereinstimmt + service_filtered_df = df[df['service_name'] == i[3]] + disabled_users_count = service_filtered_df['username'].nunique() + + if not active_users: 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] + columns[c].metric( + label=f"Aktive {i[3]} User", + value=active_users, + delta=f"-{disabled_users_count}" if disabled_users_count > 0 else None, + delta_color="inverse" + ) + c += 1 + previous_value = i[1] + col1, = st.columns(1) + df = load_server_list(start_date,end_date) + grouped = df.groupby('server')['cores'].count()*8/2 + grouped_series = df.groupby('server')['cores'].max() + grouped_str = grouped_series.to_string(header=False) + df['cores'] = pd.to_numeric(df['cores'], errors='coerce') + server_cores = df.groupby('server')['cores'].max() + count_cores = server_cores.count() + with col1: + st.header("CPU Liste") + st.text( + f"Anzahl der Cores:\n{grouped_str}\n " + ) + st.text(f"Gesamte Anzahl der Cores: {count_cores}") + st.text(f"Berechung der Core-Pakete = Anzahl der Cores ({count_cores}) * Core-Pakete aus SPLA (8) / 2") + st.header(f"Gesamt : {str(grouped.sum()).split('.')[0]} Pakete") + + # Ausgabe der Ergebnisse + # Navigation bar using streamlit-option-menu with st.sidebar: selected_page = option_menu( diff --git a/apps/ticket_export/exports/RE2025.00012.1.docx b/apps/ticket_export/exports/RE2025.00012.1.docx index eb19088e5d9e89d1b57225e599c9f8c34ba3f2b9..dc2a44b575c2a2133eb6872e545582f6b5997893 100644 GIT binary patch delta 11433 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 CF@H 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 diff --git a/apps/ticket_export/exports/RE2025.00014.1.docx b/apps/ticket_export/exports/RE2025.00014.1.docx index d81fbb896e5671dbfe8bdef262d32e74ed1edefd..c85937c1d9dc00cac91dfc857698c0da5eca9653 100644 GIT binary patch delta 11628 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 delta 10685 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 RL5P3WTJ{Z=uIOLa{{cvH`49jA delta 11030 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 Xm5hRakc(@Of>WddiiXX)OqJ!W=xxib#& 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 diff --git a/sites/lastrun.py b/sites/lastrun.py index 354f646..b2dba1d 100644 --- a/sites/lastrun.py +++ b/sites/lastrun.py @@ -16,14 +16,14 @@ def get_filtered_users(customer_id, service_id): database=os.getenv("MYSQL_DATABASE") ) - query = f"""SELECT * FROM Kunden.`services.reporting` where DATE(reportingdate) = CURDATE() """ + query = f"""SELECT * FROM Kunden.`daily.user.online` where DATE(timestamp) = CURDATE() """ if customer_id: query += f"AND customer_ID = {customer_id}" if service_id: - query += f" AND service_ID = {service_id}" - query += " ORDER BY reportingdate DESC" + query += f" AND services_id = {service_id}" + query += " ORDER BY timestamp DESC" users = pd.read_sql_query(query, mydb) print(query) mydb.close() diff --git a/sites/services_reporting.py b/sites/services_reporting.py index 094762c..b0d99f7 100644 --- a/sites/services_reporting.py +++ b/sites/services_reporting.py @@ -1,7 +1,8 @@ import streamlit as st import pandas as pd import mysql.connector -from datetime import datetime, date +from datetime import datetime, date, timedelta +from sqlalchemy import create_engine import os from dotenv import load_dotenv import altair as alt @@ -12,91 +13,71 @@ def get_filtered_data(customer_id, service_id, start_date, end_date): """ Fetches the user count data grouped by month within the specified date range. """ - mydb = mysql.connector.connect( - host=os.getenv("MYSQL_HOST"), - user=os.getenv("MYSQL_USER"), - password=os.getenv("MYSQL_PASSWORD"), - database=os.getenv("MYSQL_DATABASE") + db_url = ( + f"mysql+mysqlconnector://{os.getenv('MYSQL_USER')}:" + f"{os.getenv('MYSQL_PASSWORD')}@{os.getenv('MYSQL_HOST')}/" + f"{os.getenv('MYSQL_DATABASE')}" ) + engine = create_engine(db_url) query = f""" - SELECT DATE_FORMAT(sr.reportingdate, '%Y-%m') AS day, - COUNT(DISTINCT sr.username) as count - FROM Kunden.`services.reporting` sr - JOIN Kunden.services s ON sr.service_ID = s.service_ID - WHERE sr.customer_ID = {customer_id} - AND sr.service_ID = {service_id} - AND sr.username NOT LIKE '%admin%' - AND sr.username NOT LIKE '%test%' - AND sr.reportingdate BETWEEN '{start_date}' AND '{end_date}' - GROUP BY DATE_FORMAT(sr.reportingdate, '%Y-%m') - ORDER BY DATE_FORMAT(sr.reportingdate, '%Y-%m'); + SELECT DATE_FORMAT(add_date, '%Y-%m') AS day, + count as count + FROM Kunden.`daily.users.count_by_services` + WHERE customer_ID = {customer_id} + AND services_ID = {service_id} + AND add_date BETWEEN '{start_date}' AND '{end_date}' + ORDER BY DATE_FORMAT(add_date, '%Y-%m'); """ - - service_reporting = pd.read_sql_query(query, mydb) - mydb.close() + service_reporting = pd.read_sql_query(query, engine) + #engine.close() return service_reporting def get_user_online(customer_id,service_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") + db_url = ( + f"mysql+mysqlconnector://{os.getenv('MYSQL_USER')}:" + f"{os.getenv('MYSQL_PASSWORD')}@{os.getenv('MYSQL_HOST')}/" + f"{os.getenv('MYSQL_DATABASE')}" ) + engine = create_engine(db_url) if service_id == 100: - user_info = "u.primarymail as username" + user_info = "sr.primarymail" else: - user_info = "u.username" + user_info = "sr.username" query = f""" - SELECT DATE_FORMAT(sr.reportingdate, '%Y-%m') AS day, - sr.username - FROM Kunden.`services.reporting` sr - JOIN Kunden.services s ON sr.service_ID = s.service_ID + SELECT + {user_info} as username + FROM Kunden.`daily.user.online` sr WHERE sr.customer_ID = {customer_id} - AND sr.service_ID = {service_id} - AND sr.username NOT LIKE '%admin%' - AND sr.username NOT LIKE '%test%' - AND sr.reportingdate BETWEEN '{start_date}' AND '{end_date}' - GROUP BY day, sr.username - ORDER BY sr.username; + AND sr.services_ID = {service_id} + AND sr.timestamp BETWEEN '{start_date}' AND '{end_date}' + GROUP BY {user_info} + ORDER BY {user_info}; """ - - user_online = pd.read_sql_query(query, mydb) + user_online = pd.read_sql_query(query, engine) user_online_count= user_online.shape[0] - mydb.close() + #mydb.close() return user_online, user_online_count def get_max_user_count(customer_id, service_id, start_date, end_date): """ Fetches the maximum user count within the specified date range. """ - mydb = mysql.connector.connect( - host=os.getenv("MYSQL_HOST"), - user=os.getenv("MYSQL_USER"), - password=os.getenv("MYSQL_PASSWORD"), - database=os.getenv("MYSQL_DATABASE") + db_url = ( + f"mysql+mysqlconnector://{os.getenv('MYSQL_USER')}:" + f"{os.getenv('MYSQL_PASSWORD')}@{os.getenv('MYSQL_HOST')}/" + f"{os.getenv('MYSQL_DATABASE')}" ) - + engine = create_engine(db_url) + user_info = "sr.username" query = f""" - SELECT MAX(user_counts.count) as max_count - FROM ( - SELECT DATE_FORMAT(sr.reportingdate, '%Y-%m') AS day, - COUNT(DISTINCT sr.username) as count - FROM Kunden.`services.reporting` sr - JOIN Kunden.services s ON sr.service_ID = s.service_ID - WHERE sr.customer_ID = {customer_id} - AND sr.service_ID = {service_id} - AND sr.username NOT LIKE '%admin%' - AND sr.username NOT LIKE '%test%' - AND sr.reportingdate BETWEEN '{start_date}' AND '{end_date}' - GROUP BY DATE_FORMAT(sr.reportingdate, '%Y-%m') - ) as user_counts; - """ + SELECT MAX(username) as max_count + FROM Kunden.`daily.user.enabled` WHERE customer_ID = {customer_id} AND services_ID = {service_id} AND timestamp BETWEEN '{start_date}' AND '{end_date}' + """ - max_user_count = pd.read_sql_query(query, mydb) - mydb.close() + max_user_count = pd.read_sql_query(query, engine) + #mydb.close() return max_user_count.iloc[0]['max_count'] if not max_user_count.empty else 0 def get_active_users(customer_id, service_id, start_date, end_date): @@ -104,104 +85,61 @@ def get_active_users(customer_id, service_id, start_date, end_date): Fetch all active users for the given customer, service, and date range based on the most recent activity and status. """ - mydb = mysql.connector.connect( - host=os.getenv("MYSQL_HOST"), - user=os.getenv("MYSQL_USER"), - password=os.getenv("MYSQL_PASSWORD"), - database=os.getenv("MYSQL_DATABASE") + db_url = ( + f"mysql+mysqlconnector://{os.getenv('MYSQL_USER')}:" + f"{os.getenv('MYSQL_PASSWORD')}@{os.getenv('MYSQL_HOST')}/" + f"{os.getenv('MYSQL_DATABASE')}" ) + engine = create_engine(db_url) if service_id == 100: - user_info = "u.primarymail as username" + user_info = "sr.primarymail" else: - user_info = "u.username" + user_info = "sr.username" query = f""" SELECT - {user_info} - 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 - GROUP BY u.user_id, u.username, active_users.last_active_timestamp, active_users.status ORDER by u.username ASC; + {user_info} as username + FROM Kunden.`daily.user.enabled` sr + WHERE sr.customer_ID = {customer_id} + AND sr.services_ID = {service_id} + AND sr.timestamp = '{start_date}' + ORDER BY {user_info}; """ - active_users = pd.read_sql_query(query, mydb) + active_users = pd.read_sql_query(query, engine) user_active_count = active_users.shape[0] - mydb.close() return active_users, user_active_count def get_user_not_online(customer_id,service_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") + db_url = ( + f"mysql+mysqlconnector://{os.getenv('MYSQL_USER')}:" + f"{os.getenv('MYSQL_PASSWORD')}@{os.getenv('MYSQL_HOST')}/" + f"{os.getenv('MYSQL_DATABASE')}" ) - + engine = create_engine(db_url) + if service_id == 100: + user_info = "primarymail" + else: + user_info = "username" query = f""" - SELECT u.username, ss.service_ID - FROM Kunden.users u - JOIN Kunden.`users.services` ss ON ss.user_ID = u.user_ID - JOIN ( - SELECT user_id, - MAX(CASE WHEN status = 1 THEN timestamp END) AS latest_active_timestamp, - MAX(CASE WHEN status = 0 THEN timestamp END) AS latest_inactive_timestamp - FROM Kunden.`users.status` - GROUP BY user_id - ) us ON u.user_ID = us.user_id - WHERE ss.service_ID = {service_id} - AND ( - (us.latest_active_timestamp IS NOT NULL AND - (us.latest_inactive_timestamp IS NULL OR us.latest_active_timestamp > us.latest_inactive_timestamp)) - OR us.latest_inactive_timestamp IS NULL - ) - AND u.username NOT IN ( - SELECT sr.username - FROM Kunden.`services.reporting` sr - WHERE sr.service_ID = {service_id} - AND sr.reportingdate BETWEEN '{start_date}' AND '{end_date}' - ) - AND u.user_ID != 95 - AND u.user_ID != 102 - AND u.customer_ID = {customer_id} - AND u.username NOT LIKE "%ad-test-user%" + SELECT + {user_info} as username + FROM Kunden.`daily.user.notonline` sr + WHERE sr.customer_ID = {customer_id} + AND sr.services_ID = {service_id} + AND sr.timestamp BETWEEN '{start_date}' AND '{end_date}' + GROUP BY {user_info} + ORDER BY {user_info}; """ - - not_active_users = pd.read_sql_query(query, mydb) + not_active_users = pd.read_sql_query(query, engine) user_not_online_count = not_active_users.shape[0] - mydb.close() return not_active_users, user_not_online_count def get_initial_data(): - mydb = mysql.connector.connect( - host=os.getenv("MYSQL_HOST"), - user=os.getenv("MYSQL_USER"), - password=os.getenv("MYSQL_PASSWORD"), - database=os.getenv("MYSQL_DATABASE") + db_url = ( + f"mysql+mysqlconnector://{os.getenv('MYSQL_USER')}:" + f"{os.getenv('MYSQL_PASSWORD')}@{os.getenv('MYSQL_HOST')}/" + f"{os.getenv('MYSQL_DATABASE')}" ) + engine = create_engine(db_url) # Fetch unique service IDs and names service_id_query = """ @@ -209,7 +147,7 @@ def get_initial_data(): FROM Kunden.`services.reporting` sr JOIN Kunden.services s ON sr.service_ID = s.service_ID """ - service_ids = pd.read_sql_query(service_id_query, mydb) + service_ids = pd.read_sql_query(service_id_query, engine) # Fetch customer information customer_query = """ @@ -219,15 +157,14 @@ def get_initial_data(): JOIN Kunden.`services.reporting`sr ON sr.customer_ID = co.customer_ID GROUP BY c.customer_ID, c.customer, co.companyname; """ - customers = pd.read_sql_query(customer_query, mydb) + customers = pd.read_sql_query(customer_query, engine) # Fetch date range date_query = """ SELECT MIN(reportingdate) AS min_date, MAX(reportingdate) AS max_date FROM Kunden.`services.reporting` """ - date_range = pd.read_sql_query(date_query, mydb) - mydb.close() + date_range = pd.read_sql_query(date_query, engine) return service_ids, customers, date_range @@ -261,16 +198,16 @@ def services_reporting(): min_date = initial_date_range['min_date'][0] max_date = initial_date_range['max_date'][0] - # Date input for start and end date + min_date = (date.today().replace(day=1) - timedelta(days=1)).replace(day=1) start_date = st.date_input('Start Date', min_date) - end_date = st.date_input('End Date', max_date) + end_date = st.date_input('End Date', initial_date_range['max_date'][0]) if st.button('Apply Filters'): # Fetch filtered data from the database filtered_data = get_filtered_data(selected_customer_id, selected_service_id, start_date, end_date) # Fetch max user count in the selected range - max_count = get_max_user_count(selected_customer_id, selected_service_id, start_date, end_date) + max_count = get_active_users(selected_customer_id, selected_service_id, start_date, end_date) # Sort the data by day filtered_data = filtered_data.sort_values('day') @@ -297,31 +234,33 @@ def services_reporting(): # Combine bars and text into a single chart chart = (bars + text).properties( - title='Daily Service Usage with Highlighted Maximum' + title='User Enabled' ) # Fetch the data for users not online, online, and active users not_user_online, max_count_user_not_online = get_user_not_online(selected_customer_id, selected_service_id, start_date, end_date) user_online, user_online_count = get_user_online(selected_customer_id, selected_service_id, start_date, end_date) - active_users_data, user_active_count = get_active_users(selected_customer_id, selected_service_id, start_date, end_date) + active_users_data, user_active_count = get_active_users(selected_customer_id, selected_service_id, min_date, end_date) # Create three columns for each DataFrame col1, col2, col3, col4, col5 = st.columns([2,2,2,2,2]) # Display each DataFrame in a separate column - with col4: - st.subheader(f"{selected_service.split(' - ')[1]} - User not Online") - st.metric(label="1",label_visibility="hidden", value=max_count_user_not_online) - st.data_editor(not_user_online['username'],use_container_width=True, hide_index=True) - + # with col4: + # st.subheader(f"{selected_service.split(' - ')[1]} - User not Online") + # st.metric(label="1",label_visibility="hidden", value=max_count_user_not_online) + # st.data_editor(not_user_online['username'],key="2",use_container_width=True, hide_index=True) + with col2: - st.subheader(f"{selected_service.split(' - ')[1]} - User Online") - st.metric(label="1",label_visibility="hidden", value=user_online_count) - st.data_editor(user_online['username'],use_container_width=True, hide_index=True) + st.subheader(f"{selected_service.split(' - ')[1]} - Enabled Users") + st.metric(label="1",label_visibility="hidden", value=user_active_count) + st.data_editor(active_users_data, hide_index=True) with col3: - st.subheader(f"{selected_service.split(' - ')[1]} - Active Users") - st.metric(label="1",label_visibility="hidden", value=user_active_count) - st.data_editor(active_users_data['username'],key=active_users_data,use_container_width=True, hide_index=True) + st.subheader(f"{selected_service.split(' - ')[1]} - User Online") + st.metric(label="1",label_visibility="hidden", value=user_online_count) + st.data_editor(user_online,key=2,hide_index=True) + + st.altair_chart(chart, use_container_width=True) else: