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
« 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
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'''
26 return json.dumps(searchUsers(query))
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)
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))
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)
52 eventData["program"] = event.program
53 trainedParticipantsList = trainedParticipants(event.program, event.term)
54 eventParticipants = getEventParticipants(event)
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)
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]
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 = []
75 program = event.program
77 allRelevantUsers = [participant.user for participant in eventVolunteerData + eventNonAttendedData + eventWaitlistData]
78 completedTrainingInfo = getParticipationStatusForTrainings(program, allRelevantUsers, event.term)
80 eventLengthInHours = getEventLengthInHours(event.timeStart, event.timeEnd, event.startDate)
82 recurringEventID = event.recurringId # query Event Table to get recurringId using Event ID.
83 recurringEventStartDate = event.startDate
84 recurringVolunteers = getPreviousRecurringEventData(recurringEventID)
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)
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)
112 if not (g.current_user.isCeltsAdmin or (g.current_user.isCeltsStudentStaff and g.current_user.isProgramManagerForEvent(event))):
113 abort(403)
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))
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 ]))
125 eventData = model_to_dict(event, recurse=False)
126 eventData["program"] = event.program
128 return render_template("/events/volunteerDetails.html",
129 waitlistUser = waitlistUser,
130 attendedUser= eventParticipantData,
131 rsvpUser= rsvpUser,
132 event = event,
133 eventData = eventData)
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[]")
144 successfullyAddedVolunteer = False
145 alreadyAddedList = []
146 addedSuccessfullyList = []
147 errorList = []
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)
160 volunteers = ""
161 if alreadyAddedList:
162 volunteers = ", ".join(vol for vol in alreadyAddedList)
163 flash(f"{volunteers} already in table.", "warning")
165 if addedSuccessfullyList:
166 volunteers = ", ".join(vol for vol in addedSuccessfullyList)
167 flash(f"{volunteers} added successfully.", "success")
169 if errorList:
170 volunteers = ", ".join(vol for vol in errorList)
171 flash(f"Error when adding {volunteers} to event.", "danger")
173 if 'ajax' in request.form and request.form['ajax']:
174 return ''
176 return redirect(url_for('admin.manageVolunteersPage', eventID = eventId))
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 ""
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}
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 ""
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 " "
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 ""
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)
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 ""