1- from flask import Flask , render_template
1+ from flask import Flask , render_template , request , flash
22from flask_sqlalchemy import SQLAlchemy
33import os
44import psutil
1010# Configure the SQLite database
1111app .config ['SQLALCHEMY_DATABASE_URI' ] = 'sqlite:///speedtest_results.db'
1212app .config ['SQLALCHEMY_TRACK_MODIFICATIONS' ] = False
13+ app .config ['SECRET_KEY' ] = 'secret'
1314
1415# Initialize the database
1516db = SQLAlchemy (app )
1617
17- # config
18- SPEEDTEST_COOLDOWN_IN_HOURS = 1 # in hours
19- TIMEZONE = 'Asia/Kolkata'
20- NUMBER_OF_SPEEDTESTS = 3
21-
2218# Define the model for storing speed test results
2319class SpeedTestResult (db .Model ):
2420 id = db .Column (db .Integer , primary_key = True )
@@ -30,14 +26,22 @@ class SpeedTestResult(db.Model):
3026 def __repr__ (self ):
3127 return f'<SpeedTestResult { self .download_speed } , { self .upload_speed } , { self .ping } >'
3228
33- # class DashoardSettings(db.Model):
34- # id = db.Column(db.Integer, primary_key=True)
35- # speedtest_cooldown = db.Column(db.Integer)
36- # timezone = db.Column(db.String(50))
37- # number_of_speedtests = db.Column(db.Integer)
29+ class DashoardSettings (db .Model ):
30+ id = db .Column (db .Integer , primary_key = True )
31+ speedtest_cooldown = db .Column (db .Integer , default = 1 )
32+ number_of_speedtests = db .Column (db .Integer , default = 1 )
33+ timezone = db .Column (db .String (50 ), default = 'Asia/Kolkata' )
34+
35+ def __repr__ (self ):
36+ return f'<DashboardSettings { self .speedtest_cooldown } , { self .timezone } , { self .number_of_speedtests } >'
3837
39- # def __repr__(self):
40- # return f'<DashboardSettings {self.speedtest_cooldown}, {self.timezone}, {self.number_of_speedtests}>'
38+ # initialize the database
39+ with app .app_context ():
40+ db .create_all ()
41+ settings = DashoardSettings .query .first ()
42+ if not settings :
43+ db .session .add (DashoardSettings ())
44+ db .session .commit ()
4145
4246def change_up_time_format (uptime ):
4347 uptime_seconds = uptime .total_seconds ()
@@ -73,8 +77,14 @@ def run_speedtest():
7377 error = {"status" : "Error" , "message" : str (e )}
7478 return error
7579
80+ def datetimeformat (value , format = '%Y-%m-%d %H:%M:%S' ):
81+ return value .strftime (format )
82+
7683@app .route ('/speedtest' )
7784def speedtest ():
85+ settings = DashoardSettings .query .first ()
86+ SPEEDTEST_COOLDOWN_IN_HOURS = settings .speedtest_cooldown
87+ NUMBER_OF_SPEEDTESTS = settings .number_of_speedtests
7888 n_hour_ago = datetime .datetime .now () - datetime .timedelta (hours = SPEEDTEST_COOLDOWN_IN_HOURS )
7989 recent_results = SpeedTestResult .query .filter (SpeedTestResult .timestamp > n_hour_ago ).all ()
8090
@@ -94,11 +104,13 @@ def speedtest():
94104 return render_template ('speedtest_result.html' , speedtest_result = speedtest_result , source = "Actual Test" )
95105 else :
96106 latest_result = recent_results [- 1 ]
97- next_test_time = latest_result .timestamp + datetime .timedelta (hours = 1 )
107+ next_test_time = latest_result .timestamp + datetime .timedelta (hours = SPEEDTEST_COOLDOWN_IN_HOURS )
108+ remaining_time_for_next_test = round ((next_test_time - datetime .datetime .now ()).total_seconds () / 60 )
98109 return render_template ('speedtest_result.html' ,
99110 speedtest_result = latest_result ,
100111 source = "Database" ,
101- next_test_time = next_test_time )
112+ next_test_time = next_test_time ,
113+ remaining_time_for_next_test = remaining_time_for_next_test )
102114
103115def get_system_info ():
104116 print ("Getting system information..." )
@@ -138,12 +150,13 @@ def get_established_connections():
138150
139151@app .route ('/' )
140152def dashboard ():
153+ settings = DashoardSettings .query .first ()
154+ SPEEDTEST_COOLDOWN_IN_HOURS = settings .speedtest_cooldown
141155 system_info = get_system_info ()
142-
143156 # Fetch the last speedtest result
144157 n_hour_ago = datetime .datetime .now () - datetime .timedelta (hours = SPEEDTEST_COOLDOWN_IN_HOURS )
145158 recent_results = SpeedTestResult .query .filter (SpeedTestResult .timestamp > n_hour_ago ).all ()
146-
159+ last_timestamp = datetimeformat ( recent_results [ - 1 ]. timestamp ) if recent_results else None
147160 if recent_results :
148161 # Display the most recent result from the database
149162 latest_result = recent_results [- 1 ]
@@ -153,7 +166,7 @@ def dashboard():
153166 'ping' : latest_result .ping
154167 }
155168 source = "Database"
156- next_test_time = latest_result .timestamp + datetime .timedelta (hours = 1 )
169+ next_test_time = latest_result .timestamp + datetime .timedelta (hours = SPEEDTEST_COOLDOWN_IN_HOURS )
157170 show_prompt = False
158171 remaining_time_for_next_test = round ((next_test_time - datetime .datetime .now ()).total_seconds () / 60 )
159172 else :
@@ -165,7 +178,8 @@ def dashboard():
165178
166179 return render_template ('dashboard.html' , system_info = system_info ,
167180 speedtest_result = speedtest_result ,
168- source = source ,
181+ source = source ,
182+ last_timestamp = last_timestamp ,
169183 next_test_time = remaining_time_for_next_test ,
170184 show_prompt = show_prompt )
171185
@@ -174,6 +188,20 @@ def cpu_usage():
174188 cpu_usage = psutil .cpu_percent (interval = 1 , percpu = True )
175189 return render_template ('cpu_usage.html' , cpu_usage = cpu_usage )
176190
191+
192+ @app .route ('/settings' , methods = ['GET' , 'POST' ])
193+ def settings ():
194+ # Fetch the settings from the database and update them
195+ settings = DashoardSettings .query .first ()
196+ if settings :
197+ if request .method == 'POST' :
198+ settings .speedtest_cooldown = int (request .form ['speedtest_cooldown' ])
199+ settings .number_of_speedtests = int (request .form ['number_of_speedtests' ])
200+ settings .timezone = request .form ['timezone' ]
201+ db .session .commit ()
202+ flash ('Settings updated successfully!' , 'success' )
203+ return render_template ('settings.html' , settings = settings )
204+
177205@app .route ('/memory_usage' )
178206def memory_usage ():
179207 memory_info = {
0 commit comments