33from src .config import app , db
44from src .models import SystemInformation , UserDashboardSettings
55from src .utils import _get_system_info
6+ import gc
67
78api_bp = blueprints .Blueprint ("api" , __name__ )
89
@@ -20,66 +21,62 @@ def cpu_percent_api():
2021from flask import request
2122from datetime import datetime , timedelta
2223
23- @app .route ('/api/graphs_data' )
24+ @app .route ('/api/graphs_data' , methods = [ 'GET' ] )
2425@login_required
2526def graph_data_api ():
2627 try :
27- curent_time = datetime .now ()
28+ current_time = datetime .now ()
2829 # Get the time filter from query parameters
2930 time_filter = request .args .get ('filter' , default = '1 day' )
30-
31+
3132 # Determine the start time based on the filter
3233 now = datetime .now ()
33- # 5 minutes, 15 minutes, 30 minutes, 1 hour, 3 hours, 6 hours, 12 hours, 1 day, 2 days, 3 days, 1 week, 1 month
34- if time_filter == '5 minutes' :
35- start_time = now - timedelta (minutes = 5 )
36- elif time_filter == '15 minutes' :
37- start_time = now - timedelta (minutes = 15 )
38- elif time_filter == '30 minutes' :
39- start_time = now - timedelta (minutes = 30 )
40- elif time_filter == '1 hour' :
41- start_time = now - timedelta (hours = 1 )
42- elif time_filter == '3 hours' :
43- start_time = now - timedelta (hours = 3 )
44- elif time_filter == '6 hours' :
45- start_time = now - timedelta (hours = 6 )
46- elif time_filter == '12 hours' :
47- start_time = now - timedelta (hours = 12 )
48- elif time_filter == '1 day' :
49- start_time = now - timedelta (days = 1 )
50- elif time_filter == '2 days' :
51- start_time = now - timedelta (days = 2 )
52- elif time_filter == '3 days' :
53- start_time = now - timedelta (days = 3 )
54- elif time_filter == '1 week' :
55- start_time = now - timedelta (weeks = 1 )
56- elif time_filter == '1 month' :
57- start_time = now - timedelta (weeks = 4 )
58- else :
59- start_time = now - timedelta (days = 1 ) # Default to 1 day if filter is unknown
60-
34+ time_deltas = {
35+ '5 minutes' : timedelta (minutes = 5 ),
36+ '15 minutes' : timedelta (minutes = 15 ),
37+ '30 minutes' : timedelta (minutes = 30 ),
38+ '1 hour' : timedelta (hours = 1 ),
39+ '3 hours' : timedelta (hours = 3 ),
40+ '6 hours' : timedelta (hours = 6 ),
41+ '12 hours' : timedelta (hours = 12 ),
42+ '1 day' : timedelta (days = 1 ),
43+ '2 days' : timedelta (days = 2 ),
44+ '3 days' : timedelta (days = 3 ),
45+ '1 week' : timedelta (weeks = 1 ),
46+ '1 month' : timedelta (weeks = 4 )
47+ }
48+ start_time = now - time_deltas .get (time_filter , timedelta (days = 1 ))
6149
6250 # Fetch entries within the time range
63- recent_system_info_entries = SystemInformation .query .filter (
64- SystemInformation .timestamp >= start_time
65- ).all ()
51+ query = SystemInformation .query .filter (SystemInformation .timestamp >= start_time )
52+ recent_system_info_entries = query .all ()
6653
67- # Use list comprehension to extract data fields if entries exist, else provide empty lists
54+ # Initialize lists for the data
55+ time_data = []
56+ cpu_data = []
57+ memory_data = []
58+ battery_data = []
59+ network_sent_data = []
60+ network_received_data = []
61+ dashboard_memory_usage = []
62+ cpu_frequency = []
63+ current_temp = []
64+
65+ # Extract data fields if entries exist
6866 if recent_system_info_entries :
69- time_data , cpu_data , memory_data , battery_data , network_sent_data , network_received_data , \
70- dashboard_memory_usage , cpu_frequency , current_temp = zip (* [
71- (
72- info .timestamp , info .cpu_percent , info .memory_percent , info .battery_percent ,
73- info .network_sent , info .network_received , info .dashboard_memory_usage ,
74- info .cpu_frequency , info .current_temp
75- )
76- for info in recent_system_info_entries
77- ])
78- else :
79- time_data = cpu_data = memory_data = battery_data = network_sent_data = network_received_data = []
80- dashboard_memory_usage = cpu_frequency = current_temp = []
67+ for info in recent_system_info_entries :
68+ time_data .append (info .timestamp )
69+ cpu_data .append (info .cpu_percent )
70+ memory_data .append (info .memory_percent )
71+ battery_data .append (info .battery_percent )
72+ network_sent_data .append (info .network_sent )
73+ network_received_data .append (info .network_received )
74+ dashboard_memory_usage .append (info .dashboard_memory_usage )
75+ cpu_frequency .append (info .cpu_frequency )
76+ current_temp .append (info .current_temp )
77+
8178 # Return the data as JSON
82- return jsonify ({
79+ response = jsonify ({
8380 "time" : time_data ,
8481 "cpu" : cpu_data ,
8582 "memory" : memory_data ,
@@ -89,8 +86,24 @@ def graph_data_api():
8986 "dashboard_memory_usage" : dashboard_memory_usage ,
9087 "cpu_frequency" : cpu_frequency ,
9188 "current_temp" : current_temp ,
92- "current_time" : curent_time
93- }), 200
89+ "current_time" : current_time
90+ })
91+
92+ # Clean up large data structures
93+ del recent_system_info_entries
94+ del time_data
95+ del cpu_data
96+ del memory_data
97+ del battery_data
98+ del network_sent_data
99+ del network_received_data
100+ del dashboard_memory_usage
101+ del cpu_frequency
102+ del current_temp
103+
104+ gc .collect ()
105+
106+ return response , 200
94107 except Exception as e :
95108 # Handle and log the error for debugging purposes
96109 return jsonify ({'error' : 'An error occurred while fetching the graph data' , 'details' : str (e )}), 500
0 commit comments