Skip to content

Commit e257a50

Browse files
feat: Update routes and templates for dashboard changes
- Update app.py to register the dashboard_bp instead of the homepage_bp - Rename src/routes/homepage.py to src/routes/dashboard.py - Update src/routes/__init__.py to import and use the dashboard_bp instead of the homepage_bp - Update src/templates/ext/navbar.html to reflect the changes in the dashboard link - Add new templates: src/templates/dashboard_network.html and src/templates/add_server.html - Add new CSS files: src/static/css/dashboard_network.css and src/static/css/add_server.css
1 parent f1a4389 commit e257a50

13 files changed

Lines changed: 473 additions & 64 deletions

File tree

app.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from src.scripts.email_me import send_smpt_email
77

88
def register_routes():
9-
app.register_blueprint(routes.homepage_bp)
9+
app.register_blueprint(routes.dashboard_bp)
1010
app.register_blueprint(routes.settings_bp)
1111
app.register_blueprint(routes.system_health_bp)
1212
app.register_blueprint(routes.cpu_info_bp)

src/models.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,19 @@ def __repr__(self):
9797
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}>"
9898

9999

100+
# home page to show links to multiple dashbaord
101+
class DashboardNetwork(db.Model):
102+
__tablename__ = "DashboardGroup"
103+
id = db.Column(db.Integer, primary_key=True)
104+
name = db.Column(db.String(50), unique=True, nullable=False)
105+
description = db.Column(db.String(150), nullable=True)
106+
ip_address = db.Column(db.String(50), nullable=True)
107+
port = db.Column(db.Integer, nullable=True)
108+
link = db.Column(db.String(150), nullable=True)
109+
110+
def __repr__(self):
111+
return f"<DashboardGroup {self.name}, {self.description}>"
112+
100113

101114
class SmptEamilPasswordConfig(db.Model):
102115
__tablename__ = "SmptEamilPasswordConfig"
@@ -122,7 +135,6 @@ class SmptEamilPasswordConfig(db.Model):
122135
db.session.add(DashboardSettings(user_id=user.id))
123136
db.session.commit()
124137

125-
126138
pre_defined_users_json = "src/assets/predefine_user.json"
127139
with open(pre_defined_users_json, "r") as file:
128140
pre_defined_users = json.load(file)

src/routes/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from src.routes.cpu_info import cpu_info_bp
22
from src.routes.disk_info import disk_info_bp
3-
from src.routes.homepage import homepage_bp
3+
from src.routes.dashbaord import dashboard_bp
44
from src.routes.memory_info import memory_info_bp
55
from src.routes.network_info import network_info_bp
66
from src.routes.settings import settings_bp
77
from src.routes.speedtest import speedtest_bp
88
from src.routes.system_health import system_health_bp
99
from src.routes.process import process_bp
10-
from src.routes.auth import auth_bp
10+
from src.routes.auth import auth_bp
11+
from src.routes.other import other_bp
Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
from src.models import SpeedTestResult, DashboardSettings, SystemInfo
77
from src.utils import datetimeformat, get_system_info
88

9-
homepage_bp = blueprints.Blueprint("homepage", __name__)
9+
dashboard_bp = blueprints.Blueprint("dashboard", __name__)
1010

11-
@app.route("/")
11+
@app.route("/dashboard", methods=["GET"])
1212
@login_required
1313
def dashboard():
1414
settings = DashboardSettings.query.first()
@@ -57,36 +57,4 @@ def dashboard():
5757
show_prompt=show_prompt,
5858
current_user=current_user,
5959
)
60-
# if current_user.profession == "developer":
61-
# return render_template(
62-
# "dashboard/developer.html",
63-
# system_info=system_info,
64-
# speedtest_result=speedtest_result,
65-
# source=source,
66-
# last_timestamp=last_timestamp,
67-
# next_test_time=remaining_time_for_next_test,
68-
# show_prompt=show_prompt,
69-
# current_user=current_user,
70-
# )
71-
# elif current_user.profession == "manager":
72-
# return render_template(
73-
# "dashboard/manager.html",
74-
# system_info=system_info,
75-
# speedtest_result=speedtest_result,
76-
# source=source,
77-
# last_timestamp=last_timestamp,
78-
# next_test_time=remaining_time_for_next_test,
79-
# show_prompt=show_prompt,
80-
# current_user=current_user,
81-
# )
82-
# else:
83-
# return render_template(
84-
# "dashboard/developer.html",
85-
# system_info=system_info,
86-
# speedtest_result=speedtest_result,
87-
# source=source,
88-
# last_timestamp=last_timestamp,
89-
# next_test_time=remaining_time_for_next_test,
90-
# show_prompt=show_prompt,
91-
# current_user=current_user,
92-
# )
60+

src/routes/other.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import psutil
2+
from flask import render_template, blueprints, flash, redirect, url_for, request
3+
from flask_login import login_required, current_user
4+
5+
from src.config import app, db
6+
from src.utils import get_cached_value, get_memory_percent, get_memory_available, get_memory_used, get_swap_memory_info
7+
from src.models import DashboardSettings, DashboardNetwork
8+
9+
other_bp = blueprints.Blueprint("other", __name__)
10+
11+
12+
from flask import render_template
13+
from src.models import DashboardNetwork
14+
from flask_login import login_required
15+
16+
@app.route('/', methods=['GET'])
17+
@login_required
18+
def dashboard_network():
19+
groups = DashboardNetwork.query.all() # Fetch all dashboard groups
20+
return render_template('dashboard_network.html', groups=groups)
21+
22+
23+
@app.route('/add_server', methods=['GET', 'POST'])
24+
def add_server():
25+
if request.method == 'POST':
26+
name = request.form.get('name')
27+
description = request.form.get('description')
28+
ip_address = request.form.get('ip_address')
29+
port = request.form.get('port')
30+
link = request.form.get('link')
31+
32+
# Check if the server name already exists
33+
existing_server = DashboardNetwork.query.filter_by(name=name).first()
34+
if existing_server:
35+
flash('Server name already exists. Please choose a different name.', 'danger')
36+
return redirect(url_for('add_server'))
37+
38+
# Create a new server entry
39+
new_server = DashboardNetwork(name=name, description=description, ip_address=ip_address, port=port, link=link)
40+
db.session.add(new_server)
41+
db.session.commit()
42+
43+
flash('Server added successfully!', 'success')
44+
return redirect(url_for('dashboard_network'))
45+
46+
return render_template('add_server.html')
47+
48+
@app.route('/edit_server/<int:server_id>', methods=['GET', 'POST'])
49+
@login_required
50+
def edit_server(server_id):
51+
if current_user.user_level != 'admin':
52+
flash('You are not authorized to access this page.', 'danger')
53+
return render_template("error/permission_denied.html")
54+
55+
server = DashboardNetwork.query.get_or_404(server_id)
56+
if request.method == 'POST':
57+
server.name = request.form['name']
58+
server.description = request.form['description']
59+
server.ip_address = request.form['ip_address']
60+
server.port = request.form['port']
61+
server.link = request.form['link']
62+
db.session.commit()
63+
flash('Server updated successfully!', 'success')
64+
return redirect(url_for('dashboard_network'))
65+
return render_template('edit_server.html', server=server)
66+
67+
@app.route('/delete_server/<int:server_id>', methods=['POST'])
68+
@login_required
69+
def delete_server(server_id):
70+
if current_user.user_level != 'admin':
71+
flash('You are not authorized to access this page.', 'danger')
72+
return render_template("error/permission_denied.html")
73+
server = DashboardNetwork.query.get_or_404(server_id)
74+
db.session.delete(server)
75+
db.session.commit()
76+
flash('Server deleted successfully!', 'success')
77+
return redirect(url_for('dashboard_network'))

src/static/css/add_server.css

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
body {
2+
font-family: Arial, sans-serif;
3+
background-color: #f4f4f4;
4+
color: #333;
5+
}
6+
7+
.container {
8+
max-width: 600px;
9+
margin: 50px auto;
10+
padding: 30px;
11+
background-color: #fff;
12+
border-radius: 10px;
13+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
14+
}
15+
16+
h1 {
17+
text-align: center;
18+
color: #333;
19+
font-size: 24px;
20+
margin-bottom: 30px;
21+
font-weight: 600;
22+
}
23+
24+
.form-group {
25+
margin-bottom: 20px;
26+
}
27+
28+
label {
29+
display: block;
30+
margin-bottom: 8px;
31+
font-weight: bold;
32+
color: #555;
33+
}
34+
35+
input[type="text"],
36+
input[type="number"],
37+
textarea,
38+
select {
39+
width: 100%;
40+
padding: 12px;
41+
margin-bottom: 10px;
42+
border: 1px solid #ccc;
43+
border-radius: 6px;
44+
font-size: 14px;
45+
transition: border-color 0.3s ease;
46+
}
47+
48+
input[type="text"]:focus,
49+
input[type="number"]:focus,
50+
textarea:focus,
51+
select:focus {
52+
border-color: #007bff;
53+
outline: none;
54+
}
55+
56+
button {
57+
display: block;
58+
width: 100%;
59+
padding: 12px;
60+
background-color: #007bff;
61+
color: #fff;
62+
border: none;
63+
border-radius: 6px;
64+
font-size: 16px;
65+
font-weight: 600;
66+
cursor: pointer;
67+
transition: background-color 0.3s ease;
68+
}
69+
70+
button:hover {
71+
background-color: #0056b3;
72+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
.container {
2+
max-width: 1200px;
3+
margin: 0 auto;
4+
padding: 20px;
5+
text-align: center;
6+
}
7+
8+
.card-container {
9+
display: flex;
10+
flex-wrap: wrap;
11+
gap: 20px;
12+
justify-content: center;
13+
}
14+
15+
.card {
16+
background-color: #f8f9fa;
17+
border: 1px solid #ddd;
18+
border-radius: 8px;
19+
padding: 20px;
20+
width: calc(33.333% - 40px); /* Adjust based on gaps */
21+
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
22+
text-decoration: none;
23+
color: #333;
24+
transition: transform 0.2s;
25+
}
26+
27+
.card:hover {
28+
transform: translateY(-5px);
29+
}
30+
31+
.card h2 {
32+
margin-top: 0;
33+
font-size: 1.5em;
34+
}
35+
36+
.card p {
37+
margin: 5px 0;
38+
}
39+
40+
.add-server-link {
41+
margin-top: 20px;
42+
}
43+
44+
.add-server-link .btn {
45+
font-size: 1.2em;
46+
padding: 10px 20px;
47+
border-radius: 5px;
48+
background-color: #007bff;
49+
color: white;
50+
text-decoration: none;
51+
transition: background-color 0.3s;
52+
}
53+
54+
.add-server-link .btn:hover {
55+
background-color: #0056b3;
56+
}
57+
58+
/* Responsive layout */
59+
@media (max-width: 992px) {
60+
.card {
61+
width: calc(50% - 30px); /* Two cards per line on medium screens */
62+
}
63+
}
64+
65+
@media (max-width: 768px) {
66+
.card {
67+
width: calc(100% - 40px); /* One card per line on small screens */
68+
}
69+
}
70+
71+
.card-actions {
72+
margin-top: 10px;
73+
}
74+
75+
.card-actions .btn {
76+
margin-right: 5px;
77+
padding: 5px 10px;
78+
font-size: 14px;
79+
}
80+
81+
.card-actions .btn-warning {
82+
background-color: #ffc107;
83+
border-color: #ffc107;
84+
color: #fff;
85+
}
86+
87+
.card-actions .btn-danger {
88+
background-color: #dc3545;
89+
border-color: #dc3545;
90+
color: #fff;
91+
}

0 commit comments

Comments
 (0)