Coverage for app/controllers/admin/volunteers.py: 24%

177 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2024-01-04 19:34 +0000

1from flask import request, render_template, redirect, url_for, request, flash, abort, g, json, jsonify 

2from datetime import datetime 

3from peewee import DoesNotExist, JOIN 

4from playhouse.shortcuts import model_to_dict 

5from app.controllers.admin import admin_bp 

6from app.models.event import Event 

7from app.models.program import Program 

8from app.models.user import User 

9from app.models.eventParticipant import EventParticipant 

10from app.models.emergencyContact import EmergencyContact 

11from app.logic.searchUsers import searchUsers 

12from app.logic.volunteers import updateEventParticipants, addVolunteerToEventRsvp, getEventLengthInHours, addUserBackgroundCheck, setProgramManager 

13from app.logic.participants import trainedParticipants, getEventParticipants, addPersonToEvent, getParticipationStatusForTrainings 

14from app.logic.events import getPreviousRecurringEventData, getEventRsvpCount 

15from app.models.eventRsvp import EventRsvp 

16from app.models.backgroundCheck import BackgroundCheck 

17from app.models.programManager import ProgramManager 

18from app.logic.createLogs import createAdminLog, createRsvpLog 

19from app.logic.users import getBannedUsers, isBannedFromEvent 

20 

21 

22@admin_bp.route('/searchVolunteers/<query>', methods = ['GET']) 

23def getVolunteers(query): 

24 '''Accepts user input and queries the database returning results that matches user search''' 

25 

26 return json.dumps(searchUsers(query)) 

27 

28@admin_bp.route('/event/<eventID>/manage_volunteers', methods=['POST']) 

29def updateVolunteerTable(eventID): 

30 try: 

31 event = Event.get_by_id(eventID) 

32 except DoesNotExist as e: 

33 print(f"No event found for {eventID}") 

34 abort(404) 

35 

36 volunteerUpdated = updateEventParticipants(request.form) 

37 if volunteerUpdated: 

38 flash("Volunteer table succesfully updated", "success") 

39 else: 

40 flash("Error adding volunteer", "danger") 

41 return redirect(url_for("admin.manageVolunteersPage", eventID=eventID)) 

42 

43@admin_bp.route('/event/<eventID>/manage_volunteers', methods=['GET']) 

44def manageVolunteersPage(eventID): 

45 try: 

46 event = Event.get_by_id(eventID) 

47 except DoesNotExist as e: 

48 print(f"No event found for {eventID}", e) 

49 abort(404) 

50 eventData = model_to_dict(event, recurse=False) 

51 

52 eventData["program"] = event.program 

53 trainedParticipantsList = trainedParticipants(event.program, event.term) 

54 eventParticipants = getEventParticipants(event) 

55 

56 isProgramManager = g.current_user.isProgramManagerForEvent(event) 

57 bannedUsers = [row.user for row in getBannedUsers(event.program)] 

58 if not (g.current_user.isCeltsAdmin or (g.current_user.isCeltsStudentStaff and isProgramManager)): 

59 abort(403) 

60 

61 eventParticipantData = list(EventParticipant.select(EventParticipant, User).join(User).where(EventParticipant.event==event)) 

62 eventRsvpData = list(EventRsvp.select(EventRsvp, User).join(User).where(EventRsvp.event==event).order_by(EventRsvp.rsvpTime)) 

63 eventParticipantUsers = [participantDatum.user for participantDatum in eventParticipantData] 

64 eventRsvpData = [rsvpDatum for rsvpDatum in eventRsvpData if rsvpDatum.user not in eventParticipantUsers] 

65 

66 if event.isPast: 

67 eventVolunteerData = eventParticipantData 

68 eventNonAttendedData = eventRsvpData 

69 eventWaitlistData = [] 

70 else: 

71 eventWaitlistData = [volunteer for volunteer in eventParticipantData + eventRsvpData if volunteer.rsvpWaitlist and event.isRsvpRequired] 

72 eventVolunteerData = [volunteer for volunteer in eventRsvpData if volunteer not in eventWaitlistData] 

73 eventNonAttendedData = [] 

74 

75 program = event.program 

76 

77 allRelevantUsers = [participant.user for participant in eventVolunteerData + eventNonAttendedData + eventWaitlistData] 

78 completedTrainingInfo = getParticipationStatusForTrainings(program, allRelevantUsers, event.term) 

79 

80 eventLengthInHours = getEventLengthInHours(event.timeStart, event.timeEnd, event.startDate) 

81 

82 recurringEventID = event.recurringId # query Event Table to get recurringId using Event ID. 

83 recurringEventStartDate = event.startDate 

84 recurringVolunteers = getPreviousRecurringEventData(recurringEventID) 

85 

86 currentRsvpAmount = getEventRsvpCount(event.id) 

87 return render_template("/events/manageVolunteers.html", 

88 eventData = eventData, 

89 eventVolunteerData = eventVolunteerData, 

90 eventNonAttendedData = eventNonAttendedData, 

91 eventWaitlistData = eventWaitlistData, 

92 eventLength = eventLengthInHours, 

93 event = event, 

94 recurringEventID = recurringEventID, 

95 recurringEventStartDate = recurringEventStartDate, 

96 recurringVolunteers = recurringVolunteers, 

97 bannedUsers = bannedUsers, 

98 trainedParticipantsList = trainedParticipantsList, 

99 completedTrainingInfo = completedTrainingInfo, 

100 currentRsvpAmount = currentRsvpAmount) 

101 

102 

103 

104@admin_bp.route('/event/<eventID>/volunteer_details', methods=['GET']) 

105def volunteerDetailsPage(eventID): 

106 try: 

107 event = Event.get_by_id(eventID) 

108 except DoesNotExist as e: 

109 print(f"No event found for {eventID}", e) 

110 abort(404) 

111 

112 if not (g.current_user.isCeltsAdmin or (g.current_user.isCeltsStudentStaff and g.current_user.isProgramManagerForEvent(event))): 

113 abort(403) 

114 

115 eventRsvpData = list(EventRsvp.select(EmergencyContact, EventRsvp) 

116 .join(EmergencyContact, JOIN.LEFT_OUTER, on=(EmergencyContact.user==EventRsvp.user)) 

117 .where(EventRsvp.event==event)) 

118 eventParticipantData = list(EventParticipant.select(EmergencyContact, EventParticipant) 

119 .join(EmergencyContact, JOIN.LEFT_OUTER, on=(EmergencyContact.user==EventParticipant.user)) 

120 .where(EventParticipant.event==event)) 

121 

122 waitlistUser = list(set([obj for obj in eventRsvpData if obj.rsvpWaitlist])) 

123 rsvpUser = list(set([obj for obj in eventRsvpData if not obj.rsvpWaitlist ])) 

124 

125 eventData = model_to_dict(event, recurse=False) 

126 eventData["program"] = event.program 

127 

128 return render_template("/events/volunteerDetails.html", 

129 waitlistUser = waitlistUser, 

130 attendedUser= eventParticipantData, 

131 rsvpUser= rsvpUser, 

132 event = event, 

133 eventData = eventData) 

134 

135 

136@admin_bp.route('/addVolunteersToEvent/<eventId>', methods = ['POST']) 

137def addVolunteer(eventId): 

138 event = Event.get_by_id(eventId) 

139 successfullyAddedVolunteer = False 

140 usernameList = [] 

141 eventParticipants = getEventParticipants(eventId) 

142 usernameList = request.form.getlist("volunteer[]") 

143 

144 successfullyAddedVolunteer = False 

145 alreadyAddedList = [] 

146 addedSuccessfullyList = [] 

147 errorList = [] 

148 

149 for user in usernameList: 

150 userObj = User.get_by_id(user) 

151 successfullyAddedVolunteer = addPersonToEvent(userObj, event) 

152 if successfullyAddedVolunteer == "already in": 

153 alreadyAddedList.append(userObj.fullName) 

154 else: 

155 if successfullyAddedVolunteer: 

156 addedSuccessfullyList.append(userObj.fullName) 

157 else: 

158 errorList.append(userObj.fullName) 

159 

160 volunteers = "" 

161 if alreadyAddedList: 

162 volunteers = ", ".join(vol for vol in alreadyAddedList) 

163 flash(f"{volunteers} already in table.", "warning") 

164 

165 if addedSuccessfullyList: 

166 volunteers = ", ".join(vol for vol in addedSuccessfullyList) 

167 flash(f"{volunteers} added successfully.", "success") 

168 

169 if errorList: 

170 volunteers = ", ".join(vol for vol in errorList) 

171 flash(f"Error when adding {volunteers} to event.", "danger") 

172 

173 if 'ajax' in request.form and request.form['ajax']: 

174 return '' 

175 

176 return redirect(url_for('admin.manageVolunteersPage', eventID = eventId)) 

177 

178@admin_bp.route('/rsvpFromWaitlist/<username>/<eventId>', methods = ['POST']) 

179def rsvpFromWaitlist(username, eventId): 

180 event = Event.get_by_id(eventId) 

181 isProgramManager = g.current_user.isProgramManagerFor(event.program) 

182 if g.current_user.isCeltsAdmin or (g.current_user.isCeltsStudentStaff and isProgramManager): 

183 waitlistUsers = EventRsvp.select(EventRsvp, User).join(User).where(EventRsvp.user == username, EventRsvp.event==eventId).execute() 

184 if (waitlistUsers): 

185 createRsvpLog(event.id, f"Moved {waitlistUsers[0].user.fullName} from waitlist to RSVP.") 

186 (EventRsvp.update(rsvpWaitlist = False).where(EventRsvp.event_id == eventId, EventRsvp.user_id == username)).execute() 

187 return "" 

188 

189@admin_bp.route('/addVolunteersToEvent/<username>/<eventId>/isBanned', methods = ['GET']) 

190def isVolunteerBanned(username, eventId): 

191 return {"banned":1} if isBannedFromEvent(username, eventId) else {"banned":0} 

192 

193@admin_bp.route('/removeVolunteerFromEvent', methods = ['POST']) 

194def removeVolunteerFromEvent(): 

195 user = request.form.get('username') 

196 eventID = request.form.get('eventId') 

197 if g.current_user.isAdmin: 

198 userInRsvpTable = EventRsvp.select(EventRsvp, User).join(User).where(EventRsvp.user == user, EventRsvp.event==eventID).execute() 

199 if (userInRsvpTable): 

200 rsvpUser = userInRsvpTable[0] 

201 if rsvpUser.rsvpWaitlist: 

202 createRsvpLog(eventID, f"Removed {rsvpUser.user.fullName} from waitlist.") 

203 else: 

204 createRsvpLog(eventID, f"Removed {rsvpUser.user.fullName} from RSVP list.") 

205 (EventParticipant.delete().where(EventParticipant.user==user, EventParticipant.event==eventID)).execute() 

206 (EventRsvp.delete().where(EventRsvp.user==user, EventRsvp.event==eventID)).execute() 

207 flash("Volunteer successfully removed", "success") 

208 return "" 

209 

210@admin_bp.route('/addBackgroundCheck', methods = ['POST']) 

211def addBackgroundCheck(): 

212 if g.current_user.isCeltsAdmin: 

213 eventData = request.form 

214 user = eventData['user'] 

215 bgStatus = eventData['bgStatus'] 

216 type = eventData['bgType'] 

217 dateCompleted = eventData['bgDate'] 

218 addUserBackgroundCheck(user, type, bgStatus, dateCompleted) 

219 return " " 

220 

221@admin_bp.route('/deleteBackgroundCheck', methods = ['POST']) 

222def deleteBackgroundCheck(): 

223 if g.current_user.isCeltsAdmin: 

224 eventData = request.form 

225 bgToDelete = BackgroundCheck.get_by_id(eventData['bgID']) 

226 BackgroundCheck.delete().where(BackgroundCheck.id == bgToDelete).execute() 

227 return "" 

228 

229@admin_bp.route('/updateProgramManager', methods=["POST"]) 

230def updateProgramManager(): 

231 if g.current_user.isCeltsAdmin: 

232 data =request.form 

233 username = User.get(User.username == data["user_name"]) 

234 program = Program.get_by_id(data['program_id']) 

235 setProgramManager(data["user_name"], data["program_id"], data["action"]) 

236 createAdminLog(f'{username.firstName} has been {data["action"]}ed as a Program Manager for {program.programName}') 

237 return "" 

238 else: 

239 abort(403) 

240 

241@admin_bp.route("/updatePhone", methods=["POST"]) 

242def updatePhone(): 

243 newinfo=request.form 

244 User.update(phoneNumber=newinfo["phoneNumber"]).where(User.username==newinfo["username"]).execute() 

245 return ""