Skip to content

Commit fc387a8

Browse files
feat: Update routes and templates for dashboard changes
1 parent e257a50 commit fc387a8

11 files changed

Lines changed: 312 additions & 281 deletions

File tree

src/routes/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,7 @@
88
from src.routes.system_health import system_health_bp
99
from src.routes.process import process_bp
1010
from src.routes.auth import auth_bp
11-
from src.routes.other import other_bp
11+
from src.routes.homepage import homepages_bp
12+
from src.routes.other import other_bp
13+
from src.routes.smtp_email_config import smtp_email_config_bp
14+
from src.routes.user import user_bp

src/routes/auth.py

Lines changed: 4 additions & 202 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,24 @@
11
import datetime
2-
from flask import Flask, render_template, redirect, url_for, request, blueprints, flash
3-
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
4-
from flask_sqlalchemy import SQLAlchemy
2+
from flask import render_template, redirect, url_for, request, blueprints, flash
3+
from flask_login import LoginManager, login_user, login_required, logout_user, current_user
54
from werkzeug.security import generate_password_hash, check_password_hash
65

7-
8-
from flask import Flask, render_template, request, jsonify
9-
import subprocess
10-
116
from src.scripts.email_me import send_smpt_email
12-
137
from src.config import app, db
14-
from src.models import User, SmptEamilPasswordConfig, DashboardSettings
8+
from src.models import User, DashboardSettings
159
from src.utils import render_template_from_file
10+
from src.routes.helper import get_email_addresses
1611

1712
auth_bp = blueprints.Blueprint('auth', __name__)
1813

19-
# Configure Flask-Login
2014
login_manager = LoginManager()
2115
login_manager.init_app(app)
2216
login_manager.login_view = 'login'
2317

24-
# Define the User model
25-
2618
@login_manager.user_loader
2719
def load_user(user_id):
2820
return User.query.get(int(user_id))
2921

30-
31-
def get_email_addresses(user_level=None, receive_email_alerts=True, fetch_all_users=False):
32-
with app.app_context():
33-
# Build query filter based on the presence of `user_level`
34-
filters = []
35-
if user_level:
36-
filters.append(User.user_level == user_level)
37-
if not fetch_all_users:
38-
filters.append(User.receive_email_alerts == receive_email_alerts)
39-
40-
# Query the database with the constructed filters
41-
users = User.query.filter(*filters).all()
42-
43-
# Check if no users were found
44-
if not users:
45-
return None
46-
47-
# Return list of email addresses
48-
return [user.email for user in users]
49-
5022
@app.route('/login', methods=['GET', 'POST'])
5123
def login():
5224
if request.method == 'POST':
@@ -144,105 +116,6 @@ def signup():
144116

145117
return render_template('signup.html')
146118

147-
@app.route('/protected')
148-
@login_required
149-
def protected():
150-
if current_user.user_level == 'admin':
151-
return f'Hello, Admin {current_user.username}! This is a protected page.'
152-
return f'Hello, {current_user.username}! This is a protected page.'
153-
154-
@app.route('/users')
155-
@login_required
156-
def view_users():
157-
if current_user.user_level != 'admin':
158-
flash("Your account does not have permission to view this page.", "danger")
159-
return render_template("error/permission_denied.html")
160-
161-
# Fetch all users from the database
162-
users = User.query.all()
163-
164-
return render_template('view_users.html', users=users)
165-
166-
@app.route('/user/<username>', methods=['GET', 'POST'])
167-
@login_required
168-
def change_user_settings(username):
169-
user = User.query.filter_by(username=username).first_or_404()
170-
171-
if request.method == 'POST':
172-
new_username = request.form['username']
173-
new_email = request.form['email']
174-
new_user_level = request.form['user_level']
175-
receive_email_alerts = 'receive_email_alerts' in request.form
176-
177-
# Update user details
178-
user.username = new_username
179-
user.email = new_email
180-
user.user_level = new_user_level
181-
user.receive_email_alerts = receive_email_alerts
182-
183-
db.session.commit()
184-
185-
flash('User settings updated successfully!', 'success')
186-
return redirect(url_for('change_user_settings', username=user.username))
187-
188-
return render_template('change_user.html', user=user)
189-
190-
@app.route('/delete_user/<username>', methods=['POST'])
191-
@login_required
192-
def delete_user(username):
193-
if current_user.user_level != 'admin':
194-
flash("Your account does not have permission to perform this action.", "danger")
195-
return redirect(url_for('view_users')) # Redirect to the users page
196-
197-
user = User.query.filter_by(username=username).first_or_404()
198-
199-
# Get Admin Emails with Alerts Enabled:
200-
admin_email_address = get_email_addresses(user_level='admin', receive_email_alerts=True)
201-
if admin_email_address:
202-
subject = "User Deletion Alert"
203-
context = {
204-
"username": user.username,
205-
"deletion_time": datetime.datetime.now(),
206-
"current_user": current_user.username,
207-
}
208-
html_body = render_template_from_file("src/templates/email_templates/deletion_email.html", **context)
209-
send_smpt_email(admin_email_address, subject, html_body, is_html=True)
210-
211-
db.session.delete(user)
212-
db.session.commit()
213-
214-
215-
216-
flash(f'User {username} has been deleted successfully!', 'success')
217-
return redirect(url_for('view_users'))
218-
219-
@app.route("/update-email-password", methods=["GET", "POST"])
220-
@login_required
221-
def update_smpt_email_password():
222-
smtp_config = SmptEamilPasswordConfig.query.first()
223-
224-
if request.method == "POST":
225-
new_email = request.form.get("email")
226-
new_password = request.form.get("password")
227-
228-
if not new_email or not new_password:
229-
flash("Please provide email and password.", "danger")
230-
return redirect(url_for("update_smpt_email_password"))
231-
232-
233-
if not smtp_config:
234-
smtp_config = SmptEamilPasswordConfig(email=new_email, password=new_password)
235-
db.session.add(smtp_config)
236-
else:
237-
smtp_config.email = new_email
238-
smtp_config.password = new_password
239-
240-
db.session.commit()
241-
flash("Email and password updated successfully!", "success")
242-
return redirect(url_for("update_smpt_email_password"))
243-
244-
return render_template("update_smpt_email_password.html", smtp_config=smtp_config)
245-
246119
@app.route("/send_email", methods=["GET", "POST"])
247120
@login_required
248121
def send_email_page():
@@ -301,74 +174,3 @@ def send_email_page():
301174

302175
return render_template("send_email.html", enable_alerts=enable_alerts)
303176

304-
@app.route('/terminal', methods=['GET', 'POST'])
305-
@login_required
306-
def terminal():
307-
if current_user.user_level != 'admin':
308-
flash("Your account does not have permission to view this page.", "danger")
309-
return render_template("error/permission_denied.html")
310-
if request.method == 'POST':
311-
command = request.form.get('command')
312-
if command:
313-
try:
314-
# Run the command and capture the output
315-
output = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT, universal_newlines=True)
316-
except subprocess.CalledProcessError as e:
317-
# If the command fails, capture the error output
318-
output = e.output
319-
return jsonify(output=output)
320-
return render_template('terminal.html')
321-
322-
@app.route('/add_user', methods=['GET', 'POST'])
323-
@login_required
324-
def add_user():
325-
if current_user.user_level != 'admin':
326-
flash("Your account does not have permission to view this page.", "danger")
327-
return render_template("error/permission_denied.html")
328-
if request.method == 'POST':
329-
username = request.form['username']
330-
email = request.form['email']
331-
password = request.form['password']
332-
user_level = request.form.get('user_level', 'user')
333-
receive_email_alerts = request.form.get('receive_email_alerts', 'on') == 'on'
334-
335-
# Check if user already exists
336-
if User.query.filter_by(username=username).first() or User.query.filter_by(email=email).first():
337-
flash('Username or email already exists.', 'danger')
338-
return redirect(url_for('add_user'))
339-
340-
new_user = User(
341-
username=username,
342-
email=email,
343-
password=generate_password_hash(password),
344-
user_level=user_level,
345-
receive_email_alerts=receive_email_alerts
346-
)
347-
348-
admin_email_address = get_email_addresses(user_level='admin', receive_email_alerts=True)
349-
if admin_email_address:
350-
subject = "New User Alert"
351-
context = {
352-
"current_user": current_user.username,
353-
"username": new_user.username,
354-
"email": new_user.email,
355-
"signup_time": datetime.datetime.now(),
356-
"user_level": new_user.user_level
357-
}
358-
html_body = render_template_from_file("src/templates/email_templates/new_user_create.html", **context)
359-
send_smpt_email(admin_email_address, subject, html_body, is_html=True)
360-
361-
subject = "Welcome to the systemGuard"
362-
context = {
363-
"username": new_user.username,
364-
"email": new_user.email,
365-
}
366-
html_body = render_template_from_file("src/templates/email_templates/welcome.html", **context)
367-
send_smpt_email(email, subject, html_body, is_html=True)
368-
369-
db.session.add(new_user)
370-
db.session.commit()
371-
flash('User created successfully!', 'success')
372-
return redirect(url_for('view_users'))
373-
374-
return render_template('add_user.html')

src/routes/helper.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from flask import blueprints
2+
from src.models import User
3+
from src.config import app
4+
from flask_login import LoginManager
5+
6+
7+
def get_email_addresses(user_level=None, receive_email_alerts=True, fetch_all_users=False):
8+
with app.app_context():
9+
# Build query filter based on the presence of `user_level`
10+
filters = []
11+
if user_level:
12+
filters.append(User.user_level == user_level)
13+
if not fetch_all_users:
14+
filters.append(User.receive_email_alerts == receive_email_alerts)
15+
16+
# Query the database with the constructed filters
17+
users = User.query.filter(*filters).all()
18+
19+
# Check if no users were found
20+
if not users:
21+
return None
22+
23+
# Return list of email addresses
24+
return [user.email for user in users]

src/routes/homepage.py

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

0 commit comments

Comments
 (0)