Phase 4: Tryout day — roster, check-in, walk-ups #46
Labels
No labels
domain:backend
domain:devops
domain:frontend
status:approved
status:in-progress
status:needs-fix
status:qa
type:bug
type:devops
type:feature
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
forgejo_admin/basketball-api#46
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Lineage
plan-2026-03-08-tryout-prep→ Phase 4Repo
forgejo_admin/basketball-apiUser Story
As a coach, I want to view the player roster on my phone during tryouts so I can match faces to names and see tryout numbers.
As Marcus (admin), I want to check players in at the door, see who paid and who completed registration, and handle cash walk-ups so tryout day runs smoothly.
As a coach, I want a printed roster on my clipboard with player numbers, names, and key info so I can take notes during evaluations.
Context
Tryouts are March 13 (tomorrow). Phases 1–3c are complete. Registration is live, 41 families paid, 38 emailed, players are actively registering with photos, division, and waivers.
Key decisions made in planning:
<meta name="robots" content="noindex">. No auth required. Coaches access via link Marcus texts them.GET /payredirects to the Stripe checkout URL (https://buy.stripe.com/aFa8wRbky5KwgL0bI60VO01). QR code points here. Memorable URL for Marcus to say out loud.CASHPAIDStripe promo code (100% off, 50 max). Already created. Marcus collects cash, gives code, parent does $0 Stripe flow → auto email → registration.File Targets
Files to create:
src/basketball_api/routes/tryouts.py— new file: all tryout-day views (coach roster, print view, admin check-in,/payredirect, bulk number assignment)Files to modify:
src/basketball_api/main.py— register the new tryouts routersrc/basketball_api/brand.py— may need new CSS constants for card layoutFiles the agent should NOT touch:
src/basketball_api/routes/register.py— registration flow is stable, don't break itsrc/basketball_api/models.py—tryout_numberandchecked_infields already exist, no migration neededAcceptance Criteria
Sub-phase 4a: Setup
GET /payreturns 302 redirect tohttps://buy.stripe.com/aFa8wRbky5KwgL0bI60VO01POST /tryouts/admin/{tenant_slug}/assign-numbers(auth-gated admin) bulk-assigns tryout numbers by registration order (earliestcreated_at= #1). Idempotent — re-running doesn't change existing assignments.Sub-phase 4b: Coach roster (mobile)
GET /tryouts/roster/{tenant_slug}serves HTML with player cards (no auth)<meta name="robots" content="noindex">photo_url), player name, division (Boys/Girls), school, position, height, graduating classchecked_in=TrueSub-phase 4c: Printable roster
GET /tryouts/roster/{tenant_slug}/printserves a print-optimized HTML tabledate_of_birth), School, Position, Height@media printstyles applied automaticallySub-phase 4d: Admin check-in
GET /tryouts/admin/{tenant_slug}serves HTML (auth-gated:require_role("admin"))POST /tryouts/admin/{tenant_slug}/checkin/{player_id}markschecked_in=Trueon the player. Returns redirect back to admin page.Test Expectations
GET /payreturns 302 with correct Location headerchecked_in=Trueon the playerpytest tests/ -vConstraints
src/basketball_api/brand.pyfor CSS colors and styles.ROSTER_CSSas a starting reference but the new views need card-based layout, not just a table./uploads/photos/{filename}via StaticFiles mount (already configured).STRIPE_TRYOUT_LINKconstant already exists inroutes/register.py— import or duplicate it, don't hardcode the URL in a third place. Actually, move it toconfig.pyorbrand.pyif it makes sense.date_of_birthfield. If null, show "—"./{tenant_slug}/rosterand/{tenant_slug}/roster/viewroutes — don't remove them.Checklist
Related
project-westside-basketballsrc/basketball_api/routes/roster.pysrc/basketball_api/brand.pysrc/basketball_api/routes/upload.py