Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -31,7 +31,7 @@ def generate_sample_data():
|
|
| 31 |
"Log_Timestamp": current_date.strftime("%Y-%m-%d %H:%M:%S"),
|
| 32 |
"Usage_Count": random.randint(0, 50),
|
| 33 |
"Status": random.choice(["Operational", "Down", "Maintenance"]),
|
| 34 |
-
"AMC_Expiry": (current_date + timedelta(days=random.randint(10,
|
| 35 |
})
|
| 36 |
current_date += timedelta(days=1)
|
| 37 |
|
|
@@ -63,12 +63,19 @@ def process_dashboard_data(lab_filter, equipment_type_filter, start_date, end_da
|
|
| 63 |
end_date_dt = datetime.strptime(end_date, "%Y-%m-%d")
|
| 64 |
if start_date_dt > end_date_dt:
|
| 65 |
return "Error: Start date must be before end date.", None, None, None, "", None
|
| 66 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
return f"Error: Invalid date format. Use YYYY-MM-DD (e.g., 2025-05-01). Received: Start={start_date}, End={end_date}", None, None, None, "", None
|
| 68 |
else:
|
| 69 |
start_date_dt = datetime(2025, 1, 1)
|
| 70 |
end_date_dt = datetime(2025, 6, 30)
|
| 71 |
|
|
|
|
|
|
|
| 72 |
# Apply filters
|
| 73 |
filtered_devices = devices_df.copy()
|
| 74 |
if lab_filter != "All":
|
|
@@ -85,10 +92,12 @@ def process_dashboard_data(lab_filter, equipment_type_filter, start_date, end_da
|
|
| 85 |
(filtered_logs["Log_Date"] >= start_date_str) &
|
| 86 |
(filtered_logs["Log_Date"] <= end_date_str)
|
| 87 |
]
|
| 88 |
-
|
| 89 |
|
| 90 |
# Device Cards
|
| 91 |
device_cards = "Device Cards:\n"
|
|
|
|
|
|
|
| 92 |
for _, device in filtered_devices.iterrows():
|
| 93 |
device_logs = filtered_logs[filtered_logs["Device_ID"] == device["Device_ID"]]
|
| 94 |
usage_count = device_logs["Usage_Count"].sum() if not device_logs.empty else 0
|
|
@@ -172,7 +181,7 @@ def process_dashboard_data(lab_filter, equipment_type_filter, start_date, end_da
|
|
| 172 |
with gr.Blocks(title="LabOps Dashboard") as demo:
|
| 173 |
gr.Markdown("# LabOps Dashboard")
|
| 174 |
gr.Markdown("Monitor smart lab devices, view usage trends, uptime, anomalies, and export reports.")
|
| 175 |
-
gr.Markdown("**Note**: Use the calendar picker to select dates
|
| 176 |
|
| 177 |
# Filters
|
| 178 |
gr.Markdown("## Filters")
|
|
@@ -189,7 +198,7 @@ with gr.Blocks(title="LabOps Dashboard") as demo:
|
|
| 189 |
elem_id="end_date_picker"
|
| 190 |
)
|
| 191 |
|
| 192 |
-
# Custom JavaScript to enable browser-native date picker
|
| 193 |
gr.HTML("""
|
| 194 |
<script>
|
| 195 |
document.addEventListener('DOMContentLoaded', function() {
|
|
@@ -198,6 +207,10 @@ with gr.Blocks(title="LabOps Dashboard") as demo:
|
|
| 198 |
if (startPicker && endPicker) {
|
| 199 |
startPicker.type = 'date';
|
| 200 |
endPicker.type = 'date';
|
|
|
|
|
|
|
|
|
|
|
|
|
| 201 |
} else {
|
| 202 |
console.error('Date picker elements not found');
|
| 203 |
}
|
|
|
|
| 31 |
"Log_Timestamp": current_date.strftime("%Y-%m-%d %H:%M:%S"),
|
| 32 |
"Usage_Count": random.randint(0, 50),
|
| 33 |
"Status": random.choice(["Operational", "Down", "Maintenance"]),
|
| 34 |
+
"AMC_Expiry": (current_date + timedelta(days=random.randint(10, 90))).strftime("%Y-%m-%d")
|
| 35 |
})
|
| 36 |
current_date += timedelta(days=1)
|
| 37 |
|
|
|
|
| 63 |
end_date_dt = datetime.strptime(end_date, "%Y-%m-%d")
|
| 64 |
if start_date_dt > end_date_dt:
|
| 65 |
return "Error: Start date must be before end date.", None, None, None, "", None
|
| 66 |
+
# Check if dates are within sample data range
|
| 67 |
+
data_start = datetime(2025, 1, 1)
|
| 68 |
+
data_end = datetime(2025, 6, 30)
|
| 69 |
+
if start_date_dt < data_start or end_date_dt > data_end:
|
| 70 |
+
return f"Error: Dates must be between 2025-01-01 and 2025-06-30. Received: Start={start_date}, End={end_date}", None, None, None, "", None
|
| 71 |
+
except ValueError:
|
| 72 |
return f"Error: Invalid date format. Use YYYY-MM-DD (e.g., 2025-05-01). Received: Start={start_date}, End={end_date}", None, None, None, "", None
|
| 73 |
else:
|
| 74 |
start_date_dt = datetime(2025, 1, 1)
|
| 75 |
end_date_dt = datetime(2025, 6, 30)
|
| 76 |
|
| 77 |
+
print(f"Input dates: Start={start_date}, End={end_date}") # Debug log
|
| 78 |
+
|
| 79 |
# Apply filters
|
| 80 |
filtered_devices = devices_df.copy()
|
| 81 |
if lab_filter != "All":
|
|
|
|
| 92 |
(filtered_logs["Log_Date"] >= start_date_str) &
|
| 93 |
(filtered_logs["Log_Date"] <= end_date_str)
|
| 94 |
]
|
| 95 |
+
print(f"Filtered logs count: {len(filtered_logs)}") # Debug log
|
| 96 |
|
| 97 |
# Device Cards
|
| 98 |
device_cards = "Device Cards:\n"
|
| 99 |
+
if filtered_devices.empty:
|
| 100 |
+
device_cards += "No devices match the selected filters.\n"
|
| 101 |
for _, device in filtered_devices.iterrows():
|
| 102 |
device_logs = filtered_logs[filtered_logs["Device_ID"] == device["Device_ID"]]
|
| 103 |
usage_count = device_logs["Usage_Count"].sum() if not device_logs.empty else 0
|
|
|
|
| 181 |
with gr.Blocks(title="LabOps Dashboard") as demo:
|
| 182 |
gr.Markdown("# LabOps Dashboard")
|
| 183 |
gr.Markdown("Monitor smart lab devices, view usage trends, uptime, anomalies, and export reports.")
|
| 184 |
+
gr.Markdown("**Note**: Use the calendar picker to select dates in YYYY-MM-DD format (e.g., 2025-05-01 to 2025-05-30). Dates must be between 2025-01-01 and 2025-06-30. If the calendar picker doesn't appear, enter dates manually.")
|
| 185 |
|
| 186 |
# Filters
|
| 187 |
gr.Markdown("## Filters")
|
|
|
|
| 198 |
elem_id="end_date_picker"
|
| 199 |
)
|
| 200 |
|
| 201 |
+
# Custom JavaScript to enable browser-native date picker with constraints
|
| 202 |
gr.HTML("""
|
| 203 |
<script>
|
| 204 |
document.addEventListener('DOMContentLoaded', function() {
|
|
|
|
| 207 |
if (startPicker && endPicker) {
|
| 208 |
startPicker.type = 'date';
|
| 209 |
endPicker.type = 'date';
|
| 210 |
+
startPicker.min = '2025-01-01';
|
| 211 |
+
startPicker.max = '2025-06-30';
|
| 212 |
+
endPicker.min = '2025-01-01';
|
| 213 |
+
endPicker.max = '2025-06-30';
|
| 214 |
} else {
|
| 215 |
console.error('Date picker elements not found');
|
| 216 |
}
|