Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
11fc7da
Added in InvitedUser variable to differentiate between users who were…
Meatchema Jan 22, 2026
7f7db93
Merge branch 'development' into issue-1663-change-rsvp-language
Meatchema Jan 22, 2026
f97f9f3
Merge branch 'development' into issue-1663-change-rsvp-language
Meatchema Jan 28, 2026
11a372e
Merge branch 'development' into issue-1663-change-rsvp-language
Meatchema Feb 5, 2026
fa303f1
Fixed the user's Invited label in the table and card
Meatchema Feb 6, 2026
79180c3
Fixed the entry counter in 'volunteer details'-html printParticipants…
Meatchema Feb 6, 2026
fb6af41
Removed datetime restriction so that scanned user can show in volunte…
Meatchema Feb 9, 2026
12ebcff
changed eventVolunteerData to include non-waitlist RSVP's so that the…
Meatchema Feb 9, 2026
d977e8a
Removed resourceReader import statement
Meatchema Feb 9, 2026
0009316
Merge branch 'development' into issue-1663-change-rsvp-language
Meatchema Feb 10, 2026
286cee0
Merge branch 'development' into issue-1663-change-rsvp-language
Meatchema Feb 13, 2026
a3ee57d
Merge branch 'development' into issue-1663-change-rsvp-language
Meatchema Feb 17, 2026
8fb9053
I have changed the verbage from waitlist to waitlisted in volunteerDe…
Meatchema Feb 17, 2026
2440ebb
Changed createCheckbox to a dictionary to increase readability. Also,…
Meatchema Feb 17, 2026
fe07fd0
Updated RSVP before and After Status
Meatchema Feb 23, 2026
1a5fecc
re-implemented the attended status for the non-rsvp events
Meatchema Feb 23, 2026
1fcf75e
Merge branch 'development' into issue-1663-change-rsvp-language
Meatchema Mar 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions app/controllers/admin/volunteers.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,11 +115,12 @@ def volunteerDetailsPage(eventID):

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

attendedUser = list(set([obj for obj in eventParticipantData if not obj.rsvpWaitlist]))

return render_template("/events/volunteerDetails.html",
waitlistUser = waitlistUser,
attendedUser= eventParticipantData,
rsvpUser= rsvpUser,
attendedUser = attendedUser,
rsvpUser = rsvpUser,
event = event)


Expand Down
75 changes: 52 additions & 23 deletions app/logic/participants.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,30 @@ def addBnumberAsParticipant(bnumber, eventId):
userStatus = "already signed in"

else:
# Non-RSVP and RSVP event handling
userStatus = "success"
# We are not using addPersonToEvent to do this because
# that function checks if the event is in the past, but
# someone could start signing people up via the kiosk
# before an event has started
totalHours = getEventLengthInHours(event.timeStart, event.timeEnd, event.startDate)
EventParticipant.create (user=kioskUser, event=event, hoursEarned=totalHours)
if event.isRsvpRequired:
# RSVP event: standard logic (RSVP before event, attend after)
if event.isPastStart:
totalHours = getEventLengthInHours(event.timeStart, event.timeEnd, event.startDate)
EventParticipant.create(user=kioskUser, event=event, hoursEarned=totalHours)
else:
if not checkUserRsvp(kioskUser, event):
currentRsvp = getEventRsvpCountsForTerm(event.term)
waitlist = currentRsvp[event.id] >= event.rsvpLimit if event.rsvpLimit is not None else False
EventRsvp.create(user=kioskUser, event=event, rsvpWaitlist=waitlist)
targetList = "the waitlist" if waitlist else "the RSVP list"
try:
if g.current_user.username == kioskUser.username:
createRsvpLog(event.id, f"{kioskUser.fullName} joined {targetList}.")
else:
createRsvpLog(event.id, f"Added {kioskUser.fullName} to {targetList}.")
except Exception:
pass
else:
# Non-RSVP event: scanner entry ALWAYS marks as attended regardless of timing
totalHours = getEventLengthInHours(event.timeStart, event.timeEnd, event.startDate)
EventParticipant.create(user=kioskUser, event=event, hoursEarned=totalHours)

return kioskUser, userStatus

Expand All @@ -80,22 +97,34 @@ def addPersonToEvent(user, event):
try:
volunteerExists = checkUserVolunteer(user, event)
rsvpExists = checkUserRsvp(user, event)
if event.isPastStart:
if not volunteerExists:
# We duplicate these two lines in addBnumberAsParticipant
eventHours = getEventLengthInHours(event.timeStart, event.timeEnd, event.startDate)
EventParticipant.create(user = user, event = event, hoursEarned = eventHours)

if event.isRsvpRequired:
# RSVP event logic
if event.isPastStart:
if not volunteerExists:
eventHours = getEventLengthInHours(event.timeStart, event.timeEnd, event.startDate)
EventParticipant.create(user = user, event = event, hoursEarned = eventHours)
else:
if not rsvpExists:
currentRsvp = getEventRsvpCountsForTerm(event.term)
waitlist = currentRsvp[event.id] >= event.rsvpLimit if event.rsvpLimit is not None else 0
EventRsvp.create(user = user, event = event, rsvpWaitlist = waitlist)
targetList = "the waitlist" if waitlist else "the RSVP list"
if g.current_user.username == user.username:
createRsvpLog(event.id, f"{user.fullName} joined {targetList}.")
else:
createRsvpLog(event.id, f"Added {user.fullName} to {targetList}.")
else:
if not rsvpExists:
currentRsvp = getEventRsvpCountsForTerm(event.term)
waitlist = currentRsvp[event.id] >= event.rsvpLimit if event.rsvpLimit is not None else 0
EventRsvp.create(user = user, event = event, rsvpWaitlist = waitlist)

targetList = "the waitlist" if waitlist else "the RSVP list"
if g.current_user.username == user.username:
createRsvpLog(event.id, f"{user.fullName} joined {targetList}.")
else:
createRsvpLog(event.id, f"Added {user.fullName} to {targetList}.")
# Non-RSVP event logic
if event.isPastStart:
# After event: create EventParticipant (attended)
if not volunteerExists:
eventHours = getEventLengthInHours(event.timeStart, event.timeEnd, event.startDate)
EventParticipant.create(user = user, event = event, hoursEarned = eventHours)
else:
# Before event: create EventRsvp (invited status)
if not rsvpExists:
EventRsvp.create(user = user, event = event, rsvpWaitlist = False)

if volunteerExists or rsvpExists:
return "already in"
Expand Down Expand Up @@ -193,8 +222,8 @@ def sortParticipantsByStatus(event):
# if rsvp is required for the event, grab all volunteers that are in the waitlist
eventWaitlistData = [volunteer for volunteer in (eventParticipants + eventRsvpData) if volunteer.rsvpWaitlist and event.isRsvpRequired]

# put the rest of the users that are not on the waitlist into the volunteer data
eventVolunteerData = [volunteer for volunteer in eventNonAttendedData if volunteer not in eventWaitlistData]
# put all participants and non-waitlisted RSVPs into the volunteer data
eventVolunteerData = [volunteer for volunteer in (eventParticipants + eventNonAttendedData) if volunteer not in eventWaitlistData]
eventNonAttendedData = []

return eventNonAttendedData, eventWaitlistData, eventVolunteerData, eventParticipants
20 changes: 16 additions & 4 deletions app/templates/events/volunteerDetails.html
Original file line number Diff line number Diff line change
Expand Up @@ -59,20 +59,29 @@ <h4 class="nameSelect" nowrap><b>{{ participant.user.firstName }} {{ participant
{% macro printParticipants(type, attended, rsvp, waitlist) %}
{% set combinedParticipants = attended + rsvp + waitlist %}
{% for p in combinedParticipants | unique %}
{% if p in rsvp %}
{% if p in rsvp and not event.isRsvpRequired %}
{{createTable(p, 'invited') if type == 'table' else createCard(p, 'invited') }}
{% endif %}
{% if p in rsvp and event.isRsvpRequired %}
{{createTable(p, 'rsvp') if type == 'table' else createCard(p, 'rsvp') }}
{% endif %}
{% if p in attended%}
{{createTable(p, 'attended') if type == 'table' else createCard(p, 'attended') }}
{% endif %}
{% if p in waitlist %}
{{createTable(p, 'waitlist') if type == 'table' else createCard(p, 'waitlist') }}
{{createTable(p, 'waitlisted') if type == 'table' else createCard(p, 'waitlisted') }}
{% endif %}
{% endfor %}
{% endmacro %}

{% macro createCheckbox(checkboxName) %}
{% set labelText = "RSVP" if checkboxName == 'rsvp' else 'Waitlist' if checkboxName == 'waitlist' else 'Attended' %}
{%- set labelMap = {
'rsvp': 'RSVP',
'waitlist': 'Waitlisted',
'attended': 'Attended',
'invited': 'Invited'
} -%}
{% set labelText = labelMap.get(checkboxName, 'Invited') %}
<input class="displayCheckbox noprint" type="checkbox" name="selected_items" id="{{checkboxName}}Select" checked>
<label for="{{checkboxName}}Select">{{labelText}}</label><br>
{% endmacro %}
Expand All @@ -94,7 +103,7 @@ <h3 style="text-align: center; width:180%;">
<div class="row">
<div class="col">
<label><b>Volunteer Groups:</b></label><br>
{% if rsvpUser %}
{% if rsvpUser and event.isRsvpRequired %}
{{createCheckbox('rsvp')}}
{% endif %}
{% if waitlistUser %}
Expand All @@ -103,6 +112,9 @@ <h3 style="text-align: center; width:180%;">
{% if attendedUser %}
{{createCheckbox('attended')}}
{% endif %}
{% if rsvpUser and not event.isRsvpRequired %}
{{createCheckbox('invited')}}
{% endif %}
</div>
<div class="col">
<label><b>Included Information:</b></label><br>
Expand Down