Tournaments

Atlas / tournament documentation

Exports and import

Every file the tournament can export, the spreadsheet import wizard step by step, and the validation messages that stop an import.

The Imports and exports screen moves tournament data in and out of Meridian. It holds a wizard that reads a spreadsheet and writes entries, judges, rooms, debates and results; a roster download; the tab workbook export; and the DebateXML and Meridian JSON exchange. A separate bar of CSV downloads sits at the top of every other admin screen.

The screen is the Exports entry under Records in the left rail, at the route /tournaments/{id}/admin/data. Its on screen eyebrow reads Data & Integrations and its heading reads Imports and exports. The CSV bar reads Export tab data as CSV, appears on every admin screen except Setup, and downloads from /tournaments/{id}/admin/export?resource= followed by the name of the file.

Who can use it

RoleWhat the role can do
Platform adminOpen the screen, import, and download every file.
Organization owner or adminThe same as a platform admin, for tournaments of the organization.
Tournament admin seatThe same.
Tab seatThe same. Exports and imports are not limited to full admins.
Compliance seatCannot reach the screen, the CSV bar or any download. A compliance seat is sent to Records, and the layout hides the CSV bar from it.
Coach, competitor, judge, observerCannot reach the screen. A download address answers Forbidden or Unauthorized.

Every download and every import checks admin access again on the server. A person who is not signed in is refused with a 401 answer, and an account that does not administer the tournament is refused with a 403 answer, apart from the tab workbook, which answers as not found.

The CSV bar

The bar is a collapsed section. Selecting Export tab data as CSV opens a row of eight links. Each link downloads one file directly from the table named below, filtered to this tournament. A file is named resource-tournamentid.csv, for example rooms- followed by the tournament's identifier.

LinkFile contentHeader row
RegistrationsEvery entry row of the tournament in every status, including dropped and waitlisted entries.Every column of the registrations table, among them the entry's id, participant and partner names, email, school or organization, event, status, payment status, amount paid, registration date, fee due, waitlist time and the additional information stored as JSON.
EventsEvery event of the tournament.Every column of the events table, among them id, name, short code, format, team size, display order, active flag and the maximum entries.
RoundsEvery round.Every column of the rounds table, among them id, name, round number, round type, status, event, scheduled start and end, resolution released and the spectating flag.
PairingsEvery pairing in every round, released or not.Every column of the pairings table, among them id, round, aff and neg entries, room, scheduled time, judge, status, released flag, bye flag, the result stored as JSON and the judge message.
Check-inEvery check-in record.Every column of the check-ins table: id, registration, judge, checked in time, checked in by, checked out time, partner present flag and timestamps.
RoomsEvery room of the tournament.id, tournament_id, room_name, room_number, building, floor, capacity, is_available, notes, created_at, updated_at. Further columns the table carries follow these.
JudgesEvery judge roster row.Every column of the judge roster table, among them id, judge, status, registration time, notes, category, school, acceptance and approval times and the compliance and orientation stamps.
Break categoriesEvery break category.id, tournament_id, name, slug, break_size, is_general, priority, rule, institution_cap, created_at, updated_at.
  • Header order. The declared columns come first, then every other column the rows carry, in the order first seen. Rooms and Break categories declare their columns, so the header is written even with no rows. The other six files declare none, and a tournament with no rows in that table downloads a file holding only a line break.
  • Cell rules. An empty value is an empty cell. A number is written as a number. A JSON value is written as JSON text. Text that begins with an equals sign, a plus sign, a minus sign, an at sign, a tab or a carriage return gets a leading apostrophe, so a spreadsheet program does not run it as a formula. A cell with a comma, a quote or a line break is quoted.
  • Personal data. The Registrations file carries the participant email and any other contact or health information stored on an entry. Store the file as carefully as the registration list itself.
  • Judges. Judge names and emails live in the judge profiles, which this file does not include.

Roster download

ControlWhat it doesDefault or limit
Export the rosterThe section heading. Its note reads Every entry, with its school, in a file this importer reads back.Not editable.
Download roster CSVBuilds the file in the browser from the entries the page loaded, and downloads tournament- followed by the tournament identifier and -roster.csv.Every entry in every status, newest registration first.
Entry count lineReads a number and the word entry or entries, then a sentence about editing the file and bringing it back through the importer.Not editable.

The columns, in order, are ID, Participant Name, Partner Name, Email, School and Event Code. School is the club recorded on the entry, or the school when no club is recorded. Event Code is the short code of the entry's event.

Debate interchange section

ControlWhat it doesDefault or limit
Export the tab workbookDownloads an .xlsx file in the NCFCA tab workbook layout, named from the tournament name in lower case, joined by hyphens, cut to 60 characters, followed by -tab.xlsx.Not editable.
Export DebateXMLDownloads debate- followed by the tournament identifier and .xml.Needs at least two entries.
Export Meridian JSONThe same data as lossless Meridian JSON, downloaded as .json.Same address as DebateXML with the format set to json.
EventA select listing the tournament's events as the name followed by the short code. The event that imported entries and rounds belong to.The first event in display order. With no events, a sentence says an event must be added in Setup first.
Import DebateXML or JSONA file chooser. Accepts .xml and .json.Required. At most 2 MB.
ImportReads the file and writes it into the chosen event. Reads Importing… while it runs.Disabled until a file and an event are chosen, and while it runs.

The tab workbook

The workbook has the sheet TeamData and ten sheets named Round1 to Round10, always, because the legacy macros look sheets up by name. Names are written as LastName/LastName. The wizard reads the same layout back.

SheetColumns
TeamDataTeam, Speaker1, Speaker2, Region, RegionName, Division, State, Club, Wins, Losses, TotalSpeaks, AffCount, NegCount, Absent, LastSide, then Opp1 to Opp10. Region and RegionName are written empty. Absent holds Y for an entry that is not active. Wins and losses count decided debates, a bye counts as a win for the entry in the room and as a loss for nobody.
Round1 to Round10Aff, Neg, Winner, AffSpeaks, NegSpeaks. Winner is a team name. Neg reads Bye for a debate without an opponent.

Entries sort by participant name. A debate in a round above 10 has no sheet and is left out of the file. A league that runs more rounds should use the CSV files.

DebateXML and Meridian JSON files

The export carries teams, rooms, rounds, adjudicators, panels, motions and results. Conflicts and feedback are not part of the interchange. The import creates the teams as entries in the chosen event and the rounds as that event's rounds. Details of the import:

  • Entries. A team whose name matches an entry already in the chosen event reuses that entry. A new team is created as an entry with a placeholder email address and the payment status completed. The same name in another event is another entry.
  • Judges. Each adjudicator is added to the judge roster as pending, through a judge nomination that is accepted at once. An adjudicator without an address receives a placeholder address.
  • Rounds. Rounds are numbered from 1 in file order, whatever rounds the tournament already has. A round with results is created as completed, and one without as upcoming.
  • Pairings and motions. Each result becomes a pairing with its room, judge, winner and speaker points. Motions become unreleased resolutions. No pairing is released. Release each round from Rounds and pairing when it should be public.
  • Undo. A failure removes the rows already written in reverse order and reports any row that could not be removed.
  • Completed tournaments. A completed tournament refuses every import, because its results are a record.
  • Records. A success writes an entry named Tournament file imported with the numbers of rounds and pairings.

The success message reads Imported a number of records from followed by the file name. The number counts rounds plus pairings and leaves out the entries and judges created.

The import wizard

The wizard imports a spreadsheet in three steps: upload, confirm, done. Nothing is written until the director commits at the end of the confirm step. The wizard accepts .csv, .tsv, .txt, .json, .xlsx, .xlsm and .xls files up to 5 MB. A title row above the headers is allowed. A tab separated file named .csv is read correctly: the delimiter is chosen from the file, from commas, tabs, semicolons and vertical bars.

The file stays in the browser between the steps and is sent again at commit. The server reads it again and takes only the column mapping and the row decisions from the screen. It never takes rows from the browser.

File typeHow it is read
.csv, .tsv, .txtAs text. Up to 20,000 rows are read, with a notice when the file is longer. A file this product exported has its formula guard apostrophe removed on the way in.
.xlsx, .xlsm, .xlsEvery sheet is read as the text shown in each cell, so a formula reads as its displayed value and a room named 0101 keeps its leading zero. An empty sheet is left out with a notice. A sheet is cut at 20,000 rows with a notice.
.jsonA list of records is one sheet, with the keys as headers. An object whose every value is a list of records is one sheet per key. A nested value is refused, never flattened.

Step 1, upload

ControlWhat it doesDefault or limit
Import a spreadsheetThe step bar. Its note reads Any layout. The columns are read, and you confirm them before anything is written.Not editable.
Registrations, judges, rooms, pairings or resultsThe label of the file chooser.Disabled while a file is being read.
File chooserReads the file and moves to Step 2 when the file can be analysed.Up to 5 MB. A larger file is refused in the browser before it is sent.

Step 2, confirm

The step bar shows the file name and the number of rows read from the sheet in view. A file with several sheets shows one button per sheet, labeled with the sheet name and the kind the sheet was read as. Selecting another sheet restarts its mapping and its row decisions.

Notices from reading the file appear above the first section, for example that a delimiter other than a comma was used or that a sheet was empty or cut.

SectionControlWhat it does
NoticeThis sheet does not look like registrations, judges, rooms, pairings or results.Shown when the sheet kind cannot be told. The columns can still be mapped and the sheet is then read as whatever they say.
01 ColumnsTable with Column, Sample values, Read as and ConfidenceThe title adds the header row number. Column shows the header text, or column and its number when the header is blank. Sample values shows up to three values, or empty. Read as is a select listing Ignore this column and every field the importer knows, each as the field label and its kind. Confidence shows Certain, Likely, Unsure or None, with the reason, for example exact alias or content looks like email.
02 RowsTable with Row, What it says, What it matched and DoThe title adds the number of rows shown, the first 50 data rows. Row is the row number in the file. What it says shows up to five filled cells. What it matched shows what each name column was matched to. Do holds the Skip button. A sheet with no data rows shows No data rows under that header.
03 EventSelect labeled Event for rows that name noneShown for registrations only. A row that names no event comes in as an entry in this event. Defaults to the first event. With no events a sentence says an event must be added in Setup first.
FooterStatus line, issue list, Start again, Commit this importThe status line says how many things have to be resolved and how many warnings remain, or that nothing is unresolved. Up to five issues follow it, each with its row number. Start again returns to Step 1. Commit this import writes the plan and reads Writing… while it runs.

Commit this import is disabled while a request runs, while any error remains, when the sheet kind is unknown, and, for registrations, when no event is chosen. Warnings do not block.

What each column can be read as

KindFieldNeededWhat the import does with it
RegistrationsParticipant nameRequiredThe entry's name.
RegistrationsPartner nameNoThe partner's name.
RegistrationsSchool or clubNoStored on the entry as the club, the state when one can be read from the text, and the school.
RegistrationsEmailNoThe entry's email. A blank cell receives a placeholder address built from the name.
RegistrationsEventNoMatched to an event's short code, in any letter case. A blank cell uses the event chosen in section 03.
RegistrationsState, Division, Entry codeNoCan be mapped and are checked, and the import does not store them.
JudgesJudge nameRequiredThe judge's name.
JudgesJudge email, Judge school, Judge categoryNoEmail and school are written when present. The category is not written.
RoomsRoomRequiredThe room's name.
RoomsCapacityNoThe room's capacity.
PairingsRoundRequiredThe round number the debate belongs to.
PairingsAffirmative, NegativeRequiredMatched to entries by name. A bye word or an empty cell in Negative means the entry has no opponent.
PairingsRoom, JudgeNoRoom is written as text. See the note below on Judge and Room.
ResultsWinnerRequiredA side word such as aff, neg, pro, con, 1 or 2, or a team name matched against the two teams in the debate.
ResultsAff speaks, Neg speaks, Aff ranks, Neg ranksNoNumbers stored on the debate's result.
ResultsReason for decisionNoStored on the result as the reason for decision.

A sheet that carries both pairings and results columns is read as pairings, and the results are written on the same debates in the same pass.

How a sheet is read

  • The header row. The first fifteen rows are scored and the best one wins. A row of words the importer recognises beats a dense row of other text, so a title, a date or a blank row above the headers is skipped.
  • The kind. Each recognised header votes for a kind, and the sheet name votes as well. A kind needs a score of 2 or more. Headers outrank the sheet name.
  • Column suggestions. A header is compared with a list of known spellings after capitals, punctuation and extra spaces are ignored, so Team Name, team_name and TEAM NAME match alike. A suggestion with confidence of 0.75 or more is applied to the column, and the Confidence cell shows how sure it was. A column with a lower score is left on Ignore this column. The director can change any column.
  • Name matching. A name in a team column is matched to the entries already in the tournament. A match of 0.95 or more is accepted without a prompt and shows plain. A match from 0.70 to below 0.95 is proposed and shows with its percentage. Anything lower is unresolved. The three closest entries are offered as choices.
  • Winners. A side word is accepted at once. A team name is matched against the two teams in that debate only. A name that matches a team outside the debate stays unresolved. An empty winner is a bye only when the opponent cell is empty or a bye word.
  • Judge and Room. The matcher is given no judges and no rooms to compare against, because its reads of them name columns and a table the database does not have. A filled cell in a mapped Judge or Room column of a pairings sheet therefore matches nothing and blocks the commit. Set those columns to Ignore this column. A judges or rooms sheet writes to the same missing columns and table, so the database is expected to refuse the write and the commit rolls back.
  • Unknown rounds. A pairing or result row whose round number matches no round already created in Rounds is not written, and the summary does not count it among the skipped rows. Create the rounds first.
  • Existing debates. A debate that already exists in that round, in either side order, is updated with the new room, judge and result. Its released flag stays as it was. A new debate is written unreleased. Release is a step on Rounds.
  • Order and undo. Rows are written in the order entries, judges, rooms, rounds, pairings. A failure removes everything written, newest first.
  • Repeat protection. Each analysis gets an import id. Committing the same id twice writes nothing the second time.
  • Completed tournaments. A completed tournament refuses every import, at upload and again at commit.
  • Records. Every row written or updated leaves an entry named Entries imported, with the reason Spreadsheet import from followed by the file name.

Step 3, done

The step bar reads Done. A summary line lists what was added or updated, for example 12 registrations added, 3 debates updated, 1 row skipped, followed by the word Import and the first eight characters of the import id. Any issues follow, one per line with the row number. Two buttons follow. Import another file returns to Step 1. Open the record trail opens Records.

Tasks

To import a roster of new entries:

  1. Open Records in the rail. Select Exports.
  2. In the Import a spreadsheet bar, choose the file.
  3. In section 01, check that Participant name is read from the right column. Change any other column with its Read as select.
  4. In section 03, choose the event for rows that name none.
  5. In section 02, select Skip on any row that should not come in. Resolve any row that shows a choice list.
  6. Wait for the status line to read Nothing is unresolved. This can be committed.
  7. Select Commit this import. Read the summary.
  8. Select Open the record trail to confirm the entries were logged.

To bring results in from a workbook:

  1. Create the rounds in Rounds first.
  2. Open Exports and choose the workbook. Pick the sheet for each round in turn with the sheet buttons.
  3. Set a Judge or Room column to Ignore this column when it is mapped.
  4. For every Winner shown as unresolved, choose the side from the list.
  5. Select Commit this import. Repeat for the next sheet.

To take the tournament out as a tab workbook:

  1. Open Exports. In the Debate interchange section, select Export the tab workbook.
  2. Work in the file. Keep the sheet names.
  3. Bring it back through the wizard. Pick each Round sheet and the TeamData sheet in turn.

To download CSV files, select Export tab data as CSV at the top of any admin screen other than Setup, then select the link for the file.

Troubleshooting

Wizard messages appear in a red notice above the step. Messages about a row appear in the footer with the row number, or in the summary after a commit.

MessageWhat it meansWhat to do
That file is a number MB. The limit is 5 MB.The file is over 5 MB. The same check runs in the browser and on the server.Split the file or remove unused sheets.
Cannot read the file name. Upload a .csv, .tsv, .json, .xlsx or .xlsm file.The extension is not one the reader knows.Save the file in a listed format.
That file has no readable sheets in it.Every sheet was empty.Check the file.
That file has a header and no rows under it.Every sheet has at most one row.Add data rows.
That file is not valid JSON: followed by a reasonThe JSON could not be parsed.Fix the file.
That JSON file is a single object, followed by its keys, not a list of rows. Upload an array of records, or an object whose every value is an array of records.The JSON has the wrong shape.Wrap the records in a list.
That JSON file holds a number, a string or a list, not a list of rows.The top level is not a list or an object of lists.Use a list of records.
A row of the file holds a nested object, not a record with named fields.An item in the list is not an object.Make each item an object.
A field of a row holds a nested object rather than a single value, and there is no one right way to spread that across columns. Flatten the field in the file first, or export it as a spreadsheet.A value is a list or an object.Flatten the file.
Sign in to import a file.The session ended.Sign in again.
You do not administer this tournament.The account has no admin access.Use an admin account.
Could not check your admin access. Try again.The access check could not run.Try again.
This tournament is complete and its results are a record. Nothing can be imported into it.The tournament is completed.No import is possible.
Could not read whether this tournament is complete: followed by a reasonA read failed.Try again.
That tournament could not be found.The tournament row is missing.Reload.
Could not read the entries to match: followed by a reasonThe entry read for name matching failed.Try again.
That plan belongs to a different tournament.The plan carries another tournament's identifier.Start again from Step 1.
Choose the event the imported entries go into. A tournament with no events needs one added in Setup first.A registrations import was committed with no event.Choose an event, or add one in Setup.
That event is not one of this tournament's. Choose one of its events.The event does not belong to the tournament.Choose a listed event.
Could not check whether this import already ran: followed by a reasonThe repeat check failed, so the commit was refused.Try again.
This import has already been committed. Upload the file again to start a new one.The import id was already used.Choose Import another file.
The file no longer has a sheet called with the sheet's name.The file sent at commit differs from the analysed file.Start again.
Could not read the tournament before importing: followed by a reasonA read of rounds, pairings or events failed.Try again.
Could not read the chosen event: followed by a reasonThe event read failed.Try again.
Nothing was written. followed by the status lineThe server found errors in the plan at commit, including ones past the first 50 rows.Read the issues. Rows beyond the first 50 cannot be skipped or resolved on screen, so fix the file and import again.
Nothing was kept. The write failed at a table name, with a reason, and a number of rows already written were removed.The database refused a write and the import was undone.Read the reason. A judges or rooms import fails this way at present.
Nothing needed writing.No row produced a write.Check the mapping and the round numbers.
Issue shown for a rowWhat it meansWhat to do
No column is mapped to a field, and an import of the kind cannot be written without it.A required field has no column.Map a column to it.
Columns two numbers are both mapped to a field.Two columns write one field.Set one of them to Ignore this column.
A quoted value in a field does not match anything in this tournament.The name matched no entry within the 0.70 threshold.Choose from the list shown, or skip the row.
A field is empty.A required name cell has no value.Fill it in the file, or skip the row.
The same team is on both sides of this debate.Aff and Neg resolve to one entry.Correct the row.
The same debate is on row a number of this file.A debate is repeated in one file.Skip one of the rows.
That team is already debating in round a number on row a number.An entry appears twice in one round.Correct or skip a row.
Round a number already has this debate. Committing will update it rather than add a second.A warning. The debate exists.None needed. The commit updates it.
An event code is a one-person event, and this row has a partner.A partner is given for a solo event.Remove the partner or change the event.
A quoted event code is not an event code in this tournament, followed by the codes the tournament has, or by a note that it has none yet.The event code does not exist here.Use a listed code, or add the event in Setup.
Download messageWhat it meansWhat to do
Unknown exportThe resource name in the address is not one of the eight.Use the links in the bar.
Unauthorized, or Sign in to export this tournament.Not signed in.Sign in.
ForbiddenThe account does not administer the tournament.Use an admin account.
Not found.The tab workbook route refuses without detail.Use an admin account.
Could not export this dataA read failed.Try again.
Could not read the roster: followed by a reasonA read for the tab workbook or DebateXML failed.Try again.
DebateXML requires at least two teams.The tournament has fewer than two entries.Export after the field fills, or use the JSON or CSV export.

Interchange import messages

MessageWhat it meansWhat to do
Interchange file is too large, with a maximum of 2 MB.The file is over 2,000,000 characters.Split the file.
Debate interchange must contain at least two teams.The file lists fewer than two teams.Check the file.
Debate interchange contains duplicate team names.Two teams share a name.Rename one in the file.
Round a name references an unknown team.A result names a team that the file does not list.Correct the file.
Round a name references an unknown motion.A result names a motion that the file does not list.Correct the file.
DebateXML must contain a tournament root element.The XML has the wrong shape.Export a fresh file.
Debate JSON is not valid JSON.The JSON could not be parsed.Fix the file.
Unsupported Debate JSON format.The JSON is not a Meridian export.Use a Meridian JSON file.
Debate JSON is missing the tournament name, teams, or rounds.A required part is absent.Use a complete file.
Could not add a name as a judge, or Could not add a name to the judge roster.A judge nomination or its acceptance failed.Read the reason, then try again after the undo finishes.
Undoing the rows already written did not finish, followed by the failures.The undo could not remove every row.Remove the listed rows by hand in Field and Rounds.

Things to know

  • The wizard review shows the first 50 data rows. Rows below them are still read and checked at commit.
  • The intro line of the screen says four file types, and the chooser accepts .csv, .tsv, .txt, .json, .xlsx, .xlsm and .xls.
  • Imported entries use the signed in admin's account as their owner and a placeholder address when none is mapped. Replace placeholder addresses in Field before sending mail from Announce.
  • For the rest of the entry workflow see Registration and field.