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:
| Tab | Purpose |
|---|---|
| Team Info | The team list, filters, and edit dialog. |
| Stats | Team-status counts over time across selected programs. |
| Import | Tableau / 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
Season, Program, Status, and Events filter the rows already loaded in the browser — changing one of them never triggers a server round-trip. Search works differently: it’s answered by the server and reloads the table, so a large region may see a short delay after you stop typing.
| Filter | Notes |
|---|---|
| Search | Matches team number, team name, and organisation name, plus the FIRST team-list contacts (purchaser, coach, and assistant coach) by name, and everyone on the team’s roster in Lumieos by name. Email addresses for those contacts and roster members are matched too, but only for seasons where you hold View Teams PII and your region’s PII prerequisites are complete. Typing more than one word requires every word to match. Debounced at 400ms. |
| Season | Active seasons only. Dropdown shows program logo + season name + year. |
| Program | Shown only if the partner has more than one program (e.g., FLL Challenge + FLL Explore). |
| Status | Multi-select. Options are populated from the statuses actually present in the loaded rows, rendered with their color chip. |
| Events | Multi-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.
Filter Presets
Use the Presets control in the filter bar to save the current filter combination under a name and re-apply it later with one click — useful for views you return to often (e.g. “FLL — waiting on payment”). Presets can be deleted from the same menu. They are saved to your user profile, so they follow you across devices and sessions.
Your preferred table page size (25 / 50 / 100 rows) is also remembered per user, here and on the Invoices and Volunteers tables.
Progress bar on load
When you first open the page:
- An indeterminate progress bar appears while the first page of team data is in flight.
- 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.
- 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
| Row | Content |
|---|---|
| 1 | Program-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.
A team your region is still forming has no number until its formation invoice is paid, so in place of the number chip it shows an outlined Draft chip. Its Agreements action stays disabled until the number arrives, because that dialog looks agreements up by team number.
List order
Teams with numbers come first, in number order. Teams still being formed follow them, listed alphabetically by name, so drafts never push the rest of the season off the first pages.
Other columns
| Column | Content |
|---|---|
| Status | Color-coded status chip. Hover for the official description. |
| Purchaser / Coach / Asst Coach | Name, 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). |
| Events | Comma-separated list of events the team is registered for. |
| City / Zip | Team location. |
| Paid | Date paid, from the linked FIRST record (when available). |
| Rookie | Rookie badge + year. |
| Actions | Edit (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 FIRST report shows the contact’s YPP agreement signed and the “YPP Screening Requirements Met” verdict as Satisfies YPP Requirements; red otherwise. A signed agreement on its own does not count.
- Lock — Solid primary color when that contact has a linked Lumieos account; muted when they haven’t signed up yet.
- Fingerprint — Green when Live Scan fingerprinting, Mandated Reporter Training (MRT), and the BCIA 9018 form are all complete; red when Live Scan or MRT is missing (or, from the BCIA 9018 effective date, the form); a warning color when only the form is unconfirmed before that date. Hover for the breakdown. Only shows when
enable_ca_fingerprintingis set on the season. The Season Compliance Report (Region Management > Reports) exports the same breakdown as Live Scan / MRT / BCIA 9018 columns per coach. See BCIA 9018 Form for how the form status is inferred. - $ 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.
Manually marking screening
Coaches invited directly — outside the national-system import — have no FIRST screening record, so their screening status can’t sync automatically. For these contacts, the team edit dialog shows a Mark screened button next to the coach or assistant coach (requires the Manage Teams permission). Marking creates a manual screening record scoped to your partner that expires after the season’s cleanup date; Clear screening removes it. Screening shared from another partner is also reflected automatically.
Deleting a faulty team
Teams created in error — duplicate signups, or test entries left behind — can be deleted directly (requires the Manage Teams permission). The delete action asks for confirmation before removing the team and its roster.
Teams with completed payments are protected: rather than deleting, the action stops with a message explaining that the team has payment history. This keeps invoice records intact and auditable. Contact support if such a team genuinely needs to be removed.
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.
- Override Team Status — Bypass the automatic status calculation. Normally set to Auto. Options:
- 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.
Season Jotform
When a season’s JotForm Mode (Region Management > Configuration > Season > JotForm Integration) is anything other than No, every team sees a Complete Jotform button on its team page and a Pending Jotform action item on its dashboard until the form is marked complete.
Prefilling the team number
Put {team_number} anywhere in the JotForm URL and Lumieos substitutes the team’s number wherever the link is shown. For example, to prefill a form field named fllTeam:
https://form.jotform.com/123456?fllTeam={team_number}The older %team_number% placeholder still works. The URL field in Season Settings shows this hint.
For the webhook URL a season’s JotForm posts back to, reading callback outcomes, and sharing one JotForm across programs, see JotForm Team Forms and Callbacks.
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.
| Category | Contents |
|---|---|
| Team Summary | The 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 export | Every 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 PII | One 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. |
| Roster | One 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_FORMATIONis 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:
- Season selector — a logo card per active season. Always shown, even if you only have one season, so there’s no ambiguity about where the import will write. You can select more than one: where a single FIRST report covers several programs, pick every season it covers and upload once.
- Four drag-and-drop file slots:
- Team Tableau File
- Roster Tableau File
- CA Fingerprinting Tableau File — appears when any selected season has fingerprinting enabled.
- VMS Volunteer File
- Start Import — enabled once at least one season is picked and at least one file has been attached. You don’t need to upload all four; any combination is accepted.
Selecting several seasons starts a separate import for each, from the one set of files. Each gets its own row under Recent Imports with its own progress and its own results, so a problem in one season does not obscure what happened in the others. Changing your season selection no longer clears the files you have already attached.
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.
File format requirements
Each file must be the CSV data export of the standard FIRST Tableau report, downloaded unmodified. In Tableau, use the download option that exports the underlying data as CSV — a crosstab, summary view, PDF, or Excel workbook will not import, and neither will a file whose columns were trimmed or reordered by hand.
Before anything is written, the import validates the header row of each file against the columns the standard reports contain. Comma- and tab-delimited files are both accepted (the delimiter is detected automatically), but if the expected columns can’t be found the file is rejected outright. Which report to download and what each file needs:
| File | Tableau report | Header requirements |
|---|---|---|
| Team file | List PII - Team Status Report | The full standard team-detail column set (Team Number, Team Nickname, the Team Admin and LC1/LC2 contact and agreement columns, address fields, season registration and payment columns, Program, and more — roughly 60 columns). Exporting a reduced or re-arranged version of the report is the most common cause of a rejected file. |
| Roster file | Team Roster - Youth | Six columns: Team Number, Youth Name First, Youth Last Name Initial, FIRST Consent Release Status, FIRST Consent Release Date Signed, Program. |
| CA Fingerprinting file | LIST PII - Team Roster - CA Local Clearances | P Id, Name First, Name Last, Email, CA YPP Clearances, CA Livescan Fingerprint, CA Mandated Reporting Training, Program, Team Number. STATE DOJ Form BCIA-9018 is optional — a report without it still imports. Only relevant when the season has CA AB506 fingerprinting enabled — otherwise the upload slot is hidden. |
FIRST LEGO League: Future Edition. All three grade bands (K-2, 3-5, 6-8) share the same Program value in these reports. The team file’s Registration Type column decides which band’s season a team belongs to. The roster and fingerprinting files have no such column, so their rows follow the team number: a row is applied only to a team that is already in the season’s team list. Import the team file for each band first, or in the same submission.
Common failure signatures:
- File rejected immediately, nothing imported — the header didn’t match: usually a crosstab/summary export instead of the data CSV, an Excel file renamed to
.csv, or a report with columns removed. - Import runs but skips rows — normal for repeated header rows and malformed lines inside an otherwise valid file; the affected-records list on the result card shows what was actually written.
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, orSkipped). - 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 badge (
- 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.
The BCIA 9018 column
The FIRST California report now carries the DOJ BCIA 9018 form as its own column, STATE DOJ Form BCIA-9018. Where the report states the form’s status, Lumieos takes it at its word. Where the cell is blank — an older export, or a report that simply leaves it empty — the form’s state is inferred from the other clearance columns, exactly as it was before the column existed. Either way the import succeeds, so there is no need to re-export or re-upload anything you have already imported.
The form only affects whether a coach counts as cleared once its effective date arrives. Before that date, a coach whose Live Scan and mandated reporter training are on file but whose form is unconfirmed is cleared, with a warning: the fingerprint icon on the region team list turns amber, and the team’s own page shows Upcoming State Requirement — BCIA 9018 with the date. From the effective date on, the unconfirmed form blocks clearance like any other missing item, and the icon’s tooltip names it specifically rather than reporting a missing fingerprint.
Note: A value the report has never used before is treated as not stated and falls back to the inference, rather than being read as missing. This is deliberate — guessing would block a coach who is in fact compliant.
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:
| Element | Tableau mode | Formation mode |
|---|---|---|
| Unlinked-FIRST (NR-orphan) rows | Shown dimmed | Not shown (no NRs exist) |
| Coach YPP / screening / fingerprint icons | Populated from NR | Screening reflects manual/shared records (see Manually marking screening); YPP and fingerprint hidden (no NR data) |
| JotForm fields in edit dialog | Shown when season uses JotForm | Shown when season uses JotForm |
status_override values waiting_jotform / pending_national_screening | Available | Hidden unless already stored |
| Date Paid column | From the linked NR | Empty (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.