Skip to content

UC-11 Admin manages a live event

Primary actor SHS Staff (Admin)
Supporting actors Event Attendant
Priority Should
Satisfies FR-D4, FR-D5, FR-D6, FR-D8
Precondition A published challenge with the event's task exists.
Trigger The admin opens Live Ops for the task, or the attendant opens the display link.

Live shows one of two variants, by the week's check-in method (ADR 0006): the rotating code for a staffed table, or the printed poster for a location nobody staffs. The count card, the number-only feed and the override panel are the same on both.

Main success scenario (rotating code)

  1. Live Ops shows the event QR, re-minted every 30 seconds so a photographed code stops validating, with the 7-character backup code beside it.
  2. The admin, or an attendant with no account, opens the display link on a projector: a full-screen QR with no staff session on the shared screen.
  3. Live Ops polls the check-in count and a feed that identifies students only by number.
  4. Where a scan failed, the admin records, corrects or removes a completion in the override panel, giving a reason; the change and its audit row commit together.

Alternative success scenario (printed poster)

  1. Live Ops shows a miniature of the sheet, a window status chip (Opens Tue 11:00 AM / Open until 2:00 PM / Ended 2:00 PM), and the caption Printout N · the code on the poster works only during the event window. No rotating QR, no Rotate code, no display links.
  2. Print poster opens the poster page: one US Letter sheet, black on white, the challenge and week, where and when in campus time, a 3.5-inch QR encoding /checkin#t=<token>, one instruction line, Printout N. Opening the page mints the poster (poster_issued). Printing it again voids nothing.
  3. Copy check-in link and Download QR mint the same credential (the same URL, window and generation) for an email, an announcement or a flyer.
  4. Reprint and void old copies, behind a confirm that names the consequence, advances the week's printout generation (poster_reissued): every earlier sheet is refused as replaced from the next scan on, and the poster page opens with the new printout.
  5. The count and the number-only feed are how an admin at their desk sees the poster working; the override panel is the catch-up path after the window closes.

Extensions

  • 1a. The projected code is stale. Live Ops warns before students scan it.
  • 2a. Display link rate limit. The public display endpoint is throttled per client.
  • 4a. Override on a rehearsal student. Allowed, and excluded from reports like every rehearsal row.
  • Method switch (UC-5). Switching a week off the poster also advances its generation, so switching back later does not revive old sheets; switching onto the poster ends any live display link. Both are checkin_method_changed in the ledger.
  • A display link for a poster week is refused (409); a poster for a rotating week is refused the same way.
  • Audit. Every override names the student and the acting admin in CheckInAudit; the reason is required.

Acceptance criteria (Gherkin)

Feature file Test module
live_event_dashboard.feature test_live_event_dashboard_bdd.py
live_qr_staleness.feature and frontend/live_qr_staleness.feature test_live_qr_staleness_bdd.py
display_link.feature test_display_link_bdd.py
manual_override.feature test_manual_override_bdd.py
checkin_audit_names_the_student.feature and frontend/checkin_audit_names_the_student.feature test_checkin_audit_names_the_student_bdd.py
check_in_override_panel_dismissal.feature and frontend/check_in_override_panel_dismissal.feature test_check_in_override_panel_dismissal_bdd.py

Plain pytest: test_manual_override.py, test_display_link.py, test_display_link_rate_limit.py, test_checkin_audit_student_subject.py; for the poster, test_event_poster.py (mint, 409s, reissue and its ledger rows) and test_task_checkin_method.py (the switch, the display-link refusal and revoke). Frontend: LiveOps.test.tsx, LiveOps.staleness.test.tsx, Display.test.tsx, LiveOps.poster.test.tsx, PosterPage.test.tsx.

Views

Code: backend/app/routers/display_links.py, backend/app/services/display_links.py, backend/app/services/checkins.py, backend/app/routers/posters.py, backend/app/services/posters.py, frontend/src/components/admin/LiveOps/, frontend/src/components/admin/PosterPage/, frontend/src/components/Display/. ADR 0005 records the display-credential decision and ADR 0006 the poster.