Coverage for app/logic/participants.py: 87%
79 statements
« prev ^ index » next coverage.py v7.2.5, created at 2023-05-24 14:13 +0000
« prev ^ index » next coverage.py v7.2.5, created at 2023-05-24 14:13 +0000
1from peewee import fn, JOIN
2from datetime import date
3from app.models.user import User
4from app.models.event import Event
5from app.models.term import Term
6from app.models.eventRsvp import EventRsvp
7from app.models.program import Program
8from app.models.programEvent import ProgramEvent
9from app.models.eventParticipant import EventParticipant
10from app.logic.users import isEligibleForProgram
11from app.logic.volunteers import getEventLengthInHours
13def trainedParticipants(programID, currentTerm):
14 """
15 This function tracks the users who have attended every Prerequisite
16 event and adds them to a list that will not flag them when tracking hours.
17 """
19 academicYear = currentTerm.academicYear
21 # Reset program eligibility each term for all other trainings
23 otherTrainingEvents = (Event.select(Event.id)
24 .join(ProgramEvent).switch()
25 .join(Term)
26 .where(
27 ProgramEvent.program == programID,
28 (Event.isTraining | Event.isAllVolunteerTraining),
29 Event.term.academicYear == academicYear)
30 )
32 allTrainingEvents = set(otherTrainingEvents)
33 eventTrainingDataList = [participant.user for participant in (
34 EventParticipant.select().where(EventParticipant.event.in_(allTrainingEvents))
35 )]
36 attendedTraining = list(dict.fromkeys(filter(lambda user: eventTrainingDataList.count(user) == len(allTrainingEvents), eventTrainingDataList)))
37 return attendedTraining
39def sendUserData(bnumber, eventId, programid):
40 """Accepts scan input and signs in the user. If user exists or is already
41 signed in will return user and login status"""
42 try:
43 signedInUser = User.get(User.bnumber == bnumber)
44 except Exception as e:
45 print(e)
46 return None, "does not exist"
47 event = Event.get_by_id(eventId)
48 if not isEligibleForProgram(programid, signedInUser):
49 userStatus = "banned"
50 elif ((EventParticipant.select(EventParticipant.user)
51 .where(EventParticipant.user == signedInUser, EventParticipant.event==eventId))
52 .exists()):
53 userStatus = "already in"
54 else:
55 userStatus = "success"
56 totalHours = getEventLengthInHours(event.timeStart, event.timeEnd, event.startDate)
57 EventParticipant.create (user=signedInUser, event=eventId, hoursEarned=totalHours)
58 return signedInUser, userStatus
60def checkUserRsvp(user, event):
61 return EventRsvp.select().where(EventRsvp.user==user, EventRsvp.event == event).exists()
63def checkUserVolunteer(user, event):
64 return EventParticipant.select().where(EventParticipant.user == user, EventParticipant.event == event).exists()
66def addPersonToEvent(user, event):
67 """
68 Add a user to an event.
69 If the event is in the past, add the user as a volunteer (EventParticipant) including hours worked.
70 If the event is in the future, rsvp for the user (EventRsvp)
72 Returns True if the operation was successful, false otherwise
73 """
74 try:
75 volunteerExists = checkUserVolunteer(user, event)
76 rsvpExists = checkUserRsvp(user, event)
77 if event.isPast:
78 if not volunteerExists:
79 eventHours = getEventLengthInHours(event.timeStart, event.timeEnd, event.startDate)
80 EventParticipant.create(user = user, event = event, hoursEarned = eventHours)
81 else:
82 if not rsvpExists:
83 EventRsvp.create(user = user, event = event)
84 if volunteerExists or rsvpExists:
85 return "already in"
86 except Exception as e:
87 print(e)
88 return False
90 return True
92def unattendedRequiredEvents(program, user):
94 # Check for events that are prerequisite for program
95 requiredEvents = (Event.select(Event)
96 .join(ProgramEvent)
97 .where(Event.isTraining == True, ProgramEvent.program == program))
99 if requiredEvents:
100 attendedRequiredEventsList = []
101 for event in requiredEvents:
102 attendedRequirement = (EventParticipant.select().where(EventParticipant.user == user, EventParticipant.event == event))
103 if not attendedRequirement:
104 attendedRequiredEventsList.append(event.name)
105 if attendedRequiredEventsList is not None:
106 return attendedRequiredEventsList
107 else:
108 return []
111def getEventParticipants(event):
112 eventParticipants = (EventParticipant.select(EventParticipant, User)
113 .join(User)
114 .where(EventParticipant.event == event))
116 return {p.user: p.hoursEarned for p in eventParticipants}
118def getUserParticipatedTrainingEvents(program, user, currentTerm):
119 """
120 This function returns a dictionary of all trainings for a program and
121 whether the current user participated in them.
123 :returns: trainings for program and if the user participated
124 """
125 academicYear = currentTerm.academicYear
127 programTrainings = (Event.select(Event, ProgramEvent, Term, EventParticipant)
128 .join(EventParticipant, JOIN.LEFT_OUTER).switch()
129 .join(ProgramEvent).switch()
130 .join(Term)
131 .where((Event.isTraining | Event.isAllVolunteerTraining),
132 ProgramEvent.program == program,
133 Event.term.academicYear == academicYear,
134 EventParticipant.user.is_null(True) | (EventParticipant.user == user)))
136 UserParticipatedTrainingEvents = {}
137 for training in programTrainings.objects():
138 if training.startDate > date.today():
139 didParticipate = [None, training.startDate.strftime("%m/%d/%Y")]
140 elif training.user:
141 didParticipate = True
142 else:
143 didParticipate = False
144 UserParticipatedTrainingEvents[training.name] = didParticipate
145 return UserParticipatedTrainingEvents