1+ import json
12import datetime
2- from flask_login import UserMixin
3+ from flask_login import UserMixin , current_user
34from werkzeug .security import generate_password_hash , check_password_hash
45
5- from src .config import db , app
66
7+ from src .config import db , app
78
89class SpeedTestResult (db .Model ):
910 __tablename__ = "SpeedTestResult"
@@ -18,28 +19,37 @@ def __repr__(self):
1819 f"<SpeedTestResult { self .download_speed } , { self .upload_speed } , { self .ping } >"
1920 )
2021
21- class DashboardSettings (db .Model ):
22- __tablename__ = "DashboardSettings"
22+ class User (db .Model , UserMixin ):
23+ __tablename__ = 'users'
24+
2325 id = db .Column (db .Integer , primary_key = True )
26+ username = db .Column (db .String (50 ), unique = True , nullable = False )
27+ email = db .Column (db .String (100 ), unique = True , nullable = False )
28+ password = db .Column (db .String (100 ), nullable = False )
29+ user_level = db .Column (db .String (10 ), nullable = False , default = 'user' )
30+ receive_email_alerts = db .Column (db .Boolean , default = False )
31+ profession = db .Column (db .String (50 ), nullable = True )
2432
25- # speedtest setting
26- speedtest_cooldown = db .Column (db .Integer , default = 1 )
27- number_of_speedtests = db .Column (db .Integer , default = 1 )
33+ # Backref renamed to avoid conflict
34+ dashboard_settings = db .relationship ('DashboardSettings' , backref = 'user' , uselist = False )
2835
29- # general settings
30- timezone = db .Column (db .String (50 ), default = "Asia/Kolkata" )
31- enable_cache = db .Column (db .Boolean , default = True )
32- enable_alerts = db .Column (db .Boolean , default = False )
36+ class DashboardSettings (db .Model ):
37+ __tablename__ = 'dashboard_settings'
3338
34- # page enable/disable
39+ id = db .Column (db .Integer , primary_key = True )
40+ user_id = db .Column (db .Integer , db .ForeignKey ('users.id' ))
41+
42+ speedtest_cooldown = db .Column (db .Integer , default = 3600 )
43+ number_of_speedtests = db .Column (db .Integer , default = 3 )
44+
45+ # Feature Toggles
3546 is_cpu_info_enabled = db .Column (db .Boolean , default = True )
3647 is_memory_info_enabled = db .Column (db .Boolean , default = True )
3748 is_disk_info_enabled = db .Column (db .Boolean , default = True )
3849 is_network_info_enabled = db .Column (db .Boolean , default = True )
39- is_process_info_enabled = db .Column (db .Boolean , default = False )
50+ is_process_info_enabled = db .Column (db .Boolean , default = True )
4051
41-
42- # card enable/disable
52+ # Card Toggles
4353 is_user_card_enabled = db .Column (db .Boolean , default = True )
4454 is_server_card_enabled = db .Column (db .Boolean , default = True )
4555 is_battery_card_enabled = db .Column (db .Boolean , default = True )
@@ -51,10 +61,15 @@ class DashboardSettings(db.Model):
5161 is_disk_usage_card_enabled = db .Column (db .Boolean , default = True )
5262 is_system_uptime_card_enabled = db .Column (db .Boolean , default = True )
5363 is_network_statistic_card_enabled = db .Column (db .Boolean , default = True )
54- is_speedtest_enabled = db .Column (db .Boolean , default = False )
55-
56- def __repr__ (self ):
57- return f"<DashboardSettings { self .speedtest_cooldown } , { self .timezone } , { self .number_of_speedtests } >"
64+ is_speedtest_enabled = db .Column (db .Boolean , default = True )
65+
66+ class GeneralSettings (db .Model ):
67+ __tablename__ = 'general_settings'
68+
69+ id = db .Column (db .Integer , primary_key = True )
70+ enable_alerts = db .Column (db .Boolean , default = False )
71+ timezone = db .Column (db .String (50 ), default = 'UTC' )
72+ enable_cache = db .Column (db .Boolean , default = False )
5873
5974
6075class SystemInfo (db .Model ):
@@ -81,13 +96,6 @@ class SystemInfo(db.Model):
8196 def __repr__ (self ):
8297 return f"<SystemInfo { self .username } , { self .cpu_percent } , { self .memory_percent } , { self .disk_usage } , { self .battery_percent } , { self .cpu_core } , { self .boot_time } , { self .network_sent } , { self .network_received } , { self .process_count } , { self .swap_memory } , { self .uptime } , { self .ipv4_connections } , { self .ipv6_connections } , { self .dashboard_memory_usage } >"
8398
84- class User (db .Model , UserMixin ):
85- id = db .Column (db .Integer , primary_key = True )
86- username = db .Column (db .String (150 ), unique = True , nullable = False )
87- email = db .Column (db .String (150 ), unique = True , nullable = False )
88- password = db .Column (db .String (150 ), nullable = False )
89- user_level = db .Column (db .String (50 ), nullable = False , default = 'user' )
90- receive_email_alerts = db .Column (db .Boolean , default = True )
9199
92100
93101class SmptEamilPasswordConfig (db .Model ):
@@ -102,32 +110,37 @@ class SmptEamilPasswordConfig(db.Model):
102110 db .create_all ()
103111
104112 # Initialize default settings
105- settings = DashboardSettings .query .first ()
106- if not settings :
107- db .session .add (DashboardSettings ())
108- db .session .commit ()
109-
110- # Create admin user if not exists
111- if not User .query .filter_by (username = 'admin' ).first ():
112- hashed_password = generate_password_hash ('adminpassword' )
113- admin_user = User (username = 'admin' , email = "codeperfectplus@gmail.com" , password = hashed_password , user_level = 'admin' ,
114- receive_email_alerts = True )
115-
116- db .session .add (admin_user )
113+ general_settings = GeneralSettings .query .first ()
114+ if not general_settings :
115+ db .session .add (GeneralSettings ())
117116 db .session .commit ()
118117
119- # create a user if not exists
120- if not User .query .filter_by (username = 'user' ).first ():
121- hashed_password = generate_password_hash ('userpassword' )
122- user = User (username = 'user' , email = "test@mail.com" ,
123- password = hashed_password , user_level = 'user' , receive_email_alerts = False )
124-
125- db .session .add (user )
126- db .session .commit ()
118+ # initialize default dashboard settings for users
119+ users = User .query .all ()
120+ for user in users :
121+ if not user .dashboard_settings :
122+ db .session .add (DashboardSettings (user_id = user .id ))
123+ db .session .commit ()
124+
125+
126+ pre_defined_users_json = "src/assets/predefine_user.json"
127+ with open (pre_defined_users_json , "r" ) as file :
128+ pre_defined_users = json .load (file )
129+ for user in pre_defined_users :
130+ if not User .query .filter_by (user_level = user ['user_level' ]).first ():
131+ hashed_password = generate_password_hash (user ['password' ])
132+ user = User (username = user ['username' ], email = user ['email' ], password = hashed_password , user_level = user ['user_level' ],
133+ receive_email_alerts = user ['receive_email_alerts' ], profession = user ['profession' ])
134+
135+ db .session .add (user )
136+ db .session .commit ()
127137
128138# ibject for all templates
129139@app .context_processor
130140def inject_settings ():
131- settings = DashboardSettings .query .first ()
132- return dict (settings = settings )
133-
141+ if current_user .is_anonymous :
142+ return dict (settings = None )
143+ settings = DashboardSettings .query .filter_by (user_id = current_user .id ).first () # Retrieve user-specific settings from DB
144+ general_settings = GeneralSettings .query .first ()
145+ all_settings = dict (settings = settings , general_settings = general_settings )
146+ return all_settings
0 commit comments