From fe07fd018e8ac3487980324f43ef9faa228c248f Mon Sep 17 00:00:00 2001 From: Ariana Meatchem <146577403+Meatchema@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:54:31 -0500 Subject: [PATCH 01/14] Updated RSVP before and After Status --- app/logic/participants.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/app/logic/participants.py b/app/logic/participants.py index b0933a959..dd81a4a52 100644 --- a/app/logic/participants.py +++ b/app/logic/participants.py @@ -53,13 +53,28 @@ def addBnumberAsParticipant(bnumber, eventId): userStatus = "already signed in" else: + # If the event has already started, record as an EventParticipant (attendance). + # If the event is in the future, create an EventRsvp so RSVP lists remain consistent + # with templates that expect RSVP objects (which have `rsvpTime`). 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.isPastStart: + totalHours = getEventLengthInHours(event.timeStart, event.timeEnd, event.startDate) + EventParticipant.create(user=kioskUser, event=event, hoursEarned=totalHours) + else: + # create RSVP if one doesn't already exist + 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: + # logging should not break kiosk flow + pass return kioskUser, userStatus From 1a5fecca6785654350aae4f26ac0588a91dc2cd6 Mon Sep 17 00:00:00 2001 From: Ariana Meatchem <146577403+Meatchema@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:40:00 -0500 Subject: [PATCH 02/14] re-implemented the attended status for the non-rsvp events --- app/logic/participants.py | 82 +++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 34 deletions(-) diff --git a/app/logic/participants.py b/app/logic/participants.py index dd81a4a52..f896259aa 100644 --- a/app/logic/participants.py +++ b/app/logic/participants.py @@ -53,28 +53,30 @@ def addBnumberAsParticipant(bnumber, eventId): userStatus = "already signed in" else: - # If the event has already started, record as an EventParticipant (attendance). - # If the event is in the future, create an EventRsvp so RSVP lists remain consistent - # with templates that expect RSVP objects (which have `rsvpTime`). + # Non-RSVP and RSVP event handling userStatus = "success" - if event.isPastStart: + 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) - else: - # create RSVP if one doesn't already exist - 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: - # logging should not break kiosk flow - pass return kioskUser, userStatus @@ -95,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" From 1137e06cc302e835c41404323297ead668f4dd21 Mon Sep 17 00:00:00 2001 From: Ariana Meatchem <146577403+Meatchema@users.noreply.github.com> Date: Tue, 24 Mar 2026 15:32:50 -0400 Subject: [PATCH 03/14] Added Invited status into checkedbox javascript to allow for filtered removal --- app/static/js/volunteerDetails.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/static/js/volunteerDetails.js b/app/static/js/volunteerDetails.js index 1b6192a23..1b5aafdf7 100644 --- a/app/static/js/volunteerDetails.js +++ b/app/static/js/volunteerDetails.js @@ -28,6 +28,7 @@ $(document).ready(function () { const status = data[3].toLowerCase(); if (status === 'attended' && !$('#attendedSelect').is(':checked')) return false; if (status === 'rsvp' && !$('#rsvpSelect').is(':checked')) return false; + if (status === 'invited' && !$('#invitedSelect').is(':checked')) return false; if (status === 'waitlist' && !$('#waitlistSelect').is(':checked')) return false; return true; }); From ea0d70181b6f84886da51b62516ed4c46b2de443 Mon Sep 17 00:00:00 2001 From: Ariana Meatchem <146577403+Meatchema@users.noreply.github.com> Date: Mon, 30 Mar 2026 14:11:09 -0400 Subject: [PATCH 04/14] Add @propriety for RSVP and changed conditional to allow invited status under reservation status --- app/models/eventRsvp.py | 4 ++++ app/templates/events/manageVolunteers.html | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/models/eventRsvp.py b/app/models/eventRsvp.py index 8afdd47c2..d492a0e4c 100644 --- a/app/models/eventRsvp.py +++ b/app/models/eventRsvp.py @@ -9,6 +9,10 @@ class EventRsvp(baseModel): rsvpTime = DateTimeField(default=datetime.now) rsvpWaitlist = BooleanField(default=False) + @property + def rsvp(self): + # EventRsvp always represents an RSVP record, including invited participants. + return True class Meta: indexes = ( (('user', 'event'), True), ) diff --git a/app/templates/events/manageVolunteers.html b/app/templates/events/manageVolunteers.html index aa66235fe..86d95f9c1 100644 --- a/app/templates/events/manageVolunteers.html +++ b/app/templates/events/manageVolunteers.html @@ -239,7 +239,7 @@