33from bson import ObjectId
44from flask import Blueprint , redirect , url_for , request , flash , render_template , abort , send_file , jsonify
55from flask_login import login_required , current_user
6+ from sqlalchemy import func
67from sqlalchemy .orm import joinedload
78# Import the forms and models
89from app .models import SubmitedSolution , User , UserAchievement , Quest , ReportedQuest , SubmitedQuest , Achievement
1920
2021bp_usr = Blueprint ('usr' , __name__ )
2122
22- # Get the user's avatar, used in the comments section
23+ # Open the user profile page
2324@bp_usr .route ('/my_profile' , methods = ['GET' , 'POST' ])
2425@login_required
2526def open_user_profile ():
@@ -28,28 +29,42 @@ def open_user_profile():
2829 user = User .query .get (user_id )
2930
3031 if form .validate_on_submit ():
32+ new_email = form .email .data .lower ()
33+ current_email = user .email .lower ()
34+ if new_email != current_email :
35+ is_email_taken = User .query .filter (func .lower (User .email ) == new_email ).first ()
36+ if is_email_taken :
37+ flash ('This email is already taken. Please choose another one.' , 'danger' )
38+ return redirect (url_for ('usr.open_user_profile' ))
39+
3140 if 'submit' in request .form :
32- user .about_me = form .about_me .data
33- user .first_name = form .first_name .data
34- user .last_name = form .last_name .data
35- user .email = form .email .data
36- user .facebook_profile = form .facebook_profile .data
37- user .instagram_profile = form .instagram_profile .data
38- user .github_profile = form .github_profile .data
39- user .discord_id = form .discord_id .data
40- user .linked_in = form .linked_in .data
41+ try :
42+ user .about_me = form .about_me .data
43+ user .first_name = form .first_name .data
44+ user .last_name = form .last_name .data
45+ user .email = form .email .data
46+ user .facebook_profile = form .facebook_profile .data
47+ user .instagram_profile = form .instagram_profile .data
48+ user .github_profile = form .github_profile .data
49+ user .discord_id = form .discord_id .data
50+ user .linked_in = form .linked_in .data
4151
42- db .session .commit ()
52+ db .session .commit ()
4353
44- mongo_transaction (
45- 'user_info_update' ,
46- action = f'User { user .username } updated their info' ,
47- user_id = user_id ,
48- username = user .username ,
49- timestamp = datetime .now ().strftime ('%Y-%m-%d %H:%M:%S' )
50- )
51- flash ('Profile updated successfully' , 'success' )
52- return redirect (url_for ('usr.open_user_profile' ))
54+ mongo_transaction (
55+ 'user_info_update' ,
56+ action = f'User { user .username } updated their info' ,
57+ user_id = user_id ,
58+ username = user .username ,
59+ timestamp = datetime .now ().strftime ('%Y-%m-%d %H:%M:%S' )
60+ )
61+ flash ('Profile updated successfully' , 'success' )
62+ return redirect (url_for ('usr.open_user_profile' ))
63+ except Exception as e :
64+ flash (f'Error during updating user\' s profile!' , 'danger' )
65+ return redirect (url_for ('usr.open_user_profile' ))
66+
67+
5368 if 'update_avatar' in request .form :
5469 if form .avatar .data :
5570 avatar_data = form .avatar .data .read ()
@@ -118,7 +133,7 @@ def open_user_profile():
118133
119134
120135# Get the users avatar
121- @bp_usr .route ('/avatar/<user_id>' )
136+ @bp_usr .route ('/avatar/<user_id>' , methods = [ 'GET' ] )
122137def get_user_avatar (user_id ):
123138 user = User .query .filter_by (user_id = user_id ).first_or_404 ()
124139 if user .avatar :
@@ -129,7 +144,7 @@ def get_user_avatar(user_id):
129144 return send_file (io .BytesIO (img_data ), mimetype = 'image/jpeg' )
130145
131146# Open user for editing from the Admin Panel
132- @bp_usr .route ('/edit_user/<user_id>' )
147+ @bp_usr .route ('/edit_user/<user_id>' , methods = [ 'GET' ] )
133148@login_required
134149@admin_required
135150def open_edit_user (user_id ):
@@ -268,7 +283,7 @@ def open_user_profile_view(username):
268283 return abort (404 )
269284
270285# Redirect to the Admin Panel (Admin Role in the database is needed)
271- @bp_usr .route ('/admin_panel' )
286+ @bp_usr .route ('/admin_panel' , methods = [ 'GET' ] )
272287@login_required
273288@admin_required
274289def open_admin_panel ():
@@ -345,15 +360,23 @@ def convert_objectid_to_string(submission):
345360 flash ('You must be an admin to access this page.' , 'error' )
346361 return redirect (url_for ('main.login' ))
347362
348- @bp_usr .route ('/submissions_logs/<submission_id>' )
363+ @bp_usr .route ('/submissions_logs/<submission_id>' , methods = [ 'GET' ] )
349364@login_required
350365@admin_required
351366def submission_log (submission_id ):
352367 with mongo1_client .start_session () as session :
353368 with session .start_transaction ():
354369 try :
355370 db = mongo1_client ['skill_forge_logs' ]
356- submission = db ['python_submissions' ].find_one ({'submission_id' : submission_id })
371+ collections = ['python_submissions' , 'java_submissions' , 'csharp_submissions' , 'javascript_submissions' ]
372+
373+ submission = None
374+
375+ for collection in collections :
376+ submission = db [collection ].find_one ({'submission_id' : submission_id })
377+ if submission :
378+ break
379+
357380 # Convert ObjectId and datetime fields to strings
358381 if isinstance (submission ['_id' ], ObjectId ):
359382 submission ['_id' ] = str (submission ['_id' ])
@@ -367,11 +390,10 @@ def submission_log(submission_id):
367390 quest = {}
368391 flash (f'An error occurred while fetching the submission. { e } ' , 'error' )
369392 return redirect (url_for ('usr.open_admin_panel' ))
370-
371393 return render_template ('display_submission_log.html' , submission = submission_json , quest = quest )
372394
373395# Ban user route
374- @bp_usr .route ('/ban_user/<user_id>' )
396+ @bp_usr .route ('/ban_user/<user_id>' , methods = [ 'POST' ] )
375397@login_required
376398@admin_required
377399def ban_user (user_id , ban_reason = 'no reason' ):
@@ -386,7 +408,7 @@ def ban_user(user_id, ban_reason='no reason'):
386408 return redirect (url_for ('usr.open_admin_panel' ))
387409
388410# Unban user route
389- @bp_usr .route ('/unban_user/<user_id>' )
411+ @bp_usr .route ('/unban_user/<user_id>' , methods = [ 'POST' ] )
390412@login_required
391413@admin_required
392414def unban_user (user_id ):
0 commit comments