Skip to content

Commit c85e2cf

Browse files
Merge pull request #3 from codeperfectplus/features/ui_design
Features/UI design
2 parents b4704f9 + 1542bc5 commit c85e2cf

102 files changed

Lines changed: 3660 additions & 600 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,25 @@ chmod +x install_miniconda.sh && sudo ./install_miniconda.sh
5656
- Responsive design that works on mobile, tablet, and desktop.
5757
- Update itself to the latest version.
5858
- Easy download and installation using a bash script.
59+
- Logged user and admin user will get the notification if the user kill some process manully on dashbaord.
60+
- Different email alerts for different actions.
61+
- Different Dashboards for different users.(Deveoper, Admin, IT Manager, Manager)
62+
63+
## Email Feature 📧
64+
65+
| Email Alert | Is implemented | who will get the email |
66+
| ----------- | -------------- | ---------------------- |
67+
| Process Killed | Yes | Logged User |
68+
| Login | Yes | Admin User and Logged User |
69+
| Logout | Yes | Logged User |
70+
| Signup | Yes | Admin User & signed up User |
71+
| Create User | Yes | Admin User & Created User |
72+
| Delete User | No | Admin User & Deleted User |
73+
| Speed Test | Yes | Logged User |
74+
| Server Up | Yes | Admin User |
75+
| Notification Settings Change | Yes | Admin User |
76+
| Signup | Yes(few changes required) | Admin User & Logged User |
77+
5978

6079

6180
## Product Screenshots 📸

app.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
from src.config import app, db
1+
import datetime
2+
from src.config import app
23
from src import routes
4+
from src.utils import render_template_from_file, get_flask_memory_usage, cpu_usage_percent, get_memory_percent
5+
from src.models import UserProfile
6+
from src.scripts.email_me import send_smpt_email
37

48
def register_routes():
5-
app.register_blueprint(routes.homepage_bp)
9+
app.register_blueprint(routes.dashboard_bp)
610
app.register_blueprint(routes.settings_bp)
711
app.register_blueprint(routes.system_health_bp)
812
app.register_blueprint(routes.cpu_info_bp)
@@ -12,9 +16,31 @@ def register_routes():
1216
app.register_blueprint(routes.speedtest_bp)
1317
app.register_blueprint(routes.process_bp)
1418

19+
app.config['is_server_up_email_sent'] = False
20+
21+
def server_up_email():
22+
with app.app_context():
23+
admin_emails = [user.email for user in UserProfile.query.filter_by(user_level="admin", receive_email_alerts=True).all()]
24+
if admin_emails:
25+
subject = "SystemGuard Server Started"
26+
context = {
27+
"current_time": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
28+
"cpu_usage": cpu_usage_percent(),
29+
"memory_usage": get_memory_percent(),
30+
"app_memory_usage": get_flask_memory_usage(),
31+
32+
}
33+
html_body = render_template_from_file("src/templates/email_templates/server_up.html", **context)
34+
# send_smpt_email(admin_emails, subject, html_body, is_html=True)
35+
print("Server up email sent to", admin_emails)
36+
1537

1638
if __name__ == "__main__":
1739
register_routes()
40+
# TODO: fix this email alert sent twice
41+
# if not app.config['is_server_up_email_sent']:
42+
# app.config['is_server_up_email_sent'] = True
43+
# server_up_email()
1844

1945
# # Start the memory-consuming program in a separate thread
2046
# memory_thread = threading.Thread(target=memory_consuming_program, daemon=True)

requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ psutil==5.9.5
33
gunicorn
44
flask-sqlalchemy
55
flask-login
6-
flask-session
6+
flask-session
7+
python-dotenv

src/assets/predefine_user.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[
2+
{
3+
"username": "admin",
4+
"email": "codeperfectplus@gmail.com",
5+
"password": "admin",
6+
"user_level": "admin",
7+
"profession": "developer",
8+
"receive_email_alerts": true
9+
},
10+
{
11+
"username": "manager",
12+
"email": "dr47806@gmail.com",
13+
"password": "manager",
14+
"user_level": "user",
15+
"profession": "manager",
16+
"receive_email_alerts": true
17+
}
18+
]

src/config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,7 @@
1010

1111
# Initialize the database
1212
db = SQLAlchemy(app)
13+
14+
@app.cli.command("run")
15+
def server_start():
16+
print("Server started")

src/models.py

Lines changed: 0 additions & 112 deletions
This file was deleted.

src/models/__init__.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
from src.config import db, app
2+
from src.models.user_card_settings import UserCardSettings
3+
from src.models.dashboard_netowrk import DashboardNetworkSettings
4+
from src.models.user_dashboard_settings import UserDashboardSettings
5+
from src.models.feature_toggle_settings import FeatureToggleSettings
6+
from src.models.application_general_settings import ApplicationGeneralSettings
7+
from src.models.smtp_configuration import SMTPSettings
8+
from src.models.network_speed_test_result import NetworkSpeedTestResult
9+
from src.models.system_information import SystemInformation
10+
from src.models.user_profile import UserProfile
11+
from flask_login import current_user
12+
from werkzeug.security import generate_password_hash
13+
import json
14+
15+
16+
17+
with app.app_context():
18+
print("Creating tables")
19+
db.create_all()
20+
21+
# initialize default dashboard user_dashboard_settings for users
22+
users = UserProfile.query.all()
23+
for user in users:
24+
if not user.dashboard_settings:
25+
db.session.add(UserDashboardSettings(user_id=user.id))
26+
db.session.add(UserCardSettings(user_id=user.id))
27+
db.session.add(FeatureToggleSettings(user_id=user.id))
28+
db.session.commit()
29+
30+
pre_defined_users_json = "src/assets/predefine_user.json"
31+
with open(pre_defined_users_json, "r") as file:
32+
pre_defined_users = json.load(file)
33+
for user in pre_defined_users:
34+
if not UserProfile.query.filter_by(user_level=user["user_level"]).first():
35+
hashed_password = generate_password_hash(user["password"])
36+
user = UserProfile(
37+
username=user["username"],
38+
email=user["email"],
39+
password=hashed_password,
40+
user_level=user["user_level"],
41+
receive_email_alerts=user["receive_email_alerts"],
42+
profession=user["profession"],
43+
)
44+
45+
db.session.add(user)
46+
db.session.commit()
47+
48+
# Initialize default user_dashboard_settings
49+
general_settings = ApplicationGeneralSettings.query.first()
50+
if not general_settings:
51+
db.session.add(ApplicationGeneralSettings())
52+
db.session.commit()
53+
54+
55+
# ibject for all templates
56+
@app.context_processor
57+
def inject_settings():
58+
if current_user.is_anonymous:
59+
return dict(user_dashboard_settings=None, card_settings=None)
60+
general_settings = ApplicationGeneralSettings.query.first()
61+
card_settings = UserCardSettings.query.filter_by(user_id=current_user.id).first()
62+
user_dashboard_settings = UserDashboardSettings.query.filter_by(
63+
user_id=current_user.id
64+
).first() # Retrieve user-specific user_dashboard_settings from DB
65+
feature_toggles_settings = FeatureToggleSettings.query.filter_by(
66+
user_id=current_user.id
67+
).first()
68+
all_settings = dict(
69+
user_dashboard_settings=user_dashboard_settings,
70+
general_settings=general_settings,
71+
card_settings=card_settings,
72+
feature_toggles_settings=feature_toggles_settings,
73+
)
74+
return all_settings
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from src.config import db
2+
3+
class ApplicationGeneralSettings(db.Model):
4+
__tablename__ = 'general_settings'
5+
6+
id = db.Column(db.Integer, primary_key=True)
7+
enable_alerts = db.Column(db.Boolean, default=True)
8+
timezone = db.Column(db.String(50), default='UTC')
9+
enable_cache = db.Column(db.Boolean, default=False)
10+

src/models/dashboard_netowrk.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from src.config import db
2+
3+
4+
class DashboardNetworkSettings(db.Model):
5+
__tablename__ = "DashboardGroup"
6+
id = db.Column(db.Integer, primary_key=True)
7+
name = db.Column(db.String(50), unique=True, nullable=False)
8+
description = db.Column(db.String(150), nullable=True)
9+
ip_address = db.Column(db.String(50), nullable=True)
10+
port = db.Column(db.Integer, nullable=True)
11+
link = db.Column(db.String(150), nullable=True)
12+
13+
def __repr__(self):
14+
return f"<DashboardGroup {self.name}, {self.description}>"
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from src.config import db
2+
3+
class FeatureToggleSettings(db.Model):
4+
__tablename__ = 'feature_toggle_settings'
5+
6+
id = db.Column(db.Integer, primary_key=True)
7+
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
8+
9+
# Feature Toggles
10+
is_cpu_info_enabled = db.Column(db.Boolean, default=True)
11+
is_memory_info_enabled = db.Column(db.Boolean, default=True)
12+
is_disk_info_enabled = db.Column(db.Boolean, default=True)
13+
is_network_info_enabled = db.Column(db.Boolean, default=True)
14+
is_process_info_enabled = db.Column(db.Boolean, default=True)

0 commit comments

Comments
 (0)