Skip to content

Commit a7aa4bc

Browse files
feat: setting page improved and priority level set
1 parent 5e70fdf commit a7aa4bc

10 files changed

Lines changed: 396 additions & 179 deletions

File tree

src/routes/auth.py

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,36 @@ def load_user(user_id):
2121
return User.query.get(int(user_id))
2222

2323

24-
def get_admin_emails_for_email_alerts():
24+
def get_email_addresses(user_level=None, receive_email_alerts=True, fetch_all_users=False):
2525
with app.app_context():
26-
admin_emails = User.query.filter_by(user_level='admin', receive_email_alerts=True).all()
27-
print(admin_emails)
28-
if not admin_emails:
29-
return None
30-
return [admin.email for admin in admin_emails]
31-
32-
def get_all_users_emails(receive_email_alerts=True):
33-
with app.app_context():
34-
users = User.query.filter_by(receive_email_alerts=receive_email_alerts).all()
26+
# Build query filter based on the presence of `user_level`
27+
filters = []
28+
if user_level:
29+
filters.append(User.user_level == user_level)
30+
if not fetch_all_users:
31+
filters.append(User.receive_email_alerts == receive_email_alerts)
32+
33+
# Query the database with the constructed filters
34+
users = User.query.filter(*filters).all()
35+
36+
# Check if no users were found
3537
if not users:
3638
return None
39+
40+
# Return list of email addresses
3741
return [user.email for user in users]
3842

43+
# Get Admin Emails with Alerts Enabled:
44+
# admin_emails = get_email_addresses(user_level='admin', receive_email_alerts=True)
45+
# Get All Admin Emails Regardless of Alert Preference:
46+
# all_admin_emails = get_email_addresses(user_level='admin', fetch_all_users=True)
47+
48+
# Get All Users with Alerts Enabled:
49+
# all_user_emails = get_email_addresses(receive_email_alerts=True)
50+
# Get All Users Regardless of Alert Preference:
51+
# all_users_emails = get_email_addresses(fetch_all_users=True)
52+
53+
3954

4055

4156
@app.route('/login', methods=['GET', 'POST'])
@@ -46,7 +61,8 @@ def login():
4661
user = User.query.filter_by(username=username).first()
4762
if user and check_password_hash(user.password, password):
4863
login_user(user)
49-
admin_email_address = get_admin_emails_for_email_alerts()
64+
# Get Admin Emails with Alerts Enabled:
65+
admin_email_address = get_email_addresses(user_level='admin', receive_email_alerts=True)
5066
if admin_email_address:
5167
send_email(admin_email_address, 'Login Alert', f'{user.username} logged in to the system.')
5268

@@ -73,7 +89,8 @@ def signup():
7389
hashed_password = generate_password_hash(password)
7490
new_user = User(username=username, password=hashed_password)
7591

76-
admin_email_address = get_admin_emails_for_email_alerts()
92+
# Get Admin Emails with Alerts Enabled:
93+
admin_email_address = get_email_addresses(user_level='admin', receive_email_alerts=True)
7794
# extends the signup user to send an email to the admin
7895
if admin_email_address:
7996
send_email(admin_email_address, 'New User Alert', f'{username} has signed up to the system.')
@@ -199,16 +216,25 @@ def send_email_page():
199216
receiver_email = request.form.get("recipient")
200217
subject = request.form.get("subject")
201218
body = request.form.get("body")
219+
priority = request.form.get("priority")
202220
attachment = request.files.get("attachment")
203221

204222
if not receiver_email or not subject or not body:
205223
flash("Please provide recipient, subject, and body.", "danger")
206224
return redirect(url_for('send_email_page'))
207225

208-
if receiver_email == "all_users":
209-
receiver_email = get_all_users_emails()
210-
elif receiver_email == "admin_users":
211-
receiver_email = get_admin_emails_for_email_alerts()
226+
# on high priority, send to all users or admin users even the receive_email_alerts is False
227+
if priority == "high" and receiver_email == "all_users":
228+
receiver_email = get_email_addresses(fetch_all_users=True)
229+
elif priority == "high" and receiver_email == "admin_users":
230+
receiver_email = get_email_addresses(user_level='admin', fetch_all_users=True)
231+
232+
# priority is low, send to users with receive_email_alerts is True
233+
if priority == "low" and receiver_email == "all_users":
234+
receiver_email = get_email_addresses(receive_email_alerts=True)
235+
elif priority == "low" and receiver_email == "admin_users":
236+
receiver_email = get_email_addresses(user_level='admin', receive_email_alerts=True)
237+
212238

213239
if not receiver_email:
214240
flash("No users found to send email to.", "danger")

src/routes/settings.py

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,69 @@
1-
from flask import render_template, request, flash, blueprints
1+
from flask import render_template, request, flash, blueprints, redirect, url_for
22
from src.config import app, db
33
from src.models import DashboardSettings
44
from flask_login import login_required, current_user
55

66
settings_bp = blueprints.Blueprint("settings", __name__)
77

8+
9+
@app.route('/settings/speedtest', methods=['GET', 'POST'])
10+
def speedtest_settings():
11+
settings = DashboardSettings.query.first() # Retrieve settings from DB
12+
if request.method == 'POST':
13+
settings.speedtest_cooldown = request.form.get('speedtest_cooldown')
14+
settings.number_of_speedtests = request.form.get('number_of_speedtests')
15+
db.session.commit()
16+
flash('Speedtest settings updated successfully!', 'success')
17+
return redirect(url_for('speedtest_settings'))
18+
return render_template('speedtest_settings.html', settings=settings)
19+
20+
@app.route('/settings/general', methods=['GET', 'POST'])
21+
def general_settings():
22+
settings = DashboardSettings.query.first() # Retrieve settings from DB
23+
if request.method == 'POST':
24+
settings.timezone = request.form.get('timezone')
25+
settings.enable_cache = 'enable_cache' in request.form
26+
db.session.commit()
27+
flash('General settings updated successfully!', 'success')
28+
return redirect(url_for('general_settings'))
29+
return render_template('general_settings.html', settings=settings)
30+
31+
@app.route('/settings/feature-toggles', methods=['GET', 'POST'])
32+
def feature_toggles():
33+
settings = DashboardSettings.query.first() # Retrieve settings from DB
34+
if request.method == 'POST':
35+
settings.is_cpu_info_enabled = 'is_cpu_info_enabled' in request.form
36+
settings.is_memory_info_enabled = 'is_memory_info_enabled' in request.form
37+
settings.is_disk_info_enabled = 'is_disk_info_enabled' in request.form
38+
settings.is_network_info_enabled = 'is_network_info_enabled' in request.form
39+
settings.is_process_info_enabled = 'is_process_info_enabled' in request.form
40+
db.session.commit()
41+
flash('Feature toggles updated successfully!', 'success')
42+
return redirect(url_for('feature_toggles'))
43+
return render_template('feature_toggles.html', settings=settings)
44+
45+
@app.route('/settings/card-toggles', methods=['GET', 'POST'])
46+
def card_toggles():
47+
settings = DashboardSettings.query.first() # Retrieve settings from DB
48+
if request.method == 'POST':
49+
settings.is_user_card_enabled = 'is_user_card_enabled' in request.form
50+
settings.is_server_card_enabled = 'is_server_card_enabled' in request.form
51+
settings.is_battery_card_enabled = 'is_battery_card_enabled' in request.form
52+
settings.is_cpu_core_card_enabled = 'is_cpu_core_card_enabled' in request.form
53+
settings.is_cpu_usage_card_enabled = 'is_cpu_usage_card_enabled' in request.form
54+
settings.is_cpu_temp_card_enabled = 'is_cpu_temp_card_enabled' in request.form
55+
settings.is_dashboard_memory_card_enabled = 'is_dashboard_memory_card_enabled' in request.form
56+
settings.is_memory_usage_card_enabled = 'is_memory_usage_card_enabled' in request.form
57+
settings.is_disk_usage_card_enabled = 'is_disk_usage_card_enabled' in request.form
58+
settings.is_system_uptime_card_enabled = 'is_system_uptime_card_enabled' in request.form
59+
settings.is_network_statistic_card_enabled = 'is_network_statistic_card_enabled' in request.form
60+
settings.is_network_usage_card_enabled = 'is_network_usage_card_enabled' in request.form
61+
db.session.commit()
62+
flash('Card toggles updated successfully!', 'success')
63+
return redirect(url_for('card_toggles'))
64+
return render_template('card_toggles.html', settings=settings)
65+
66+
867
@app.route("/settings", methods=["GET", "POST"])
968
@login_required
1069
def settings():

src/static/css/send_email.css

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,88 @@
1-
/* send_email.css */
2-
.container {
1+
.email-container {
32
max-width: 600px;
43
margin: 0 auto;
5-
padding: 20px;
6-
background-color: #f8f9fa;
7-
border-radius: 8px;
8-
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
4+
padding: 30px;
5+
background-color: #ffffff;
6+
border-radius: 12px;
7+
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1);
8+
border: 1px solid #e0e0e0;
99
}
1010

1111
h2 {
1212
margin-bottom: 20px;
1313
color: #343a40;
14+
font-size: 28px;
15+
font-weight: 700;
16+
display: flex;
17+
align-items: center;
18+
gap: 10px;
19+
}
20+
21+
h2 i {
22+
color: #007bff;
1423
}
1524

1625
.form-group {
17-
margin-bottom: 15px;
26+
margin-bottom: 20px;
1827
}
1928

2029
.form-group label {
2130
font-weight: 600;
2231
color: #495057;
2332
display: block;
24-
margin-bottom: 5px;
33+
margin-bottom: 8px;
2534
}
2635

2736
.form-group input,
28-
.form-group textarea {
37+
.form-group textarea,
38+
.form-group select {
2939
width: 100%;
30-
padding: 8px;
40+
padding: 12px;
3141
border: 1px solid #ced4da;
32-
border-radius: 4px;
33-
background-color: #ffffff;
42+
border-radius: 8px;
43+
background-color: #f8f9fa;
3444
font-size: 16px;
45+
box-sizing: border-box;
46+
transition: border-color 0.3s ease, box-shadow 0.3s ease;
47+
}
48+
49+
.form-group input:focus,
50+
.form-group textarea:focus,
51+
.form-group select:focus {
52+
border-color: #007bff;
53+
box-shadow: 0 0 5px rgba(0, 123, 255, 0.3);
3554
}
3655

3756
.btn-primary {
38-
padding: 10px 20px;
57+
padding: 12px 24px;
3958
background-color: #007bff;
4059
color: #ffffff;
4160
border: none;
42-
border-radius: 4px;
61+
border-radius: 8px;
4362
cursor: pointer;
4463
font-size: 16px;
4564
text-align: center;
46-
transition: background-color 0.3s ease;
65+
transition: background-color 0.3s ease, transform 0.2s ease;
66+
display: flex;
67+
align-items: center;
68+
gap: 10px;
69+
}
70+
71+
.btn-primary i {
72+
font-size: 18px;
4773
}
4874

4975
.btn-primary:hover {
5076
background-color: #0056b3;
77+
transform: scale(1.05);
78+
}
79+
80+
@media (max-width: 768px) {
81+
.email-container {
82+
padding: 20px;
83+
}
84+
85+
h2 {
86+
font-size: 24px;
87+
}
5188
}

src/static/css/settings.css

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
background-color: #f8f9fa;
66
border-radius: 8px;
77
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
8+
margin-top: 50px;
89
}
910

1011
.settings-title {
@@ -16,7 +17,7 @@
1617

1718
.settings-buttons {
1819
display: grid;
19-
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
20+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
2021
gap: 15px;
2122
margin-bottom: 30px;
2223
}
@@ -31,13 +32,28 @@
3132
text-decoration: none;
3233
font-size: 16px;
3334
transition: background-color 0.3s ease, transform 0.2s ease;
35+
display: flex;
36+
align-items: center;
37+
justify-content: center;
38+
gap: 10px;
39+
}
40+
41+
.settings-buttons .btn i {
42+
font-size: 20px;
3443
}
3544

3645
.settings-buttons .btn:hover {
3746
background-color: #0056b3;
3847
transform: scale(1.05);
3948
}
4049

50+
@media (max-width: 768px) {
51+
.settings-buttons {
52+
grid-template-columns: 1fr;
53+
}
54+
}
55+
56+
4157
.settings-form {
4258
display: flex;
4359
flex-direction: column;

0 commit comments

Comments
 (0)