Skip to Content
AdministrationTeams ManagementOverview

Teams Management

The Teams Management page is where region administrators view, filter, and edit every team in their active seasons. It lives at Region Management > Teams and replaces the older Django-based /region/teams/ page.

Prerequisite: You must have Teams — Can View permission at the region level. The Teams — Can Edit permission is required to edit team records. See Permissions for details. PII (emails, phone numbers) is only shown when you also have View Teams PII for the season.


Layout

The page has up to three tabs at the top:

TabPurpose
Team InfoThe team list, filters, and edit dialog.
StatsTeam-status counts over time across selected programs.
ImportTableau / Roster / Fingerprinting / VMS upload UI. Hidden when your deployment runs in Team Formation mode.

The active tab is reflected in the URL (?view=stats, ?view=import), so direct links + browser refresh preserve your place.


Team Info tab

Filters

All filters apply client-side against the full roster that’s loaded on page open — changing a filter never triggers a server round-trip, so regions with 500+ teams filter in a few milliseconds per keystroke.

FilterNotes
SearchMatches against team number, team name, purchaser name, coach name, asst coach name, and org name. Debounced at 150ms.
SeasonActive seasons only. Dropdown shows program logo + season name + year.
ProgramShown only if the partner has more than one program (e.g., FLL Challenge + FLL Explore).
StatusMulti-select. Options are populated from the statuses actually present in the loaded rows, rendered with their color chip.
EventsMulti-select. Options are the unique event names across loaded rows. A row matches if it’s registered for any of the selected events.

Filter state is reflected in the URL (?season=, ?program=, ?status=, ?events=, ?q=) so every filtered view is linkable.

On mobile, the filter bar collapses into an accordion labeled “Filters” with a count chip showing how many filters are active.

Progress bar on load

When you first open the page:

  1. An indeterminate progress bar appears while the first page of team data is in flight.
  2. Once the first page returns with a total count, the bar switches to a determinate “Loaded X of Y” indicator and fills as subsequent pages arrive.
  3. The bar disappears when all teams are loaded.

Partner regions with 500+ teams typically see the page populate in 5–10 seconds.

Team list (desktop)

Desktop shows a dense table with two pinned columns so they stay on screen during horizontal scroll:

  • Left pin: the primary “Team” cell.
  • Right pin: the Actions cell.

Primary cell

RowContent
1Program-colored number chip + team name (bold)
2🏫 Org name · 👥 N coaches · 🎓 N students

Coach/student counts turn red + bold when below 2 (the minimum expected for a healthy roster). Hover any element for a descriptive tooltip.

Other columns

ColumnContent
StatusColor-coded status chip. Hover for the official description.
Purchaser / Coach / Asst CoachName, email, phone, plus small icons for: ✅ YPP status, 🔒 linked Lumieos account, 🫆 fingerprint clearance (when the season requires it), 💲 impersonate-in-commerce (when you have the permission).
EventsComma-separated list of events the team is registered for.
City / ZipTeam location.
PaidDate paid, from the linked FIRST record (when available).
RookieRookie badge + year.
ActionsEdit (pencil), Open Team Page (ID card), and on unlinked FIRST records: Mark as (not) participating (×).

Roster warnings icons

The small per-contact icons flag common compliance issues:

  • YPP check — Green when the contact has completed Youth Protection Program screening at FIRST, red when not.
  • Lock — Solid primary color when that contact has a linked Lumieos account; muted when they haven’t signed up yet.
  • Fingerprint — Green/red indicator for state-mandated fingerprinting. Only shows when enable_ca_fingerprinting is set on the season.
  • $ impersonate — Opens a new tab impersonating that user’s commerce session. Only visible when you have the Impersonate permission and the contact has a linked account.

Team list (mobile)

On small screens, the table is replaced with a card list. Each card starts in a compact state showing only the primary cell, status chip, and action buttons. A chevron toggles the full record: contacts (purchaser, coach, asst coach), events, location, date paid, and rookie status.

Use the Expand all / Collapse all button in the toolbar to set the baseline state for every card at once; individual cards can still be toggled afterwards.

Toolbar

The toolbar above the team list has:

  • Expand all / Collapse all (mobile only) — sets the baseline expansion state for every card.
  • Reload — refetches the team list. Also fires automatically when an import completes (see the Import tab), so you usually don’t need to click it manually.
  • Show PII / Hide PII — toggles whether contact names, emails, and phone numbers render as real values or masked (Mary S. / •••@•••.••• / ••• ••• ••••). Masked by default on every page load so the page is safe to share on-screen in meetings and demos. Your preference persists per browser. Only appears when you have View Teams PII permission — without it the masked values are all you see.
  • Export… — opens the Export dialog (see below). Replaces the old in-browser CSV; the new flow is server-generated, honors PII permissions, and delivers a downloadable zip.

Edit dialog

Clicking the ✏️ pencil opens the edit dialog for the team. The dialog has two collapsible sections at the top and two tabs underneath:

  • Contacts — Read-only Purchaser / Coach / Asst Coach blocks (same data as the row cells).
  • Events — Read-only list of events the team is registered for.
  • Team Info tab — Editable fields:
    • Override Team Status — Bypass the automatic status calculation. Normally set to Auto. Options:
      • Good, Initially Registered, Roster Not Complete, Pending Invites, Pending Agreements, Not Participating, Error, Urgent Roster Issue, Auto.
      • Tableau-mode only: Pending Jotform Completion, Coach Missing YPP. (Hidden in formation mode unless a team already has one of these stored, in which case it shows as (deprecated) and cannot be re-selected once changed.)
    • Status Notes (public-facing) — Shown on the team’s own status page.
    • JotForm Complete / JotForm Submission ID — Only appears when the season uses JotForm (season.jotform !== 'no'). In formation mode the JotForm checkbox is fully skipped so saving can’t accidentally overwrite stored values.
  • Audit Log tab — All change records for the team (field-level old/new values + who made the change). User names are lazy-loaded.

Click Save to persist only the fields you changed. Success and error toasts appear in the bottom-right corner.

The dialog URL-syncs via ?team=<id> so you can share a link that opens a specific team’s edit dialog directly.

Unlinked FIRST records

When a team has been imported from Tableau but hasn’t yet signed up in Lumieos (no Team record), it appears in the list as a dimmed row with only one action: Mark as (not) participating. This opens a confirmation dialog that writes to the linked NationalTeamRegistrationRecord.

These rows don’t exist in formation-mode deployments (no Tableau imports → no orphan NR records).

Export…

Clicking Export… opens a dialog to build a server-generated export. The server runs the export as a background job, writes a zip to object storage, and notifies you with a snackbar when the file is ready. The snackbar’s Download button streams the file through a session-authenticated endpoint — there is no shareable download link and no email is sent. You stay in the browser the whole time.

Categories

Select one or more categories; the zip will contain one CSV per selection.

CategoryContents
Team SummaryThe columns visible on the teams page plus team ID, the team’s manage URL, its event-registration URL, and its events/results URL. Handy for mail merges.
Full NR exportEvery field on the underlying FIRST National Registration record. Non-PII fields only unless you have View Teams PII permission; restricted cells are blanked per row, not per file, so a user with PII on one season still gets a redacted full-partner export.
Contacts with PIIOne row per contact (purchaser / coach / asst coach) with full name, email, phone, screening, and fingerprinting status. Requires View Teams PII permission; the card is disabled otherwise.
RosterOne row per student member with team number, team ID, first name, last initial, status, and consent-form status.

Scope

Two options:

  • Use current filters (default) — exports only the teams that match your current season / program / status / events / search filters. The view you see on the page is what the CSV contains.
  • Everything I can view — exports every team in every season you have Teams — Can View permission on.

In both modes the export is constrained to seasons your account actually has permission to view. A user with view_teams on one season cannot export teams from another.

Concurrency and expiry

  • You can have up to 3 exports running at once. A 4th attempt returns a warning — wait for one to finish.
  • Files are retained for 48 hours after the export runs, then deleted automatically. Download promptly or re-run.
  • If you close the browser tab before the export finishes, the backend job keeps running but the file orphans (no persistent job list to recover it from). The cleanup catches it at 48h.

Errors

If a generator fails mid-run, the snackbar shows a short “Something went wrong — our team has been notified” message. The full exception is captured in Sentry; file a ticket with the export’s timestamp so we can investigate.


Stats tab

A stacked-bar chart showing team-status counts over time across one or more programs. Use the Programs dropdown to filter to a subset. The chart reads from the same team-status daily snapshot used by the dashboard; only dates with any non-zero count are shown.

The Stats tab lives on the Teams page and was previously on the Region Dashboard under a “Stats” tab there.


Import tab

The Import tab is where region administrators upload the four Tableau data files that drive Tableau-mode seasons. It replaces the standalone import screen on the old Django-based page.

The tab is only visible when your deployment runs in Tableau mode. If ENABLE_TEAM_FORMATION is on, teams are created directly inside Lumieos and this tab is hidden entirely.

Start an Import

At the top of the tab is a Start an Import card with:

  1. Season selector — a logo card per active season. Always shown, even if you only have one season, so there’s no ambiguity about which season the import will write to.
  2. Four drag-and-drop file slots:
    • Team Tableau File
    • Roster Tableau File
    • CA Fingerprinting Tableau File — only appears when the selected season has fingerprinting enabled.
    • VMS Volunteer File
  3. Start Import — enabled once the season is picked and at least one file has been attached. You don’t need to upload all four; any combination is accepted.

Each slot accepts a CSV dropped onto it or chosen via click. A selected file shows as a chip with its name and size; the × next to it clears the selection.

Recent Imports

Below the form is a list of recent imports for the selected season, newest first. Each entry renders as a result card with:

  • Header: the import’s ID and creation time.
  • Four columns (Team / Roster / Fingerprint / VMS), each with:
    • A status badge (Pending, Processing, Complete, Failed, or Skipped).
    • While processing: a live progress bar and “Processing N/M” counter.
    • A list of affected records with Added / Updated badges once the column completes.
  • A Status Transitions section below the four columns, listing every team whose computed status changed as a result of this import (for example, Team 1234 — Roster Not Complete → Good). Only shown when there are transitions.

The list paginates: the first five imports load immediately, with a Show 5 more button at the bottom that appends the next five until all have been shown.

Live updates

Import progress updates stream to the browser in real time using Server-Sent Events — no need to refresh the page. You’ll see each column’s progress bar tick up, the record list populate, and the Status Transitions section grow as teams flip status. When all four columns finish, the stream closes and the Reload button on the Team Info tab fires automatically so the table reflects the new state.

If you navigate away before an import finishes, the backend job keeps running, but you won’t see live progress until you return. You can still find the finished import in Recent Imports once it lands.

Fingerprinting-disabled seasons

If the selected season has CA AB506 fingerprinting turned off, the fingerprint input is hidden on the form and the fingerprint column is hidden on every result card in that season’s history. You can still see fingerprint data on older imports for seasons where fingerprinting was enabled.

Error handling

Each of the four columns flips independently to a red Failed badge if its processor hits an error. Other columns continue unaffected. Transitions captured before the failure are still recorded. Reach out to technical support with the import’s ID if you see repeated failures.


Formation mode vs Tableau mode

The page works in both modes with a few mode-specific differences:

ElementTableau modeFormation mode
Unlinked-FIRST (NR-orphan) rowsShown dimmedNot shown (no NRs exist)
Coach YPP / screening / fingerprint iconsPopulated from NRHidden (no NR data)
JotForm fields in edit dialogShown when season uses JotFormShown when season uses JotForm
status_override values waiting_jotform / pending_national_screeningAvailableHidden unless already stored
Date Paid columnFrom the linked NREmpty (formation invoice date is a planned enhancement)

ENABLE_TEAM_FORMATION is a per-deployment setting in Django settings.


Planned enhancements

Work items tracked against this page:

  • #257 — PII masking toggle (shipped).
  • #258 — Tableau/Roster/Fingerprint/VMS import UI + team-status transition data on the result card (shipped).
  • #259 — Server-generated export with a category picker, replacing the in-browser CSV (shipped).
  • #260 — Saved filter presets.

Found a bug or have a suggestion? File it under the Area::Region Admin label.

Last updated on