Skip to content

Commit eb7872b

Browse files
chore: experimental dashboard added
1 parent 38b23e3 commit eb7872b

35 files changed

Lines changed: 734 additions & 61 deletions

line_counter.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import os
2+
3+
# Define the root directory of your project
4+
root_dir = "."
5+
6+
# Define the file extensions to look for
7+
file_types = {
8+
'Python': ['.py'],
9+
'HTML': ['.html', '.htm'],
10+
"Shell": ['.sh'],
11+
'JavaScript': ['.js'],
12+
'CSS': ['.css'],
13+
'Other': [] # Add other file types if needed
14+
}
15+
16+
# Function to count lines in a file
17+
def count_lines_in_file(file_path):
18+
with open(file_path, 'r', encoding='utf-8', errors='ignore') as file:
19+
return sum(1 for _ in file)
20+
21+
# Initialize counters for each file type
22+
line_counts = {key: 0 for key in file_types}
23+
line_counts['Other'] = 0 # Initialize 'Other' file type counter
24+
25+
# Walk through the directory and count lines
26+
for dirpath, _, filenames in os.walk(root_dir):
27+
for filename in filenames:
28+
file_ext = os.path.splitext(filename)[1]
29+
file_path = os.path.join(dirpath, filename)
30+
31+
# Determine the file type and update counts
32+
counted = False
33+
for file_type, extensions in file_types.items():
34+
if file_ext in extensions:
35+
line_counts[file_type] += count_lines_in_file(file_path)
36+
counted = True
37+
break
38+
39+
# If the file type is not recognized, count under 'Other'
40+
if not counted:
41+
line_counts['Other'] += count_lines_in_file(file_path)
42+
43+
# Print the results in a table format
44+
print(f"{'File Type':<10} | {'Number of Lines':<15}")
45+
print("-" * 30)
46+
for file_type, count in line_counts.items():
47+
print(f"{file_type:<10} | {count:<15}")
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
[
2+
{
3+
"card_name": "User Info",
4+
"card_description": "Displays user information",
5+
"card_color": "#00bfff",
6+
"card_length": 300,
7+
"card_position": 1,
8+
"card_data": {},
9+
"is_enabled": true
10+
},
11+
{
12+
"card_name": "Server Stats",
13+
"card_description": "Shows server statistics",
14+
"card_color": "#ff6347",
15+
"card_length": 300,
16+
"card_position": 2,
17+
"card_data": {},
18+
"is_enabled": true
19+
},
20+
{
21+
"card_name": "Battery Status",
22+
"card_description": "Displays battery status",
23+
"card_color": "#32cd32",
24+
"card_length": 300,
25+
"card_position": 3,
26+
"card_data": {},
27+
"is_enabled": true
28+
},
29+
{
30+
"card_name": "CPU Core Usage",
31+
"card_description": "Shows CPU core usage",
32+
"card_color": "#ffd700",
33+
"card_length": 300,
34+
"card_position": 4,
35+
"card_data": {},
36+
"is_enabled": true
37+
},
38+
{
39+
"card_name": "CPU Usage",
40+
"card_description": "Displays CPU usage",
41+
"card_color": "#ff4500",
42+
"card_length": 300,
43+
"card_position": 5,
44+
"card_data": {},
45+
"is_enabled": true
46+
},
47+
{
48+
"card_name": "CPU Temperature",
49+
"card_description": "Shows CPU temperature",
50+
"card_color": "#ff1493",
51+
"card_length": 300,
52+
"card_position": 6,
53+
"card_data": {},
54+
"is_enabled": true
55+
},
56+
{
57+
"card_name": "Memory Usage",
58+
"card_description": "Displays memory usage",
59+
"card_color": "#00ff7f",
60+
"card_length": 300,
61+
"card_position": 7,
62+
"card_data": {},
63+
"is_enabled": true
64+
},
65+
{
66+
"card_name": "Disk Usage",
67+
"card_description": "Shows disk usage",
68+
"card_color": "#8a2be2",
69+
"card_length": 300,
70+
"card_position": 8,
71+
"card_data": {},
72+
"is_enabled": true
73+
},
74+
{
75+
"card_name": "System Uptime",
76+
"card_description": "Displays system uptime",
77+
"card_color": "#7fff00",
78+
"card_length": 300,
79+
"card_position": 9,
80+
"card_data": {},
81+
"is_enabled": true
82+
},
83+
{
84+
"card_name": "Network Statistics",
85+
"card_description": "Shows network statistics",
86+
"card_color": "#ff69b4",
87+
"card_length": 300,
88+
"card_position": 10,
89+
"card_data": {},
90+
"is_enabled": true
91+
},
92+
{
93+
"card_name": "Speedtest",
94+
"card_description": "Displays speedtest results",
95+
"card_color": "#00ced1",
96+
"card_length": 300,
97+
"card_position": 11,
98+
"card_data": {},
99+
"is_enabled": true
100+
}
101+
]

src/config.py

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
from flask import Flask
1+
from flask import Flask, render_template
22
from flask_sqlalchemy import SQLAlchemy
3+
from flask_migrate import Migrate
34

45
app = Flask(__name__)
56

@@ -10,8 +11,56 @@
1011

1112
# Initialize the database
1213
db = SQLAlchemy(app)
14+
migrate = Migrate(app, db)
15+
1316

1417
@app.cli.command("run")
1518
def server_start():
1619
print("Server started")
1720

21+
22+
23+
# 403 forbidden
24+
@app.errorhandler(403)
25+
def forbidden(e):
26+
return render_template("error/403.html"), 403
27+
28+
# not found page
29+
@app.errorhandler(404)
30+
def page_not_found(e):
31+
return render_template("error/404.html"), 404
32+
33+
# 405 method not allowed
34+
@app.errorhandler(405)
35+
def method_not_allowed(e):
36+
return "Method not allowed", 405
37+
38+
# internal server error 500
39+
@app.errorhandler(500)
40+
def internal_server_error(e):
41+
return "Internal server error", 500
42+
43+
# 502
44+
@app.errorhandler(502)
45+
def bad_gateway(e):
46+
return "Bad gateway", 502
47+
48+
# 503
49+
@app.errorhandler(503)
50+
def service_unavailable(e):
51+
return "Service unavailable", 503
52+
53+
class CustomError(Exception):
54+
pass
55+
56+
57+
58+
# Purpose: Run functions before or after each request, useful for tasks like logging, performance monitoring, or pre-processing requests
59+
# @app.before_request
60+
# def before_request_func():
61+
# print("This function runs before each request.")
62+
63+
# @app.after_request
64+
# def after_request_func(response):
65+
# print("This function runs after each request.")
66+
# return response

src/models/__init__.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22
from src.models.user_card_settings import UserCardSettings
33
from src.models.dashboard_netowrk import DashboardNetworkSettings
44
from src.models.user_dashboard_settings import UserDashboardSettings
5-
from src.models.feature_toggle_settings import PageToggleSettings
5+
from src.models.page_toggle_settings import PageToggleSettings
66
from src.models.application_general_settings import ApplicationGeneralSettings
77
from src.models.smtp_configuration import SMTPSettings
88
from src.models.network_speed_test_result import NetworkSpeedTestResult
99
from src.models.system_information import SystemInformation
1010
from src.models.user_profile import UserProfile
11+
from src.models.experimental import DashboardCard
1112
from flask_login import current_user
1213
from werkzeug.security import generate_password_hash
1314
import json
@@ -26,6 +27,24 @@
2627
db.session.add(UserDashboardSettings(user_id=user.id))
2728
db.session.add(UserCardSettings(user_id=user.id))
2829
db.session.add(PageToggleSettings(user_id=user.id))
30+
# card setting
31+
card_json = os.path.join(ROOT_DIR, "src/assets/initial_card_settings.json")
32+
with open(card_json, "r") as file:
33+
cards = json.load(file)
34+
for card in cards:
35+
new_card = DashboardCard(
36+
user_id=user.id,
37+
card_name=card["card_name"],
38+
card_description=card["card_description"],
39+
card_color=card["card_color"],
40+
card_length=card["card_length"],
41+
card_position=card["card_position"],
42+
card_data=card["card_data"]
43+
)
44+
db.session.add(new_card)
45+
46+
db.session.commit()
47+
print("Initial card data added.")
2948
db.session.commit()
3049

3150
pre_defined_users_json = os.path.join(ROOT_DIR, "src/assets/predefine_user.json")
@@ -57,7 +76,7 @@
5776
@app.context_processor
5877
def inject_settings():
5978
if current_user.is_anonymous:
60-
return dict(user_dashboard_settings=None, card_settings=None, page_toggles_settings=None, general_settings=None)
79+
return dict(user_dashboard_settings=None, card_settings=None, page_toggles_settings=None, general_settings=None, card_settings_2=None)
6180
general_settings = ApplicationGeneralSettings.query.first()
6281
card_settings = UserCardSettings.query.filter_by(user_id=current_user.id).first()
6382
user_dashboard_settings = UserDashboardSettings.query.filter_by(
@@ -66,10 +85,12 @@ def inject_settings():
6685
page_toggles_settings = PageToggleSettings.query.filter_by(
6786
user_id=current_user.id
6887
).first()
88+
card_settings_2 = DashboardCard.query.filter_by(user_id=current_user.id).all()
6989
all_settings = dict(
7090
user_dashboard_settings=user_dashboard_settings,
7191
general_settings=general_settings,
7292
card_settings=card_settings,
93+
card_settings_2=card_settings_2,
7394
page_toggles_settings=page_toggles_settings,
7495
)
7596
return all_settings

src/models/experimental.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from src.config import db, app
2+
3+
4+
class DashboardCard(db.Model):
5+
__tablename__ = 'dashboard_cards'
6+
7+
id = db.Column(db.Integer, primary_key=True) # Primary key field
8+
user_id = db.Column(db.Integer, db.ForeignKey('users.id')) # Foreign key to the user
9+
card_name = db.Column(db.String(100), nullable=False) # Name of the card
10+
card_description = db.Column(db.Text, nullable=True) # Description of the card
11+
card_data = db.Column(db.JSON, nullable=True) # Data associated with the card (could be JSON)
12+
card_icon = db.Column(db.String(100), nullable=True) # Icon associated with the card
13+
card_color = db.Column(db.String(7), default='#ffffff') # Color of the card in hex format
14+
card_length = db.Column(db.Integer, default="small") # small, medium, large
15+
card_position = db.Column(db.Integer, default=0) # Position of the card on the dashboard
16+
card_enabled = db.Column(db.Boolean, default=True) # Is the card enabled on the dashboard
17+
18+
def __repr__(self):
19+
return f'<DashboardCard {self.card_name}>'
20+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ class PageToggleSettings(db.Model):
1313
is_disk_info_enabled = db.Column(db.Boolean, default=True)
1414
is_network_info_enabled = db.Column(db.Boolean, default=True)
1515
is_process_info_enabled = db.Column(db.Boolean, default=True)
16+
is_dashboard_network_enabled = db.Column(db.Boolean, default=False)

src/routes/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
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.homepage import homepages_bp
11+
from src.routes.network import network_bp
1212
from src.routes.other import other_bp
1313
from src.routes.smtp_email_config import smtp_email_config_bp
14-
from src.routes.user import user_bp
14+
from src.routes.user import user_bp
15+
from src.routes.experimental import experimental_bp

src/routes/cpu_info.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def cpu_usage():
1515
page_toggles_settings = PageToggleSettings.query.first()
1616
if not page_toggles_settings.is_cpu_info_enabled:
1717
flash("You do not have permission to view this page.", "danger")
18-
return render_template("error/permission_denied.html")
18+
return render_template("error/403.html")
1919

2020
current_temp, high_temp, critical_temp = get_cpu_temp()
2121
cpu_core = get_cached_value("cpu_core", get_cpu_core_count)

src/routes/dashbaord.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
dashboard_bp = blueprints.Blueprint("dashboard", __name__)
1010

11-
@app.route("/dashboard", methods=["GET"])
11+
@app.route("/", methods=["GET"])
1212
@login_required
1313
def dashboard():
1414
user_dashboard_settings = UserDashboardSettings.query.first()

src/routes/disk_info.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def disk_usage():
1414
page_toggles_settings = PageToggleSettings.query.first()
1515
if not page_toggles_settings.is_disk_info_enabled:
1616
flash("You do not have permission to view this page.", "danger")
17-
return render_template("error/permission_denied.html")
17+
return render_template("error/403.html")
1818
disk_total = get_cached_value("disk_total", get_disk_total)
1919
system_info = {
2020
"disk_usage": get_disk_usage_percent(),

0 commit comments

Comments
 (0)