Skip to content

Commit 40485f6

Browse files
feat: 🔨 refactored the code
1 parent 9a68391 commit 40485f6

36 files changed

+284
-162
lines changed

app.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from src.config import app
1+
from src.config import app, db
2+
23
from src.blueprints import (
34
additional_bp,
45
admin_bp,
@@ -7,15 +8,18 @@
78
health_bp,
89
homepage_bp,
910
silver_calculator_bp,
11+
users_bp
1012
)
1113

14+
1215
app.register_blueprint(additional_bp)
13-
app.register_blueprint(admin_bp, url_prefix='/admin')
16+
app.register_blueprint(admin_bp, url_prefix='/')
1417
app.register_blueprint(auth_bp, url_prefix='/auth')
1518
app.register_blueprint(gold_calculator_bp)
1619
app.register_blueprint(health_bp)
1720
app.register_blueprint(homepage_bp)
1821
app.register_blueprint(silver_calculator_bp)
22+
app.register_blueprint(users_bp)
1923

2024

2125

requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ gunicorn
55
flask-sqlalchemy
66
Flask-Login
77
Flask-Bcrypt
8-
psutil
8+
psutil
9+
flask-admin

src/blueprints/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from src.blueprints.additional import additional_bp
2-
from src.blueprints.admin import admin_bp
2+
from src.blueprints.admin_dashboard import admin_bp
33
from src.blueprints.auth import auth_bp
44
from src.blueprints.gold_calculator import gold_calculator_bp
55
from src.blueprints.health import health_bp
66
from src.blueprints.homepage import homepage_bp
77
from src.blueprints.silver_calculator import silver_calculator_bp
8+
from src.blueprints.users import users_bp
89

910
__all__ = [
1011
'additional_bp',

src/blueprints/additional.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55

66
@additional_bp.route('/pricing')
77
def pricing() -> str:
8-
return render_template('pricing.html')
8+
return render_template('others/pricing.html')
99

1010
@additional_bp.route('/features')
1111
def features() -> str:
12-
return render_template('features.html')
12+
return render_template('others/features.html')
1313

1414
@additional_bp.route('/about')
1515
def about() -> str:
16-
return render_template('about.html')
16+
return render_template('others/about.html')
1717

1818
@additional_bp.route('/permission-denied')
1919
def permission_denied():
20-
return render_template('permission_denied.html')
20+
return render_template('others/permission_denied.html')
Lines changed: 11 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,8 @@
1010
from src.models import User, AuditLog, Settings, log_action
1111
from src.models import GoldTransaction, SilverTransaction, JewellerDetails, Settings
1212

13-
admin_bp = Blueprint('admin', __name__)
13+
admin_bp = Blueprint('admin_', __name__)
1414

15-
@admin_bp.route('/manage_users', methods=['GET', 'POST'])
16-
@login_required
17-
def manage_users():
18-
system_settings = Settings.query.first()
19-
if current_user.user_level != 'admin':
20-
return redirect(url_for('additional.permission_denied'))
21-
22-
users = User.query.all()
23-
24-
if request.method == 'POST':
25-
user_id = request.form.get('user_id')
26-
new_level = request.form.get('user_level')
27-
28-
user = User.query.get(user_id)
29-
if user:
30-
user.user_level = new_level
31-
db.session.commit()
32-
flash(f"User {user.username}'s level updated to {new_level}.", 'success')
33-
else:
34-
flash("User not found.", 'danger')
35-
36-
return render_template('manage_users.html', users=users, settings=system_settings)
3715

3816
@admin_bp.route('/settings', methods=['GET', 'POST'])
3917
@login_required
@@ -94,7 +72,7 @@ def str_to_bool(value):
9472
# if not settings changes add no changed done message, and dont't commit
9573
if not logs:
9674
flash("No changes made.", 'info')
97-
return redirect(url_for('admin.settings'))
75+
return redirect(url_for('admin_.settings'))
9876

9977
log_action(current_user.id, current_user.username, 'System Settings Change', details=logs)
10078

@@ -120,10 +98,10 @@ def str_to_bool(value):
12098
db.session.commit()
12199
for log in logs:
122100
flash(log, 'success')
123-
return redirect(url_for('admin.settings'))
101+
return redirect(url_for('admin_.settings'))
124102

125103
settings = Settings.query.first()
126-
return render_template('settings.html', settings=settings)
104+
return render_template('dashboard/settings.html', settings=settings)
127105

128106

129107
@admin_bp.route('/audit_log')
@@ -133,7 +111,7 @@ def audit_log():
133111
return redirect(url_for('home'))
134112

135113
logs = AuditLog.query.order_by(AuditLog.timestamp.desc()).all()
136-
return render_template('audit_log.html', logs=logs)
114+
return render_template('dashboard/audit_log.html', logs=logs)
137115

138116

139117
@admin_bp.route("/dashboard")
@@ -158,7 +136,7 @@ def dashboard():
158136
else:
159137
system_health = "Good"
160138

161-
return render_template('admin_dashboard.html',
139+
return render_template('dashboard/admin_dashboard.html',
162140
total_users=total_users,
163141
active_sessions=active_sessions,
164142
system_health=system_health,
@@ -168,7 +146,8 @@ def dashboard():
168146
settings=system_settings,
169147
current_user=current_user)
170148
elif current_user.user_level == 'customer':
171-
return render_template('customer_dashboard.html', audit_logs=audit_logs)
149+
audit_logs = AuditLog.query.filter_by(user_id=current_user.id)
150+
return render_template('dashboard/customer_dashboard.html', settings=system_settings)
172151

173152
# Silver calculator route
174153
@admin_bp.route('/history', methods=['GET'])
@@ -200,7 +179,7 @@ def history():
200179
'purity': t.purity, 'service_charge': t.service_charge, 'tax': t.tax, 'total': t.total, 'currency': t.currency,
201180
'timestamp': t.timestamp} for t in silver_transactions]
202181

203-
return render_template('history.html', transactions=transactions, selected_type=selected_type)
182+
return render_template('dashboard/history.html', transactions=transactions, selected_type=selected_type)
204183

205184
@admin_bp.route('/download_audit_log', methods=['POST'])
206185
def download_audit_log():
@@ -284,7 +263,7 @@ def update_jeweller_details():
284263
db.session.commit()
285264

286265
flash('Jeweller details updated successfully!', 'success')
287-
return redirect(url_for('admin.update_jeweller_details'))
266+
return redirect(url_for('admin_.update_jeweller_details'))
288267

289268
jeweller = JewellerDetails.query.first()
290-
return render_template('config.html', jeweller=jeweller, settings=system_settings)
269+
return render_template('dashboard/config.html', jeweller=jeweller, settings=system_settings)

src/blueprints/auth.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def register():
2727
db.session.add(user)
2828
db.session.commit()
2929
return redirect(url_for('auth.login'))
30-
return render_template('register.html')
30+
return render_template('admin/register.html')
3131

3232
@auth_bp.route("/login", methods=['GET', 'POST'])
3333
def login():
@@ -41,10 +41,10 @@ def login():
4141
log_action(user.id, user.username, 'Login', f'User {user.username} logged in.')
4242

4343
flash(f'Login successful as {user.username}', 'success')
44-
return redirect(url_for('admin.dashboard'))
44+
return redirect(url_for('admin_.dashboard'))
4545
else:
4646
flash('Login failed. Please check your credentials.', 'danger')
47-
return render_template('login.html', settings=system_settings)
47+
return render_template('admin/login.html', settings=system_settings)
4848

4949
@auth_bp.route("/change-password", methods=['GET', 'POST'])
5050
@login_required
@@ -69,9 +69,9 @@ def change_password():
6969
# if current user password_changed false, flash a message
7070
if not current_user.password_changed:
7171
flash('You need to change your password first to continue.', 'warning')
72-
return render_template('change_password.html', settings=system_settings)
72+
return render_template('admin/change_password.html', settings=system_settings)
7373

74-
return render_template('change_password.html', settings=system_settings)
74+
return render_template('admin/change_password.html', settings=system_settings)
7575

7676

7777
@auth_bp.route("/logout")

src/blueprints/gold_calculator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def gold_calculator():
6969
flash("Bill generated successfully!", 'success')
7070
flash("Please consider giving a star on GitHub if you find this project useful!", 'info')
7171

72-
return render_template('gold_bill.html',
72+
return render_template('calculators/gold_bill.html',
7373
bill=bill_details,
7474
weight=weight,
7575
price_per_gram=gold_price_per_gram,
@@ -88,7 +88,7 @@ def gold_calculator():
8888
gold_service_charge = session.get('gold_service_charge', 0)
8989
gold_tax = session.get('gold_tax', 0)
9090

91-
return render_template('gold_calculator.html',
91+
return render_template('calculators/gold_calculator.html',
9292
price_per_gram=gold_price_per_gram,
9393
service_charge=gold_service_charge,
9494
tax=gold_tax,

src/blueprints/health.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ def health():
1212
"version": "1.0.0",
1313
"timestamp": datetime.now().isoformat()
1414
}
15-
return render_template('health.html', **health_info)
15+
return render_template('others/health.html', **health_info)

src/blueprints/silver_calculator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def silver_calculator():
6666
flash("Bill generated successfully!", 'success')
6767
flash("Please consider giving a star on GitHub if you find this project useful!", 'info')
6868

69-
return render_template('silver_bill.html',
69+
return render_template('calculators/silver_bill.html',
7070
bill=bill_details,
7171
weight=weight,
7272
price_per_gram=silver_price_per_gram,
@@ -84,7 +84,7 @@ def silver_calculator():
8484
silver_service_charge = session.get('silver_service_charge', 0)
8585
silver_tax = session.get('silver_tax', 0)
8686

87-
return render_template('silver_calculator.html',
87+
return render_template('calculators/silver_calculator.html',
8888
price_per_gram=silver_price_per_gram,
8989
service_charge=silver_service_charge,
9090
tax=silver_tax,

src/blueprints/users.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from datetime import datetime
2+
from flask import render_template, request, redirect, url_for, Blueprint, flash
3+
from flask_bcrypt import generate_password_hash
4+
from flask_login import login_required, current_user
5+
6+
from src.config import db
7+
from src.models import User
8+
9+
users_bp = Blueprint('users_', __name__)
10+
11+
@users_bp.route('/users', methods=['GET', 'POST'])
12+
@login_required
13+
def manage_users():
14+
if current_user.user_level != 'admin':
15+
return redirect(url_for('additional.permission_denied'))
16+
users = User.query.all()
17+
return render_template('users/manage_users.html', users=users)
18+
19+
@users_bp.route('/users/edit/<int:user_id>', methods=['GET', 'POST'])
20+
@login_required
21+
def edit_user(user_id):
22+
user = User.query.get_or_404(user_id)
23+
24+
if current_user.user_level != 'admin':
25+
return redirect(url_for('additional.permission_denied'))
26+
27+
if request.method == 'POST':
28+
user.fname = request.form['fname']
29+
user.lname = request.form['lname']
30+
user.username = request.form['username']
31+
user.email = request.form['email']
32+
user.user_level = request.form['user_level']
33+
db.session.commit()
34+
flash('User updated successfully!', 'success')
35+
return redirect(url_for('users_.manage_users'))
36+
return render_template('users/edit_user.html', user=user)
37+
38+
@users_bp.route('/users/create', methods=['GET', 'POST'])
39+
@login_required
40+
def create_user():
41+
if current_user.user_level != 'admin':
42+
return redirect(url_for('additional.permission_denied'))
43+
if request.method == 'POST':
44+
new_user = User(
45+
fname=request.form['fname'],
46+
lname=request.form['lname'],
47+
username=request.form['username'],
48+
email=request.form['email'],
49+
password=generate_password_hash(request.form['password']),
50+
user_level=request.form['user_level']
51+
)
52+
db.session.add(new_user)
53+
db.session.commit()
54+
flash('User created successfully!', 'success')
55+
return redirect(url_for('users_.manage_users'))
56+
return render_template('users/create_user.html')
57+
58+
@users_bp.route('/users/delete/<int:user_id>', methods=['GET', 'POST'])
59+
@login_required
60+
def delete_user(user_id):
61+
user = User.query.get_or_404(user_id)
62+
if request.method == 'POST':
63+
db.session.delete(user)
64+
db.session.commit()
65+
flash('User deleted successfully!', 'success')
66+
return redirect(url_for('users_.manage_users'))
67+
return render_template('users/delete_user.html', user=user)

0 commit comments

Comments
 (0)