Coverage for app/controllers/admin/userManagement.py: 29%
105 statements
« prev ^ index » next coverage.py v7.2.7, created at 2025-07-22 20:03 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2025-07-22 20:03 +0000
1from flask import render_template,request, flash, g, abort, redirect, url_for, jsonify
2from playhouse.shortcuts import model_to_dict
3from peewee import fn, JOIN, DoesNotExist
4import re
6from app.controllers.admin import admin_bp
7from app.models.user import User
8from app.models.program import Program
9from app.logic.fileHandler import FileHandler
10from app.logic.userManagement import addCeltsAdmin,addCeltsStudentStaff,removeCeltsAdmin,removeCeltsStudentStaff
11from app.logic.userManagement import changeProgramInfo
12from app.logic.utils import selectSurroundingTerms
13from app.logic.term import addNextTerm, changeCurrentTerm
14from app.logic.volunteers import setProgramManager
15from app.models.attachmentUpload import AttachmentUpload
16from app.models.programManager import ProgramManager
17from app.models.user import User
19@admin_bp.route('/admin/manageUsers', methods = ['POST'])
20def manageUsers():
21 eventData = request.form
22 user = eventData['user']
23 method = eventData['method']
24 username = re.sub("[()]","", (user.split())[-1])
26 try:
27 user = User.get_by_id(username)
28 except Exception as e:
29 print(e)
30 flash(username + " is an invalid user.", "danger")
31 return ("danger", 500)
33 if method == "addCeltsAdmin":
34 if user.isStudent and not user.isCeltsStudentStaff:
35 flash(user.firstName + " " + user.lastName + " cannot be added as a CELTS-Link admin", 'danger')
36 else:
37 if user.isCeltsAdmin:
38 flash(user.firstName + " " + user.lastName + " is already a CELTS-Link Admin", 'danger')
39 else:
40 addCeltsAdmin(user)
41 flash(user.firstName + " " + user.lastName + " has been added as a CELTS-Link Admin", 'success')
42 elif method == "addCeltsStudentStaff":
43 if not user.isStudent:
44 flash(username + " cannot be added as CELTS Student Staff", 'danger')
45 else:
46 if user.isCeltsStudentStaff:
47 flash(user.firstName + " " + user.lastName + " is already a CELTS Student Staff", 'danger')
48 else:
49 addCeltsStudentStaff(user)
50 flash(user.firstName + " " + user.lastName + " has been added as a CELTS Student Staff", 'success')
51 elif method == "removeCeltsAdmin":
52 removeCeltsAdmin(user)
53 flash(user.firstName + " " + user.lastName + " is no longer a CELTS Admin ", 'success')
54 elif method == "removeCeltsStudentStaff":
55 removeCeltsStudentStaff(user)
56 flash(user.firstName + " " + user.lastName + " is no longer a CELTS Student Staff", 'success')
57 return ("success")
60@admin_bp.route('/deleteProgramFile', methods=['POST'])
61def deleteProgramFile():
62 programFile=FileHandler(programId=request.form["programID"])
63 programFile.deleteFile(request.form["fileId"])
64 return ""
66@admin_bp.route('/admin/updateProgramInfo/<programID>', methods=['POST'])
67def updateProgramInfo(programID):
68 if g.current_user.isCeltsAdmin or g.current_user.isProgramManagerFor(programID):
69 try:
70 programInfo = request.form # grabs user inputs
71 uploadedFile = request.files.get('modalProgramImage')
72 changeProgramInfo(programID, uploadedFile, **programInfo)
74 flash("Program updated", "success")
75 return redirect(url_for("admin.userManagement", accordion="program"))
76 except Exception as e:
77 flash('Error while updating program info.','warning')
78 abort(500,'Error while updating program.')
79 abort(403)
82@admin_bp.route('/admin/getProgramInfo/<programID>', methods = ['GET'])
83def getProgramInfo(programID):
84 if g.current_user.isCeltsAdmin or g.current_user.isProgramManagerFor(programID):
85 try:
86 targetProgram = Program.get_by_id(programID)
87 programInfo = model_to_dict(targetProgram, recurse=False)
88 return jsonify([programInfo])
89 except DoesNotExist as e:
90 flash('Program not found')
91 print("Debug Here \n", e)
92 abort(404)
93 except Exception as e:
94 flash('Failed to retrieve data','warning')
95 print(e)
96 abort(500, 'Failed to retrieve data')
97 abort(403)
100@admin_bp.route('/admin', methods = ['GET'])
101def userManagement():
102 terms = selectSurroundingTerms(g.current_term)
104 currentPrograms = (
105 Program
106 .select(
107 Program,
108 fn.GROUP_CONCAT(fn.COALESCE(fn.CONCAT(User.firstName, ' ', User.lastName, '#', User.username), '')).alias('managers')
109 )
110 .join(ProgramManager, JOIN.LEFT_OUTER, on=(Program.id == ProgramManager.program))
111 .join(User, JOIN.LEFT_OUTER, on=(ProgramManager.user == User.username))
112 )
114 if not g.current_user.isCeltsAdmin:
115 currentPrograms = currentPrograms.where(ProgramManager.user == g.current_user.username)
117 currentPrograms = currentPrograms.group_by(Program.id)
119 currentAdmins = list(User.select().where(User.isCeltsAdmin))
120 currentStudentStaff = list(User.select().where(User.isCeltsStudentStaff))
121 if g.current_user.isCeltsAdmin or g.current_user.isProgramManager:
122 return render_template('admin/userManagement.html',
123 terms = terms,
124 programs = list(currentPrograms),
125 currentAdmins = currentAdmins,
126 currentStudentStaff = currentStudentStaff,
127 )
128 abort(403)
130@admin_bp.route('/admin/changeTerm', methods=['POST'])
131def changeTerm():
132 termData = request.form
133 term = int(termData["id"])
134 changeCurrentTerm(term)
135 return ""
137@admin_bp.route('/admin/addNewTerm', methods = ['POST'])
138def addNewTerm():
139 addNextTerm()
140 return ""