Phase 3c: Registration form improvements (photo required, division field, coach interstitial fix) #44

Closed
opened 2026-03-11 00:31:15 +00:00 by forgejo_admin · 0 comments

Lineage

  • Plan: plan-2026-03-08-tryout-prep
  • Phase: Phase 3c — Registration form improvements
  • Project: Westside Basketball (project-westside-basketball)

Repo

forgejo_admin/basketball-api

User Story

As a program admin, I need the registration form to collect division (Boys/Girls) and require a player photo so we have complete rosters for tryout day. As a coach signing up via Stripe Connect, I need correct instructions that don't cause Stripe to reject my application.

Context

  • 7 of 38 families have completed registration. 4 of those 7 didn't upload photos.
  • No division (Boys/Girls) field exists — Marcus needs this for team assignment.
  • Coach Stripe interstitial included a website URL that Stripe rejects, causing onboarding failures.
  • Token flow has an edge case where is_paid can be False despite parent having paid, showing a confusing Stripe link.
  • Email template was missing tryout details (date, time, location).

File Targets

  • src/basketball_api/models.py — Division enum + column on Player
  • src/basketball_api/routes/register.py — division dropdown, photo required, is_paid safety net
  • src/basketball_api/routes/coach.py — remove website URL, add product description guidance
  • src/basketball_api/services/email.py — tryout details in email template
  • alembic/versions/e09c9e678004_add_division_column_to_players.py — migration 006

Acceptance Criteria

  • Division dropdown (Boys/Girls) on form, required, saved to DB
  • Photo upload required for first-time submissions, optional for returning players who already have a photo
  • Coach interstitial: no website URL, shows product description + "I don't have a website"
  • Token flow always shows "Payment Received", never "Payment Required"
  • Email template includes tryout date (Friday March 13), time (5:30 registration, 6 PM tryouts), location (Kongo Basketball Gym, Farmington UT)

Test Expectations

  • Existing tests pass (register, coach, upload)
  • New registration without photo is rejected
  • New registration without division is rejected
  • Returning player with existing photo can submit without re-uploading
  • Division value persists in DB and pre-fills on return via token

Constraints

  • CI is broken platform-wide (blank test logs). Manual image build + push to Harbor required.
  • Migration runs on pod startup (alembic upgrade head in CMD).
  • Must be deployed before Thursday reminder blast.

Checklist

  • Code changes
  • Migration created
  • Tests updated
  • PR submitted
  • Review-fix loop passed
  • Manual image build + push
  • Deployed and verified
  • Phase 3b (COMPLETED) — email blast, backfill, coach onboarding
  • PR #42 — player name dedup fix
  • PR #41 — coach Stripe interstitial (original)
  • westside-staff — staff roster doc
### Lineage - **Plan**: `plan-2026-03-08-tryout-prep` - **Phase**: Phase 3c — Registration form improvements - **Project**: Westside Basketball (`project-westside-basketball`) ### Repo `forgejo_admin/basketball-api` ### User Story As a program admin, I need the registration form to collect division (Boys/Girls) and require a player photo so we have complete rosters for tryout day. As a coach signing up via Stripe Connect, I need correct instructions that don't cause Stripe to reject my application. ### Context - 7 of 38 families have completed registration. 4 of those 7 didn't upload photos. - No division (Boys/Girls) field exists — Marcus needs this for team assignment. - Coach Stripe interstitial included a website URL that Stripe rejects, causing onboarding failures. - Token flow has an edge case where is_paid can be False despite parent having paid, showing a confusing Stripe link. - Email template was missing tryout details (date, time, location). ### File Targets - `src/basketball_api/models.py` — Division enum + column on Player - `src/basketball_api/routes/register.py` — division dropdown, photo required, is_paid safety net - `src/basketball_api/routes/coach.py` — remove website URL, add product description guidance - `src/basketball_api/services/email.py` — tryout details in email template - `alembic/versions/e09c9e678004_add_division_column_to_players.py` — migration 006 ### Acceptance Criteria - [ ] Division dropdown (Boys/Girls) on form, required, saved to DB - [ ] Photo upload required for first-time submissions, optional for returning players who already have a photo - [ ] Coach interstitial: no website URL, shows product description + "I don't have a website" - [ ] Token flow always shows "Payment Received", never "Payment Required" - [ ] Email template includes tryout date (Friday March 13), time (5:30 registration, 6 PM tryouts), location (Kongo Basketball Gym, Farmington UT) ### Test Expectations - Existing tests pass (register, coach, upload) - New registration without photo is rejected - New registration without division is rejected - Returning player with existing photo can submit without re-uploading - Division value persists in DB and pre-fills on return via token ### Constraints - CI is broken platform-wide (blank test logs). Manual image build + push to Harbor required. - Migration runs on pod startup (`alembic upgrade head` in CMD). - Must be deployed before Thursday reminder blast. ### Checklist - [ ] Code changes - [ ] Migration created - [ ] Tests updated - [ ] PR submitted - [ ] Review-fix loop passed - [ ] Manual image build + push - [ ] Deployed and verified ### Related - Phase 3b (COMPLETED) — email blast, backfill, coach onboarding - PR #42 — player name dedup fix - PR #41 — coach Stripe interstitial (original) - `westside-staff` — staff roster doc
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
forgejo_admin/basketball-api#44
No description provided.