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

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 

5 

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 

18 

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]) 

25 

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) 

32 

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") 

58 

59 

60@admin_bp.route('/deleteProgramFile', methods=['POST']) 

61def deleteProgramFile(): 

62 programFile=FileHandler(programId=request.form["programID"]) 

63 programFile.deleteFile(request.form["fileId"]) 

64 return "" 

65 

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) 

73 

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) 

80 

81 

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) 

98 

99 

100@admin_bp.route('/admin', methods = ['GET']) 

101def userManagement(): 

102 terms = selectSurroundingTerms(g.current_term) 

103 

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 ) 

113 

114 if not g.current_user.isCeltsAdmin: 

115 currentPrograms = currentPrograms.where(ProgramManager.user == g.current_user.username) 

116 

117 currentPrograms = currentPrograms.group_by(Program.id) 

118 

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) 

129 

130@admin_bp.route('/admin/changeTerm', methods=['POST']) 

131def changeTerm(): 

132 termData = request.form 

133 term = int(termData["id"]) 

134 changeCurrentTerm(term) 

135 return "" 

136 

137@admin_bp.route('/admin/addNewTerm', methods = ['POST']) 

138def addNewTerm(): 

139 addNextTerm() 

140 return ""