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

123 statements  

« prev     ^ index     » next       coverage.py v7.2.5, created at 2023-05-24 14:13 +0000

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

2from datetime import datetime 

3from peewee import DoesNotExist 

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.logic.searchUsers import searchUsers 

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

12from app.logic.participants import trainedParticipants, getEventParticipants, addPersonToEvent 

13from app.logic.events import getPreviousRecurringEventData 

14from app.models.eventRsvp import EventRsvp 

15from app.models.backgroundCheck import BackgroundCheck 

16from app.models.programManager import ProgramManager 

17from app.logic.adminLogs import createLog 

18from app.logic.users import getBannedUsers, isBannedFromEvent 

19 

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('/eventsList/<eventID>/track_volunteers', methods=['GET']) 

29def trackVolunteersPage(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 eventData = model_to_dict(event, recurse=False) 

37 eventData["program"] = event.singleProgram 

38 trainedParticipantsList = trainedParticipants(event.singleProgram, g.current_term) 

39 eventParticipants = getEventParticipants(event) 

40 isProgramManager = g.current_user.isProgramManagerForEvent(event) 

41 bannedUsers = [row.user for row in getBannedUsers(event.singleProgram)] 

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

43 abort(403) 

44 

45 eventRsvpData = list(EventRsvp.select().where(EventRsvp.event==event).order_by(EventRsvp.rsvpTime)) 

46 eventParticipantData = list(EventParticipant.select().where(EventParticipant.event==event)) 

47 participantsAndRsvp = (eventParticipantData + eventRsvpData) 

48 eventVolunteerData = [] 

49 volunteerUser = [] 

50 for volunteer in participantsAndRsvp: 

51 if volunteer.user not in volunteerUser: 

52 eventVolunteerData.append(volunteer) 

53 volunteerUser.append(volunteer.user) 

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

55 

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

57 recurringEventStartDate = event.startDate 

58 recurringVolunteers = getPreviousRecurringEventData(recurringEventID) 

59 

60 return render_template("/events/trackVolunteers.html", 

61 eventData = eventData, 

62 eventVolunteerData = eventVolunteerData, 

63 eventParticipants = eventParticipants, 

64 eventLength = eventLengthInHours, 

65 event = event, 

66 recurringEventID = recurringEventID, 

67 recurringEventStartDate = recurringEventStartDate, 

68 recurringVolunteers = recurringVolunteers, 

69 bannedUsers = bannedUsers, 

70 trainedParticipantsList = trainedParticipantsList) 

71 

72@admin_bp.route('/eventsList/<eventID>/track_volunteers', methods=['POST']) 

73def updateVolunteerTable(eventID): 

74 try: 

75 event = Event.get_by_id(eventID) 

76 except DoesNotExist as e: 

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

78 abort(404) 

79 

80 program = event.singleProgram 

81 

82 volunteerUpdated = updateEventParticipants(request.form) 

83 if volunteerUpdated: 

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

85 else: 

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

87 return redirect(url_for("admin.trackVolunteersPage", eventID=eventID)) 

88 

89 

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

91def addVolunteer(eventId): 

92 event = Event.get_by_id(eventId) 

93 successfullyAddedVolunteer = False 

94 usernameList = [] 

95 eventParticipants = getEventParticipants(eventId) 

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

97 

98 successfullyAddedVolunteer = False 

99 for user in usernameList: 

100 userObj = User.get_by_id(user) 

101 successfullyAddedVolunteer = addPersonToEvent(userObj, event) 

102 if successfullyAddedVolunteer == "already in": 

103 flash(f"{userObj.fullName} already in table.", "warning") 

104 else: 

105 if successfullyAddedVolunteer: 

106 flash(f"{userObj.fullName} added successfully.", "success") 

107 else: 

108 flash(f"Error when adding {userObj.fullName} to event." ,"danger") 

109 

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

111 return '' 

112 

113 return redirect(url_for('admin.trackVolunteersPage', eventID = eventId)) 

114 

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

116def isVolunteerBanned(username, eventId): 

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

118 

119@admin_bp.route('/removeVolunteerFromEvent/<user>/<eventID>', methods = ['POST']) 

120def removeVolunteerFromEvent(user, eventID): 

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

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

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

124 return "" 

125 

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

127def addBackgroundCheck(): 

128 if g.current_user.isCeltsAdmin: 

129 eventData = request.form 

130 user = eventData['user'] 

131 bgStatus = eventData['bgStatus'] 

132 type = eventData['bgType'] 

133 dateCompleted = eventData['bgDate'] 

134 addUserBackgroundCheck(user, type, bgStatus, dateCompleted) 

135 return " " 

136 

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

138def deleteBackgroundCheck(): 

139 if g.current_user.isCeltsAdmin: 

140 eventData = request.form 

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

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

143 return "" 

144 

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

146def updateProgramManager(): 

147 if g.current_user.isCeltsAdmin: 

148 data =request.form 

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

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

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

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

153 return "" 

154 else: 

155 abort(403) 

156 

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

158def updatePhone(): 

159 newinfo=request.form 

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

161 return ""