diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py index e01d493c413af6df66ec62dff8db9bfe24e95a65..b846c15dcf892c1cfd9ba1dbc854ea4b46acec19 100644 --- a/atdb/taskdatabase/urls.py +++ b/atdb/taskdatabase/urls.py @@ -52,6 +52,7 @@ urlpatterns = [ path('monitoring/', views.ShowMonitoring, name='monitoring'), path('diagram/', views.DiagramView.as_view(), name='diagram'), path('config/', views.ShowConfig, name='config'), + path('create_status_graph/', views.CreateStatusGraph, name='create_status_graph'), # --- REST API --- diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py index 4f9fdda8aad6aa1eab941c061ff83008af6b6237..542df75f55f5a7b560e31d0288eb0d1f11ecf3c8 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -1,5 +1,8 @@ import logging import json +from datetime import datetime, timedelta +import matplotlib.pyplot as plt +import psycopg2 from . import config from django.contrib.auth.decorators import login_required @@ -1763,3 +1766,84 @@ def UpdateSummaryFlag(request, task_id): return JsonResponse({ 'is_summary': task.is_summary }) + + + +def CreateStatusGraph(request): + query_per_hour = """ + SELECT + DATE_TRUNC('hour', timestamp) AS hour, + COUNT(*) AS num_records + FROM + taskdatabase_status + WHERE name = %s + AND timestamp >= %s -- Filter for records within the last x days + GROUP BY + DATE_TRUNC('hour', timestamp) + ORDER BY + DATE_TRUNC('hour', timestamp); + """ + query_per_day = """ + SELECT + DATE_TRUNC('day', timestamp) AS day, + COUNT(*) AS num_records + FROM + taskdatabase_status + WHERE name = %s + AND timestamp >= %s -- Filter for records within the last x days + GROUP BY + DATE_TRUNC('day', timestamp) + ORDER BY + DATE_TRUNC('day', timestamp); + """ + + if request.method == 'POST': + status = request.POST.get('status', 'finished') + days_to_check = int(request.POST.get('days', 60)) + bin_size = request.POST.get('bin_size', 'day') + + # Calculate the date x days ago + start_date = datetime.now() - timedelta(days=days_to_check) + + # Connect to your PostgreSQL database + conn = psycopg2.connect( + dbname=config.DATABASES['default']['name'], + user=config.DATABASES['default']['user'], + password=config.DATABASES['default']['password'], + host=config.DATABASES['default']['host'], + port=config.DATABASES['default']['port'], + ) + + # Execute the SQL query + cur = conn.cursor() + if bin_size == 'day': + cur.execute(query_per_day, (status,start_date)) + else: + cur.execute(query_per_hour, (status, start_date)) + + # Fetch the results + results = cur.fetchall() + + # Close cursor and connection + cur.close() + conn.close() + + # Extract hours and number of records from results + records = [result[0] for result in results] + num_records = [result[1] for result in results] + + # Plot the graph + plt.figure(figsize=(10, 6)) + plt.plot(records, num_records, marker='o') + plt.xlabel(bin_size.capitalize()) + plt.ylabel('Number of Records') + plt.title(f'{status} per {bin_size} for the last {days_to_check} days') + plt.xticks(rotation=45) + plt.grid(True) + plt.tight_layout() + plt.savefig('records_per_{}_{}_last_{}days.png'.format(bin_size, status, days_to_check)) + + # Render the template with the graph + return render(request, 'taskdatabase/graphs/status_graph.html') + + return render(request, 'taskdatabase/graphs/status_graph_input_form.html') \ No newline at end of file