Skip to content

Commit 1542bc5

Browse files
Update email function for new signup user and create user
1 parent c95dfc3 commit 1542bc5

11 files changed

Lines changed: 148 additions & 93 deletions

File tree

src/models/__init__.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
print("Creating tables")
1919
db.create_all()
2020

21-
# initialize default dashboard settings for users
21+
# initialize default dashboard user_dashboard_settings for users
2222
users = UserProfile.query.all()
2323
for user in users:
2424
if not user.dashboard_settings:
@@ -45,7 +45,7 @@
4545
db.session.add(user)
4646
db.session.commit()
4747

48-
# Initialize default settings
48+
# Initialize default user_dashboard_settings
4949
general_settings = ApplicationGeneralSettings.query.first()
5050
if not general_settings:
5151
db.session.add(ApplicationGeneralSettings())
@@ -56,17 +56,17 @@
5656
@app.context_processor
5757
def inject_settings():
5858
if current_user.is_anonymous:
59-
return dict(settings=None, card_settings=None)
59+
return dict(user_dashboard_settings=None, card_settings=None)
6060
general_settings = ApplicationGeneralSettings.query.first()
6161
card_settings = UserCardSettings.query.filter_by(user_id=current_user.id).first()
62-
settings = UserDashboardSettings.query.filter_by(
62+
user_dashboard_settings = UserDashboardSettings.query.filter_by(
6363
user_id=current_user.id
64-
).first() # Retrieve user-specific settings from DB
64+
).first() # Retrieve user-specific user_dashboard_settings from DB
6565
feature_toggles_settings = FeatureToggleSettings.query.filter_by(
6666
user_id=current_user.id
6767
).first()
6868
all_settings = dict(
69-
settings=settings,
69+
user_dashboard_settings=user_dashboard_settings,
7070
general_settings=general_settings,
7171
card_settings=card_settings,
7272
feature_toggles_settings=feature_toggles_settings,

src/routes/dashbaord.py

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,50 +11,52 @@
1111
@app.route("/dashboard", methods=["GET"])
1212
@login_required
1313
def dashboard():
14-
settings = UserDashboardSettings.query.first()
15-
SPEEDTEST_COOLDOWN_IN_HOURS = settings.speedtest_cooldown
14+
user_dashboard_settings = UserDashboardSettings.query.first()
1615
system_info = get_system_info()
1716

1817
# Fetch the last speedtest result
19-
n_hour_ago = datetime.datetime.now() - datetime.timedelta(
20-
hours=SPEEDTEST_COOLDOWN_IN_HOURS)
21-
recent_results = NetworkSpeedTestResult.query.filter(
22-
NetworkSpeedTestResult.timestamp > n_hour_ago).all()
23-
last_timestamp = (
24-
datetimeformat(recent_results[-1].timestamp) if recent_results else None
18+
speedtest_cooldown_time = datetime.datetime.now() - datetime.timedelta(minutes=user_dashboard_settings.speedtest_cooldown)
19+
recent_speedtest_results = NetworkSpeedTestResult.query.filter(
20+
NetworkSpeedTestResult.timestamp > speedtest_cooldown_time
21+
).all()
22+
last_speedtest_timestamp = (
23+
datetimeformat(recent_speedtest_results[-1].timestamp) if recent_speedtest_results else None
2524
)
2625

27-
if recent_results:
28-
# Display the most recent result from the database
29-
latest_result = recent_results[-1]
30-
speedtest_result = {
31-
"download_speed": latest_result.download_speed,
32-
"upload_speed": latest_result.upload_speed,
33-
"ping": latest_result.ping,
34-
}
35-
source = "Database"
26+
if recent_speedtest_results:
27+
latest_result = recent_speedtest_results[-1]
28+
29+
3630
next_test_time = latest_result.timestamp + datetime.timedelta(
37-
hours=SPEEDTEST_COOLDOWN_IN_HOURS
31+
minutes=user_dashboard_settings.speedtest_cooldown
3832
)
39-
show_prompt = False
4033
remaining_time_for_next_test = round(
4134
(next_test_time - datetime.datetime.now()).total_seconds() / 60
4235
)
36+
speedtest_result = {
37+
"download_speed": latest_result.download_speed,
38+
"upload_speed": latest_result.upload_speed,
39+
"ping": latest_result.ping,
40+
"source": "Database",
41+
"show_prompt": False,
42+
"remaining_time_for_next_test": remaining_time_for_next_test,
43+
}
4344
else:
4445
# No recent results, prompt to perform a test
45-
speedtest_result = None
46-
source = None
47-
show_prompt = True
48-
remaining_time_for_next_test = None
46+
speedtest_result = {
47+
"download_speed": None,
48+
"upload_speed": None,
49+
"ping": None,
50+
"source": None,
51+
"show_prompt": True,
52+
"remaining_time_for_next_test": None,
53+
}
4954

5055
return render_template(
5156
"dashboard/developer.html",
5257
system_info=system_info,
5358
speedtest_result=speedtest_result,
54-
source=source,
55-
last_timestamp=last_timestamp,
56-
next_test_time=remaining_time_for_next_test,
57-
show_prompt=show_prompt,
59+
last_timestamp=last_speedtest_timestamp,
5860
current_user=current_user,
5961
)
6062

src/routes/settings.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from flask import render_template, request, flash, blueprints, redirect, url_for
33

44
from src.config import app, db
5-
from src.models import UserCardSettings, UserDashboardSettings, UserProfile, ApplicationGeneralSettings
5+
from src.models import UserCardSettings, UserDashboardSettings, UserProfile, ApplicationGeneralSettings, FeatureToggleSettings
66
from flask_login import login_required, current_user
77
from src.utils import render_template_from_file
88
from src.scripts.email_me import send_smpt_email
@@ -12,14 +12,14 @@
1212
@app.route('/settings/speedtest', methods=['GET', 'POST'])
1313
@login_required
1414
def speedtest_settings():
15-
settings = UserDashboardSettings.query.filter_by(user_id=current_user.id).first() # Retrieve user-specific settings from DB
15+
user_dashboard_settings = UserDashboardSettings.query.filter_by(user_id=current_user.id).first() # Retrieve user-specific settings from DB
1616
if request.method == 'POST':
17-
settings.speedtest_cooldown = request.form.get('speedtest_cooldown')
18-
settings.number_of_speedtests = request.form.get('number_of_speedtests')
17+
user_dashboard_settings.speedtest_cooldown = request.form.get('speedtest_cooldown')
18+
user_dashboard_settings.number_of_speedtests = request.form.get('number_of_speedtests')
1919
db.session.commit()
2020
flash('Speedtest settings updated successfully!', 'success')
2121
return redirect(url_for('speedtest_settings'))
22-
return render_template('speedtest_settings.html', settings=settings)
22+
return render_template('speedtest_settings.html', user_dashboard_settings=user_dashboard_settings)
2323

2424
@app.route('/settings/general', methods=['GET', 'POST'])
2525
@login_required
@@ -48,17 +48,17 @@ def general_settings():
4848
@app.route('/settings/feature-toggles', methods=['GET', 'POST'])
4949
@login_required
5050
def feature_toggles():
51-
settings = UserDashboardSettings.query.filter_by(user_id=current_user.id).first() # Retrieve user-specific settings from DB
51+
feature_toggles_settings = FeatureToggleSettings.query.filter_by(user_id=current_user.id).first() # Retrieve user-specific settings from DB
5252
if request.method == 'POST':
53-
settings.is_cpu_info_enabled = 'is_cpu_info_enabled' in request.form
54-
settings.is_memory_info_enabled = 'is_memory_info_enabled' in request.form
55-
settings.is_disk_info_enabled = 'is_disk_info_enabled' in request.form
56-
settings.is_network_info_enabled = 'is_network_info_enabled' in request.form
57-
settings.is_process_info_enabled = 'is_process_info_enabled' in request.form
53+
feature_toggles_settings.is_cpu_info_enabled = 'is_cpu_info_enabled' in request.form
54+
feature_toggles_settings.is_memory_info_enabled = 'is_memory_info_enabled' in request.form
55+
feature_toggles_settings.is_disk_info_enabled = 'is_disk_info_enabled' in request.form
56+
feature_toggles_settings.is_network_info_enabled = 'is_network_info_enabled' in request.form
57+
feature_toggles_settings.is_process_info_enabled = 'is_process_info_enabled' in request.form
5858
db.session.commit()
5959
flash('Feature toggles updated successfully!', 'success')
6060
return redirect(url_for('feature_toggles'))
61-
return render_template('feature_toggles.html', settings=settings)
61+
return render_template('feature_toggles.html', feature_toggles_settings=feature_toggles_settings)
6262

6363
@app.route('/settings/card-toggles', methods=['GET', 'POST'])
6464
@login_required

src/routes/speedtest.py

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,69 @@
11
import datetime
2-
from flask import render_template, blueprints
2+
from flask import render_template, Blueprint
33
from flask_login import login_required, current_user
44
from src.config import app, db
5-
from src.models import UserCardSettings, NetworkSpeedTestResult
5+
from src.models import UserDashboardSettings, NetworkSpeedTestResult
66
from src.utils import run_speedtest, render_template_from_file
77
from src.scripts.email_me import send_smpt_email
88

9-
speedtest_bp = blueprints.Blueprint("speedtest", __name__)
9+
speedtest_bp = Blueprint("speedtest", __name__)
1010

1111
@app.route("/speedtest")
1212
@login_required
1313
def speedtest():
14-
settings = UserCardSettings.query.first()
15-
SPEEDTEST_COOLDOWN_IN_HOURS = settings.speedtest_cooldown
16-
NUMBER_OF_SPEEDTESTS = settings.number_of_speedtests
17-
n_hour_ago = datetime.datetime.now() - datetime.timedelta(
18-
hours=SPEEDTEST_COOLDOWN_IN_HOURS
14+
user_dashboard_settings = UserDashboardSettings.query.first()
15+
speedtest_cooldown_duration = user_dashboard_settings.speedtest_cooldown
16+
required_speedtest_count = user_dashboard_settings.number_of_speedtests
17+
18+
cooldown_threshold_time = datetime.datetime.now() - datetime.timedelta(
19+
minutes=speedtest_cooldown_duration
1920
)
20-
recent_results = NetworkSpeedTestResult.query.filter(
21-
NetworkSpeedTestResult.timestamp > n_hour_ago
21+
22+
recent_speedtest_results = NetworkSpeedTestResult.query.filter(
23+
NetworkSpeedTestResult.timestamp > cooldown_threshold_time
2224
).all()
2325

24-
if len(recent_results) < NUMBER_OF_SPEEDTESTS:
25-
speedtest_result = run_speedtest()
26-
if speedtest_result["status"] == "Error":
26+
if len(recent_speedtest_results) < required_speedtest_count:
27+
current_speedtest_result = run_speedtest()
28+
29+
if current_speedtest_result["status"] == "Error":
2730
return render_template(
28-
"error/speedtest_error.html", error=speedtest_result["message"]
31+
"error/speedtest_error.html", error=current_speedtest_result["message"]
2932
)
3033

31-
if speedtest_result:
32-
new_result = NetworkSpeedTestResult(
33-
download_speed=speedtest_result["download_speed"],
34-
upload_speed=speedtest_result["upload_speed"],
35-
ping=speedtest_result["ping"],
34+
if current_speedtest_result:
35+
new_speedtest_record = NetworkSpeedTestResult(
36+
download_speed=current_speedtest_result["download_speed"],
37+
upload_speed=current_speedtest_result["upload_speed"],
38+
ping=current_speedtest_result["ping"],
3639
)
37-
db.session.add(new_result)
40+
db.session.add(new_speedtest_record)
3841
db.session.commit()
42+
3943
receiver_email = current_user.email
4044
subject = "Speedtest Result"
41-
context = {"speedtest_result": speedtest_result}
45+
context = {"speedtest_result": current_speedtest_result}
4246
body = render_template_from_file("src/templates/email_templates/speedtest_result.html", **context)
4347
send_smpt_email(receiver_email, subject, body, is_html=True)
48+
4449
return render_template(
4550
"speedtest_result.html",
46-
speedtest_result=speedtest_result,
51+
speedtest_result=current_speedtest_result,
4752
source="Actual Test",
4853
)
4954
else:
50-
latest_result = recent_results[-1]
51-
next_test_time = latest_result.timestamp + datetime.timedelta(
52-
hours=SPEEDTEST_COOLDOWN_IN_HOURS
55+
latest_speedtest_record = recent_speedtest_results[-1]
56+
next_test_time = latest_speedtest_record.timestamp + datetime.timedelta(
57+
minutes=speedtest_cooldown_duration
5358
)
5459
remaining_time_for_next_test = round(
5560
(next_test_time - datetime.datetime.now()).total_seconds() / 60
5661
)
62+
5763
return render_template(
5864
"speedtest_result.html",
59-
speedtest_result=latest_result,
65+
speedtest_result=latest_speedtest_record,
6066
source="Database",
6167
next_test_time=next_test_time,
6268
remaining_time_for_next_test=remaining_time_for_next_test,
6369
)
64-
65-

src/scripts/battery_tracking.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import psutil
22
import os
33
from datetime import datetime, timedelta
4-
from src.utils.email_me import send_smpt_email
4+
from src.scripts.email_me import send_email
55

66
STATUS_FILE = 'battery_status.txt'
77
NOTIFICATION_INTERVAL = timedelta(hours=1) # Minimum time between notifications

src/templates/card_toggles.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{% extends 'base.html' %}
22
{% block title %}Card Toggles{% endblock %}
33
{% block extra_head %}
4-
<link rel="stylesheet" href="{{ url_for('static', filename='css/card_settings.css') }}">
4+
<link rel="stylesheet" href="{{ url_for('static', filename='css/settings.css') }}">
55
{% endblock %}
66
{% block content %}
77
<div class="settings-container">

src/templates/dasbhboard_comp/other/speedtest.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
<div class="col-md-12 mb-4">
33
<div class="card bg-speedtest">
44
<div class="card-body">
5-
<h5 class="card-title">Perform Speed Test <i class="fas fa-clock"></i></h5>{% if speedtest_result %} <p
5+
<h5 class="card-title">Perform Speed Test <i class="fas fa-clock"></i></h5>{% if not speedtest_result["show_prompt"] %} <p
66
class="card-text fs-4">Download Speed:{{ speedtest_result["download_speed"]}}</p>
77
<p class="card-text fs-4">Upload Speed:{{ speedtest_result["upload_speed"]}}</p>
88
<p class="card-text fs-4">Test Last Performed:{{ last_timestamp}}</p>
9-
<p class="card-text fs-4">Try again test in :{{ next_test_time}} mins</p>{% endif %} {% if show_prompt %} <a
9+
<p class="card-text fs-4">Try again test in :{{ speedtest_result["remaining_time_for_next_test"] }} mins</p>{% endif %}
10+
{% if speedtest_result["show_prompt"] %} <a
1011
href="{{ url_for('speedtest')}}" class="btn btn-light">Run Speed Test</a>{% endif %}
1112
</div>
1213
</div>
Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,50 @@
11
{% if card_settings.is_system_uptime_card_enabled %}
22
<div class="col-md-6 col-lg-6 mb-4">
3-
<div class="card bg-uptime" data-disk="{{ system_info['disk_usage']}}" shadow-sm border-0 rounded-3>
3+
<div class="card bg-uptime shadow-sm border-0 rounded-3">
44
<div class="card-body bg-uptime">
55
<h5 class="card-title">System Uptime <i class="fas fa-clock"></i></h5>
6-
<p class="card-text fs-4">{{ system_info['uptime']}}</p>
6+
<p class="card-text fs-4" id="system-uptime">
7+
{{ system_info['uptime_days'] }} days, {{ system_info['uptime_hours'] }} hours,
8+
{{ system_info['uptime_minutes'] }} minutes, {{ system_info['uptime_seconds'] }} seconds
9+
</p>
710
</div>
811
</div>
912
</div>
10-
{% endif %}
13+
{% endif %}
14+
15+
<script>
16+
// Function to format uptime as 'X days, Y hours, Z minutes, W seconds'
17+
function formatUptime(days, hours, minutes, seconds) {
18+
let uptimeString = `${days} days, ${hours} hours, ${minutes} minutes, ${seconds} seconds`;
19+
return uptimeString;
20+
}
21+
22+
// Initial uptime values from the backend
23+
let days = parseInt('{{ system_info["uptime_days"] }}');
24+
let hours = parseInt('{{ system_info["uptime_hours"] }}');
25+
let minutes = parseInt('{{ system_info["uptime_minutes"] }}');
26+
let seconds = parseInt('{{ system_info["uptime_seconds"] }}');
27+
28+
// Function to update uptime
29+
function updateUptime() {
30+
seconds++;
31+
if (seconds >= 60) {
32+
seconds = 0;
33+
minutes++;
34+
if (minutes >= 60) {
35+
minutes = 0;
36+
hours++;
37+
if (hours >= 24) {
38+
hours = 0;
39+
days++;
40+
}
41+
}
42+
}
43+
44+
// Update the display
45+
document.getElementById('system-uptime').textContent = formatUptime(days, hours, minutes, seconds);
46+
}
47+
48+
// Update the uptime every second
49+
setInterval(updateUptime, 1000);
50+
</script>

src/templates/feature_toggles.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,27 @@ <h1 class="settings-title">Feature Toggles</h1>
1212

1313
<div class="form-group">
1414
<label for="is_cpu_info_enabled">Enable CPU Information:</label>
15-
<input type="checkbox" id="is_cpu_info_enabled" name="is_cpu_info_enabled" {% if settings.is_cpu_info_enabled %}checked{% endif %}>
15+
<input type="checkbox" id="is_cpu_info_enabled" name="is_cpu_info_enabled" {% if feature_toggles_settings.is_cpu_info_enabled %}checked{% endif %}>
1616
</div>
1717

1818
<div class="form-group">
1919
<label for="is_memory_info_enabled">Enable Memory Information:</label>
20-
<input type="checkbox" id="is_memory_info_enabled" name="is_memory_info_enabled" {% if settings.is_memory_info_enabled %}checked{% endif %}>
20+
<input type="checkbox" id="is_memory_info_enabled" name="is_memory_info_enabled" {% if feature_toggles_settings.is_memory_info_enabled %}checked{% endif %}>
2121
</div>
2222

2323
<div class="form-group">
2424
<label for="is_disk_info_enabled">Enable Disk Information:</label>
25-
<input type="checkbox" id="is_disk_info_enabled" name="is_disk_info_enabled" {% if settings.is_disk_info_enabled %}checked{% endif %}>
25+
<input type="checkbox" id="is_disk_info_enabled" name="is_disk_info_enabled" {% if feature_toggles_settings.is_disk_info_enabled %}checked{% endif %}>
2626
</div>
2727

2828
<div class="form-group">
2929
<label for="is_network_info_enabled">Enable Network Information:</label>
30-
<input type="checkbox" id="is_network_info_enabled" name="is_network_info_enabled" {% if settings.is_network_info_enabled %}checked{% endif %}>
30+
<input type="checkbox" id="is_network_info_enabled" name="is_network_info_enabled" {% if feature_toggles_settings.is_network_info_enabled %}checked{% endif %}>
3131
</div>
3232

3333
<div class="form-group">
3434
<label for="is_process_info_enabled">Enable Process Information:</label>
35-
<input type="checkbox" id="is_process_info_enabled" name="is_process_info_enabled" {% if settings.is_process_info_enabled %}checked{% endif %}>
35+
<input type="checkbox" id="is_process_info_enabled" name="is_process_info_enabled" {% if feature_toggles_settings.is_process_info_enabled %}checked{% endif %}>
3636
</div>
3737

3838
<button type="submit" class="btn btn-primary">Save Settings</button>

0 commit comments

Comments
 (0)