| import sys | |
| import os | |
| sys.path.append(os.path.dirname(os.path.abspath(__file__))) | |
| import streamlit as st | |
| import pandas as pd | |
| from utils.load_data import load_logs | |
| from utils.visualize import plot_usage | |
| from utils.report import generate_pdf | |
| from models.anomaly import detect_anomalies | |
| from utils.amc import upcoming_amc_devices | |
| st.set_page_config(page_title="LabOps Dashboard", layout="wide") | |
| st.title("π Multi-Device LabOps Dashboard") | |
| uploaded_files = st.file_uploader("Upload Device Logs (CSV)", accept_multiple_files=True) | |
| if uploaded_files: | |
| df = load_logs(uploaded_files) | |
| st.subheader("π Uploaded Logs") | |
| st.dataframe(df.head()) | |
| st.subheader("π Daily Usage Chart") | |
| st.pyplot(plot_usage(df)) | |
| st.subheader("π¨ Detected Anomalies") | |
| try: | |
| anomalies = detect_anomalies(df) | |
| st.dataframe(anomalies) | |
| except Exception as e: | |
| st.error(f"Failed to compute anomalies: {e}") | |
| st.subheader("π Upcoming AMC Devices") | |
| if "amc_expiry" in df.columns: | |
| try: | |
| amc_df = upcoming_amc_devices(df) | |
| st.dataframe(amc_df) | |
| except Exception as e: | |
| st.error(f"Failed to process AMC dates: {e}") | |
| else: | |
| st.info("Column `amc_expiry` not found in uploaded data.") | |
| if st.button("π Generate PDF Report"): | |
| try: | |
| generate_pdf(df) | |
| st.success("β PDF report generated and saved to /tmp/labops_report.pdf") | |
| except Exception as e: | |
| st.error(f"Failed to generate PDF: {e}") | |