Update app.py
Browse files
app.py
CHANGED
|
@@ -14,13 +14,16 @@ logger = logging.getLogger(__name__)
|
|
| 14 |
|
| 15 |
def process_files(*uploaded_files):
|
| 16 |
"""Process uploaded CSV files and generate dashboard outputs."""
|
| 17 |
-
logger.info(f"Received {len(uploaded_files)} uploaded files
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
| 20 |
|
| 21 |
try:
|
| 22 |
# Load data
|
| 23 |
-
df = load_logs(
|
| 24 |
logger.info(f"Loaded {len(df)} log records from uploaded files.")
|
| 25 |
|
| 26 |
# Log table
|
|
@@ -48,16 +51,17 @@ def process_files(*uploaded_files):
|
|
| 48 |
return f"Error: {e}", None, None, None, None
|
| 49 |
|
| 50 |
def generate_pdf_report(df):
|
| 51 |
-
"""Generate and return path to PDF report."""
|
| 52 |
if df is None:
|
| 53 |
-
|
|
|
|
| 54 |
logger.info("Generating PDF report...")
|
| 55 |
try:
|
| 56 |
pdf_path = generate_pdf(df)
|
| 57 |
-
return pdf_path
|
| 58 |
except Exception as e:
|
| 59 |
logger.error(f"Failed to generate PDF: {e}")
|
| 60 |
-
return f"Error generating PDF: {e}"
|
| 61 |
|
| 62 |
with gr.Blocks(title="Multi-Device LabOps Dashboard") as demo:
|
| 63 |
gr.Markdown("# π Multi-Device LabOps Dashboard")
|
|
@@ -87,6 +91,7 @@ with gr.Blocks(title="Multi-Device LabOps Dashboard") as demo:
|
|
| 87 |
with gr.Row():
|
| 88 |
pdf_btn = gr.Button("π Generate PDF Report")
|
| 89 |
pdf_output = gr.File(label="Download PDF Report")
|
|
|
|
| 90 |
|
| 91 |
# State to store dataframe
|
| 92 |
df_state = gr.State()
|
|
@@ -101,7 +106,7 @@ with gr.Blocks(title="Multi-Device LabOps Dashboard") as demo:
|
|
| 101 |
pdf_btn.click(
|
| 102 |
fn=generate_pdf_report,
|
| 103 |
inputs=[df_state],
|
| 104 |
-
outputs=[pdf_output]
|
| 105 |
)
|
| 106 |
|
| 107 |
if __name__ == "__main__":
|
|
|
|
| 14 |
|
| 15 |
def process_files(*uploaded_files):
|
| 16 |
"""Process uploaded CSV files and generate dashboard outputs."""
|
| 17 |
+
logger.info(f"Received {len(uploaded_files)} uploaded files: {uploaded_files}")
|
| 18 |
+
# Filter out None values and ensure we have valid files
|
| 19 |
+
valid_files = [f for f in uploaded_files if f is not None]
|
| 20 |
+
if not valid_files:
|
| 21 |
+
logger.warning("No valid files uploaded.")
|
| 22 |
+
return "Please upload at least one valid CSV file.", None, None, None, None
|
| 23 |
|
| 24 |
try:
|
| 25 |
# Load data
|
| 26 |
+
df = load_logs(valid_files)
|
| 27 |
logger.info(f"Loaded {len(df)} log records from uploaded files.")
|
| 28 |
|
| 29 |
# Log table
|
|
|
|
| 51 |
return f"Error: {e}", None, None, None, None
|
| 52 |
|
| 53 |
def generate_pdf_report(df):
|
| 54 |
+
"""Generate and return path to PDF report, with error message if applicable."""
|
| 55 |
if df is None:
|
| 56 |
+
logger.warning("No data available for PDF generation.")
|
| 57 |
+
return None, "Please upload CSV files first."
|
| 58 |
logger.info("Generating PDF report...")
|
| 59 |
try:
|
| 60 |
pdf_path = generate_pdf(df)
|
| 61 |
+
return pdf_path, "PDF generated successfully."
|
| 62 |
except Exception as e:
|
| 63 |
logger.error(f"Failed to generate PDF: {e}")
|
| 64 |
+
return None, f"Error generating PDF: {e}"
|
| 65 |
|
| 66 |
with gr.Blocks(title="Multi-Device LabOps Dashboard") as demo:
|
| 67 |
gr.Markdown("# π Multi-Device LabOps Dashboard")
|
|
|
|
| 91 |
with gr.Row():
|
| 92 |
pdf_btn = gr.Button("π Generate PDF Report")
|
| 93 |
pdf_output = gr.File(label="Download PDF Report")
|
| 94 |
+
pdf_message = gr.Textbox(label="PDF Generation Status")
|
| 95 |
|
| 96 |
# State to store dataframe
|
| 97 |
df_state = gr.State()
|
|
|
|
| 106 |
pdf_btn.click(
|
| 107 |
fn=generate_pdf_report,
|
| 108 |
inputs=[df_state],
|
| 109 |
+
outputs=[pdf_output, pdf_message]
|
| 110 |
)
|
| 111 |
|
| 112 |
if __name__ == "__main__":
|