icpc-api 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. icpc/__init__.py +32 -0
  2. icpc/api/__init__.py +18 -0
  3. icpc/api/common.py +97 -0
  4. icpc/api/contest.py +253 -0
  5. icpc/api/person.py +139 -0
  6. icpc/api/public.py +65 -0
  7. icpc/api/staff.py +83 -0
  8. icpc/api/team.py +335 -0
  9. icpc/auth/__init__.py +28 -0
  10. icpc/auth/cognito.py +142 -0
  11. icpc/auth/flows.py +314 -0
  12. icpc/auth/provider.py +29 -0
  13. icpc/auth/srp.py +185 -0
  14. icpc/auth/store.py +223 -0
  15. icpc/auth/tokens.py +86 -0
  16. icpc/cli/__init__.py +20 -0
  17. icpc/cli/columns.py +555 -0
  18. icpc/cli/main.py +1156 -0
  19. icpc/cli/render.py +160 -0
  20. icpc/config.py +57 -0
  21. icpc/errors.py +159 -0
  22. icpc/facade/__init__.py +6 -0
  23. icpc/facade/client.py +606 -0
  24. icpc/facade/domain.py +198 -0
  25. icpc/models/__init__.py +60 -0
  26. icpc/models/_generated.py +566 -0
  27. icpc/models/base.py +41 -0
  28. icpc/models/blobs.py +81 -0
  29. icpc/models/common.py +61 -0
  30. icpc/models/entities.py +522 -0
  31. icpc/models/enums.py +192 -0
  32. icpc/models/mixins.py +44 -0
  33. icpc/py.typed +0 -0
  34. icpc/search/__init__.py +99 -0
  35. icpc/search/_generated.py +1814 -0
  36. icpc/search/dsl.py +124 -0
  37. icpc/search/endpoint.py +173 -0
  38. icpc/search/fields.py +59 -0
  39. icpc/transport/__init__.py +29 -0
  40. icpc/transport/_shared.py +121 -0
  41. icpc/transport/async_client.py +120 -0
  42. icpc/transport/operation.py +139 -0
  43. icpc/transport/sync_client.py +121 -0
  44. icpc_api-0.1.0.dist-info/METADATA +143 -0
  45. icpc_api-0.1.0.dist-info/RECORD +50 -0
  46. icpc_api-0.1.0.dist-info/WHEEL +5 -0
  47. icpc_api-0.1.0.dist-info/entry_points.txt +2 -0
  48. icpc_api-0.1.0.dist-info/licenses/LICENSE +21 -0
  49. icpc_api-0.1.0.dist-info/licenses/THIRD-PARTY-LICENSES.md +220 -0
  50. icpc_api-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1814 @@
1
+ """Generated from icpc.global SPA bundle.
2
+
3
+ One entry per search endpoint. Each exposes:
4
+
5
+ * a ``Literal`` of its valid column names, so a projection typo is a type error
6
+ rather than a silently empty column;
7
+ * a ``Fields`` namespace of typed descriptors for building filters and sort keys;
8
+ * a factory taking the contest or site id and returning a bound
9
+ :class:`~icpc.search.endpoint.SearchEndpoint`.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ from datetime import date, datetime
15
+ from typing import Literal
16
+
17
+ from icpc.models._generated import (
18
+ CertificateRow,
19
+ ContestParticipantRow,
20
+ InstitutionRow,
21
+ PromoteRow,
22
+ StaffFundingRow,
23
+ StaffMemberRow,
24
+ StaffRow,
25
+ StaffTshirtRow,
26
+ StandingsRow,
27
+ TeamMemberRow,
28
+ TeamRow,
29
+ TeamSummaryRow,
30
+ Top20Row,
31
+ TransportationMissingRow,
32
+ TshirtRow,
33
+ )
34
+ from icpc.models.enums import (
35
+ Consent,
36
+ EligibilityStatus,
37
+ InstitutionUnitType,
38
+ MemberRole,
39
+ Sex,
40
+ ShirtSize,
41
+ TeamStatus,
42
+ Title,
43
+ )
44
+ from icpc.search.endpoint import SearchEndpoint
45
+ from icpc.search.fields import Field
46
+
47
+ __all__ = [
48
+ "CertificateFields",
49
+ "ContestParticipantFields",
50
+ "InstitutionFields",
51
+ "PromoteFields",
52
+ "StaffFields",
53
+ "StaffFundingFields",
54
+ "StaffMemberFields",
55
+ "StaffTshirtFields",
56
+ "StandingsFields",
57
+ "TeamFields",
58
+ "TeamMemberFields",
59
+ "TeamSummaryFields",
60
+ "Top20Fields",
61
+ "TransportationMissingFields",
62
+ "TshirtFields",
63
+ "contest_institutions",
64
+ "contest_missing_transportation",
65
+ "contest_participants",
66
+ "contest_promote_candidates",
67
+ "contest_public_staff_members",
68
+ "contest_staff",
69
+ "contest_staff_certificates",
70
+ "contest_staff_funding",
71
+ "contest_staff_members",
72
+ "contest_staff_tshirts",
73
+ "contest_standings",
74
+ "contest_team_certificates",
75
+ "contest_team_members",
76
+ "contest_team_summaries",
77
+ "contest_teams",
78
+ "contest_top20",
79
+ "site_coach_tshirts",
80
+ "site_cocoach_tshirts",
81
+ "site_contestant_tshirts",
82
+ "site_home_teams",
83
+ "site_institutions",
84
+ "site_participants",
85
+ "site_team_certificates",
86
+ "site_team_members",
87
+ "site_teams",
88
+ ]
89
+
90
+
91
+ #: Valid column names of :class:`~icpc.models.CertificateRow`.
92
+ type CertificateField = Literal[
93
+ "id",
94
+ "email",
95
+ "userId",
96
+ "name",
97
+ "certificateName",
98
+ "siteName",
99
+ "siteId",
100
+ "contestName",
101
+ "contestId",
102
+ "role",
103
+ "institutionName",
104
+ "instId",
105
+ "institutionShortName",
106
+ "teamName",
107
+ "teamId",
108
+ "teamMembers",
109
+ "liteTeamMemberSet",
110
+ ]
111
+
112
+
113
+ class CertificateFields:
114
+ """Typed columns of :class:`~icpc.models.CertificateRow`."""
115
+
116
+ id: Field[CertificateRow, int] = Field("id")
117
+ email: Field[CertificateRow, str] = Field("email")
118
+ user_id: Field[CertificateRow, int] = Field("userId")
119
+ name: Field[CertificateRow, str] = Field("name")
120
+ certificate_name: Field[CertificateRow, str] = Field("certificateName")
121
+ site_name: Field[CertificateRow, str] = Field("siteName")
122
+ site_id: Field[CertificateRow, int] = Field("siteId")
123
+ contest_name: Field[CertificateRow, str] = Field("contestName")
124
+ contest_id: Field[CertificateRow, int] = Field("contestId")
125
+ role: Field[CertificateRow, str] = Field("role")
126
+ institution_name: Field[CertificateRow, str] = Field("institutionName")
127
+ inst_id: Field[CertificateRow, int] = Field("instId")
128
+ institution_short_name: Field[CertificateRow, str] = Field("institutionShortName")
129
+ team_name: Field[CertificateRow, str] = Field("teamName")
130
+ team_id: Field[CertificateRow, int] = Field("teamId")
131
+ team_members: Field[CertificateRow, str] = Field("teamMembers")
132
+ lite_team_member_set: Field[CertificateRow, str] = Field("liteTeamMemberSet")
133
+
134
+ #: Columns the icpc.global grid projects by default.
135
+ default_proj: tuple[str, ...] = (
136
+ "id",
137
+ "email",
138
+ "name",
139
+ "siteName",
140
+ "contestName",
141
+ "role",
142
+ "institutionName",
143
+ "institutionShortName",
144
+ "teamName",
145
+ )
146
+
147
+ #: Every column this endpoint accepts.
148
+ all_fields: tuple[str, ...] = (
149
+ "id",
150
+ "email",
151
+ "userId",
152
+ "name",
153
+ "certificateName",
154
+ "siteName",
155
+ "siteId",
156
+ "contestName",
157
+ "contestId",
158
+ "role",
159
+ "institutionName",
160
+ "instId",
161
+ "institutionShortName",
162
+ "teamName",
163
+ "teamId",
164
+ "teamMembers",
165
+ "liteTeamMemberSet",
166
+ )
167
+
168
+
169
+ #: Valid column names of :class:`~icpc.models.ContestParticipantRow`.
170
+ type ContestParticipantField = Literal[
171
+ "personId",
172
+ "username",
173
+ "localName",
174
+ "badgeName",
175
+ "secondaryEmail",
176
+ "firstName",
177
+ "lastName",
178
+ "title",
179
+ "sex",
180
+ "dob",
181
+ "phone",
182
+ "emergencyContact",
183
+ "emergencyPhone",
184
+ "jobTitle",
185
+ "company",
186
+ "specialNeeds",
187
+ "shirtSize",
188
+ "registrationComplete",
189
+ "homeCountry",
190
+ "expectedGrad",
191
+ "beganDegree",
192
+ "includeEmail",
193
+ "employmentOpportunities",
194
+ "informOtherContests",
195
+ "addressLine1",
196
+ "addressLine2",
197
+ "addressLine3",
198
+ "city",
199
+ "state",
200
+ "postalCode",
201
+ "twitter",
202
+ "facebook",
203
+ "topCoder",
204
+ "codeforces",
205
+ "linkedin",
206
+ "surname",
207
+ "givenNames",
208
+ "applyFromCity",
209
+ "passportCountry",
210
+ "visaPlan",
211
+ "passportNumber",
212
+ "passportExpiry",
213
+ "passportIssue",
214
+ "passportNationality",
215
+ "residenceCountry",
216
+ "residenceCity",
217
+ "passportNotNeeded",
218
+ "visaType",
219
+ "consulateCountry",
220
+ "consulateCity",
221
+ "consulateInterview",
222
+ "visaNeeded",
223
+ "entryAirport",
224
+ "instName",
225
+ "instShortName",
226
+ "instNativeName",
227
+ "instId",
228
+ "teamIds",
229
+ "teamIdsOut",
230
+ "teams",
231
+ "teamsList",
232
+ "teamRoles",
233
+ "teamRolesOut",
234
+ "teamSites",
235
+ "teamSitesOut",
236
+ "workstationIds",
237
+ "workstationIdsOut",
238
+ "staffRoles",
239
+ "staffRolesOut",
240
+ "staffSites",
241
+ "staffSitesOut",
242
+ "labels",
243
+ ]
244
+
245
+
246
+ class ContestParticipantFields:
247
+ """Typed columns of :class:`~icpc.models.ContestParticipantRow`."""
248
+
249
+ person_id: Field[ContestParticipantRow, int] = Field("personId")
250
+ username: Field[ContestParticipantRow, str] = Field("username")
251
+ local_name: Field[ContestParticipantRow, str] = Field("localName")
252
+ badge_name: Field[ContestParticipantRow, str] = Field("badgeName")
253
+ secondary_email: Field[ContestParticipantRow, str] = Field("secondaryEmail")
254
+ first_name: Field[ContestParticipantRow, str] = Field("firstName")
255
+ last_name: Field[ContestParticipantRow, str] = Field("lastName")
256
+ title: Field[ContestParticipantRow, Title | str] = Field("title")
257
+ sex: Field[ContestParticipantRow, Sex | str] = Field("sex")
258
+ dob: Field[ContestParticipantRow, date | str] = Field("dob")
259
+ phone: Field[ContestParticipantRow, str] = Field("phone")
260
+ emergency_contact: Field[ContestParticipantRow, str] = Field("emergencyContact")
261
+ emergency_phone: Field[ContestParticipantRow, str] = Field("emergencyPhone")
262
+ job_title: Field[ContestParticipantRow, str] = Field("jobTitle")
263
+ company: Field[ContestParticipantRow, str] = Field("company")
264
+ special_needs: Field[ContestParticipantRow, str] = Field("specialNeeds")
265
+ shirt_size: Field[ContestParticipantRow, ShirtSize | str] = Field("shirtSize")
266
+ registration_complete: Field[ContestParticipantRow, bool] = Field("registrationComplete")
267
+ home_country: Field[ContestParticipantRow, str] = Field("homeCountry")
268
+ expected_grad: Field[ContestParticipantRow, date | str] = Field("expectedGrad")
269
+ began_degree: Field[ContestParticipantRow, date | str] = Field("beganDegree")
270
+ include_email: Field[ContestParticipantRow, Consent | str] = Field("includeEmail")
271
+ employment_opportunities: Field[ContestParticipantRow, Consent | str] = Field(
272
+ "employmentOpportunities"
273
+ )
274
+ inform_other_contests: Field[ContestParticipantRow, Consent | str] = Field(
275
+ "informOtherContests"
276
+ )
277
+ address_line1: Field[ContestParticipantRow, str] = Field("addressLine1")
278
+ address_line2: Field[ContestParticipantRow, str] = Field("addressLine2")
279
+ address_line3: Field[ContestParticipantRow, str] = Field("addressLine3")
280
+ city: Field[ContestParticipantRow, str] = Field("city")
281
+ state: Field[ContestParticipantRow, str] = Field("state")
282
+ postal_code: Field[ContestParticipantRow, str] = Field("postalCode")
283
+ twitter: Field[ContestParticipantRow, str] = Field("twitter")
284
+ facebook: Field[ContestParticipantRow, str] = Field("facebook")
285
+ top_coder: Field[ContestParticipantRow, str] = Field("topCoder")
286
+ codeforces: Field[ContestParticipantRow, str] = Field("codeforces")
287
+ linkedin: Field[ContestParticipantRow, str] = Field("linkedin")
288
+ surname: Field[ContestParticipantRow, str] = Field("surname")
289
+ given_names: Field[ContestParticipantRow, str] = Field("givenNames")
290
+ apply_from_city: Field[ContestParticipantRow, str] = Field("applyFromCity")
291
+ passport_country: Field[ContestParticipantRow, str] = Field("passportCountry")
292
+ visa_plan: Field[ContestParticipantRow, str] = Field("visaPlan")
293
+ passport_number: Field[ContestParticipantRow, str] = Field("passportNumber")
294
+ passport_expiry: Field[ContestParticipantRow, date | str] = Field("passportExpiry")
295
+ passport_issue: Field[ContestParticipantRow, date | str] = Field("passportIssue")
296
+ passport_nationality: Field[ContestParticipantRow, str] = Field("passportNationality")
297
+ residence_country: Field[ContestParticipantRow, str] = Field("residenceCountry")
298
+ residence_city: Field[ContestParticipantRow, str] = Field("residenceCity")
299
+ passport_not_needed: Field[ContestParticipantRow, bool] = Field("passportNotNeeded")
300
+ visa_type: Field[ContestParticipantRow, str] = Field("visaType")
301
+ consulate_country: Field[ContestParticipantRow, str] = Field("consulateCountry")
302
+ consulate_city: Field[ContestParticipantRow, str] = Field("consulateCity")
303
+ consulate_interview: Field[ContestParticipantRow, bool] = Field("consulateInterview")
304
+ visa_needed: Field[ContestParticipantRow, bool] = Field("visaNeeded")
305
+ entry_airport: Field[ContestParticipantRow, str] = Field("entryAirport")
306
+ inst_name: Field[ContestParticipantRow, str] = Field("instName")
307
+ inst_short_name: Field[ContestParticipantRow, str] = Field("instShortName")
308
+ inst_native_name: Field[ContestParticipantRow, str] = Field("instNativeName")
309
+ inst_id: Field[ContestParticipantRow, int] = Field("instId")
310
+ team_ids: Field[ContestParticipantRow, str] = Field("teamIds")
311
+ team_ids_out: Field[ContestParticipantRow, str] = Field("teamIdsOut")
312
+ teams: Field[ContestParticipantRow, str] = Field("teams")
313
+ teams_list: Field[ContestParticipantRow, str] = Field("teamsList")
314
+ team_roles: Field[ContestParticipantRow, str] = Field("teamRoles")
315
+ team_roles_out: Field[ContestParticipantRow, str] = Field("teamRolesOut")
316
+ team_sites: Field[ContestParticipantRow, str] = Field("teamSites")
317
+ team_sites_out: Field[ContestParticipantRow, str] = Field("teamSitesOut")
318
+ workstation_ids: Field[ContestParticipantRow, str] = Field("workstationIds")
319
+ workstation_ids_out: Field[ContestParticipantRow, str] = Field("workstationIdsOut")
320
+ staff_roles: Field[ContestParticipantRow, str] = Field("staffRoles")
321
+ staff_roles_out: Field[ContestParticipantRow, str] = Field("staffRolesOut")
322
+ staff_sites: Field[ContestParticipantRow, str] = Field("staffSites")
323
+ staff_sites_out: Field[ContestParticipantRow, str] = Field("staffSitesOut")
324
+ labels: Field[ContestParticipantRow, str] = Field("labels")
325
+
326
+ #: Columns the icpc.global grid projects by default.
327
+ default_proj: tuple[str, ...] = (
328
+ "username",
329
+ "title",
330
+ "sex",
331
+ "dob",
332
+ "labels",
333
+ "addressLine1",
334
+ "addressLine2",
335
+ "addressLine3",
336
+ "city",
337
+ "state",
338
+ "postalCode",
339
+ )
340
+
341
+ #: Every column this endpoint accepts.
342
+ all_fields: tuple[str, ...] = (
343
+ "personId",
344
+ "username",
345
+ "localName",
346
+ "badgeName",
347
+ "secondaryEmail",
348
+ "firstName",
349
+ "lastName",
350
+ "title",
351
+ "sex",
352
+ "dob",
353
+ "phone",
354
+ "emergencyContact",
355
+ "emergencyPhone",
356
+ "jobTitle",
357
+ "company",
358
+ "specialNeeds",
359
+ "shirtSize",
360
+ "registrationComplete",
361
+ "homeCountry",
362
+ "expectedGrad",
363
+ "beganDegree",
364
+ "includeEmail",
365
+ "employmentOpportunities",
366
+ "informOtherContests",
367
+ "addressLine1",
368
+ "addressLine2",
369
+ "addressLine3",
370
+ "city",
371
+ "state",
372
+ "postalCode",
373
+ "twitter",
374
+ "facebook",
375
+ "topCoder",
376
+ "codeforces",
377
+ "linkedin",
378
+ "surname",
379
+ "givenNames",
380
+ "applyFromCity",
381
+ "passportCountry",
382
+ "visaPlan",
383
+ "passportNumber",
384
+ "passportExpiry",
385
+ "passportIssue",
386
+ "passportNationality",
387
+ "residenceCountry",
388
+ "residenceCity",
389
+ "passportNotNeeded",
390
+ "visaType",
391
+ "consulateCountry",
392
+ "consulateCity",
393
+ "consulateInterview",
394
+ "visaNeeded",
395
+ "entryAirport",
396
+ "instName",
397
+ "instShortName",
398
+ "instNativeName",
399
+ "instId",
400
+ "teamIds",
401
+ "teamIdsOut",
402
+ "teams",
403
+ "teamsList",
404
+ "teamRoles",
405
+ "teamRolesOut",
406
+ "teamSites",
407
+ "teamSitesOut",
408
+ "workstationIds",
409
+ "workstationIdsOut",
410
+ "staffRoles",
411
+ "staffRolesOut",
412
+ "staffSites",
413
+ "staffSitesOut",
414
+ "labels",
415
+ )
416
+
417
+
418
+ #: Valid column names of :class:`~icpc.models.InstitutionRow`.
419
+ type InstitutionField = Literal[
420
+ "instId",
421
+ "instName",
422
+ "instNativeName",
423
+ "instShortName",
424
+ "instAbbreviation",
425
+ "instHomepageUrl",
426
+ "instUnitId",
427
+ "instUnitName",
428
+ "instUnitNativeName",
429
+ "instUnitShortName",
430
+ "instUnitAbbreviation",
431
+ "instUnitHomepageUrl",
432
+ "instUnitType",
433
+ "addressLine1",
434
+ "addressLine2",
435
+ "addressLine3",
436
+ "city",
437
+ "state",
438
+ "zip",
439
+ "countryName",
440
+ "longitude",
441
+ "latitude",
442
+ "twitterName",
443
+ "twitterHash",
444
+ "facebookPage",
445
+ ]
446
+
447
+
448
+ class InstitutionFields:
449
+ """Typed columns of :class:`~icpc.models.InstitutionRow`."""
450
+
451
+ inst_id: Field[InstitutionRow, int] = Field("instId")
452
+ inst_name: Field[InstitutionRow, str] = Field("instName")
453
+ inst_native_name: Field[InstitutionRow, str] = Field("instNativeName")
454
+ inst_short_name: Field[InstitutionRow, str] = Field("instShortName")
455
+ inst_abbreviation: Field[InstitutionRow, str] = Field("instAbbreviation")
456
+ inst_homepage_url: Field[InstitutionRow, str] = Field("instHomepageUrl")
457
+ inst_unit_id: Field[InstitutionRow, int] = Field("instUnitId")
458
+ inst_unit_name: Field[InstitutionRow, str] = Field("instUnitName")
459
+ inst_unit_native_name: Field[InstitutionRow, str] = Field("instUnitNativeName")
460
+ inst_unit_short_name: Field[InstitutionRow, str] = Field("instUnitShortName")
461
+ inst_unit_abbreviation: Field[InstitutionRow, str] = Field("instUnitAbbreviation")
462
+ inst_unit_homepage_url: Field[InstitutionRow, str] = Field("instUnitHomepageUrl")
463
+ inst_unit_type: Field[InstitutionRow, InstitutionUnitType | str] = Field("instUnitType")
464
+ address_line1: Field[InstitutionRow, str] = Field("addressLine1")
465
+ address_line2: Field[InstitutionRow, str] = Field("addressLine2")
466
+ address_line3: Field[InstitutionRow, str] = Field("addressLine3")
467
+ city: Field[InstitutionRow, str] = Field("city")
468
+ state: Field[InstitutionRow, str] = Field("state")
469
+ zip: Field[InstitutionRow, str] = Field("zip")
470
+ country_name: Field[InstitutionRow, str] = Field("countryName")
471
+ longitude: Field[InstitutionRow, float] = Field("longitude")
472
+ latitude: Field[InstitutionRow, float] = Field("latitude")
473
+ twitter_name: Field[InstitutionRow, str] = Field("twitterName")
474
+ twitter_hash: Field[InstitutionRow, str] = Field("twitterHash")
475
+ facebook_page: Field[InstitutionRow, str] = Field("facebookPage")
476
+
477
+ #: Columns the icpc.global grid projects by default.
478
+ default_proj: tuple[str, ...] = (
479
+ "instId",
480
+ "instName",
481
+ "instUnitId",
482
+ "instUnitNativeName",
483
+ "instUnitShortName",
484
+ "instUnitAbbreviation",
485
+ "instUnitHomepageUrl",
486
+ "instUnitType",
487
+ "city",
488
+ "countryName",
489
+ "twitterName",
490
+ "twitterHash",
491
+ "facebookPage",
492
+ )
493
+
494
+ #: Every column this endpoint accepts.
495
+ all_fields: tuple[str, ...] = (
496
+ "instId",
497
+ "instName",
498
+ "instNativeName",
499
+ "instShortName",
500
+ "instAbbreviation",
501
+ "instHomepageUrl",
502
+ "instUnitId",
503
+ "instUnitName",
504
+ "instUnitNativeName",
505
+ "instUnitShortName",
506
+ "instUnitAbbreviation",
507
+ "instUnitHomepageUrl",
508
+ "instUnitType",
509
+ "addressLine1",
510
+ "addressLine2",
511
+ "addressLine3",
512
+ "city",
513
+ "state",
514
+ "zip",
515
+ "countryName",
516
+ "longitude",
517
+ "latitude",
518
+ "twitterName",
519
+ "twitterHash",
520
+ "facebookPage",
521
+ )
522
+
523
+
524
+ #: Valid column names of :class:`~icpc.models.PromoteRow`.
525
+ type PromoteField = Literal[
526
+ "rank",
527
+ "teamId",
528
+ "teamName",
529
+ "siteId",
530
+ "siteName",
531
+ "institutionId",
532
+ "institutionName",
533
+ "promoteToContest",
534
+ "promoteToSite",
535
+ ]
536
+
537
+
538
+ class PromoteFields:
539
+ """Typed columns of :class:`~icpc.models.PromoteRow`."""
540
+
541
+ rank: Field[PromoteRow, int] = Field("rank")
542
+ team_id: Field[PromoteRow, int] = Field("teamId")
543
+ team_name: Field[PromoteRow, str] = Field("teamName")
544
+ site_id: Field[PromoteRow, int] = Field("siteId")
545
+ site_name: Field[PromoteRow, str] = Field("siteName")
546
+ institution_id: Field[PromoteRow, int] = Field("institutionId")
547
+ institution_name: Field[PromoteRow, str] = Field("institutionName")
548
+ promote_to_contest: Field[PromoteRow, int] = Field("promoteToContest")
549
+ promote_to_site: Field[PromoteRow, str] = Field("promoteToSite")
550
+
551
+ #: Columns the icpc.global grid projects by default.
552
+ default_proj: tuple[str, ...] = (
553
+ "rank",
554
+ "siteName",
555
+ "teamName",
556
+ "institutionName",
557
+ )
558
+
559
+ #: Every column this endpoint accepts.
560
+ all_fields: tuple[str, ...] = (
561
+ "rank",
562
+ "teamId",
563
+ "teamName",
564
+ "siteId",
565
+ "siteName",
566
+ "institutionId",
567
+ "institutionName",
568
+ "promoteToContest",
569
+ "promoteToSite",
570
+ )
571
+
572
+
573
+ #: Valid column names of :class:`~icpc.models.StaffFundingRow`.
574
+ type StaffFundingField = Literal[
575
+ "contestParticipantId",
576
+ "site",
577
+ "siteId",
578
+ "personId",
579
+ "firstName",
580
+ "lastName",
581
+ "username",
582
+ "homeTown",
583
+ "homeCountry",
584
+ "residenceCountry",
585
+ "funding",
586
+ "budget",
587
+ "budgetAdjustment",
588
+ "residenceTown",
589
+ "initiated",
590
+ "notes",
591
+ "transport",
592
+ ]
593
+
594
+
595
+ class StaffFundingFields:
596
+ """Typed columns of :class:`~icpc.models.StaffFundingRow`."""
597
+
598
+ contest_participant_id: Field[StaffFundingRow, int] = Field("contestParticipantId")
599
+ site: Field[StaffFundingRow, str] = Field("site")
600
+ site_id: Field[StaffFundingRow, int] = Field("siteId")
601
+ person_id: Field[StaffFundingRow, int] = Field("personId")
602
+ first_name: Field[StaffFundingRow, str] = Field("firstName")
603
+ last_name: Field[StaffFundingRow, str] = Field("lastName")
604
+ username: Field[StaffFundingRow, str] = Field("username")
605
+ home_town: Field[StaffFundingRow, str] = Field("homeTown")
606
+ home_country: Field[StaffFundingRow, str] = Field("homeCountry")
607
+ residence_country: Field[StaffFundingRow, str] = Field("residenceCountry")
608
+ funding: Field[StaffFundingRow, str] = Field("funding")
609
+ budget: Field[StaffFundingRow, float] = Field("budget")
610
+ budget_adjustment: Field[StaffFundingRow, float] = Field("budgetAdjustment")
611
+ residence_town: Field[StaffFundingRow, str] = Field("residenceTown")
612
+ initiated: Field[StaffFundingRow, bool] = Field("initiated")
613
+ notes: Field[StaffFundingRow, str] = Field("notes")
614
+ transport: Field[StaffFundingRow, str] = Field("transport")
615
+
616
+ #: Columns the icpc.global grid projects by default.
617
+ default_proj: tuple[str, ...] = (
618
+ "site",
619
+ "firstName",
620
+ "lastName",
621
+ "username",
622
+ "homeTown",
623
+ "homeCountry",
624
+ "budget",
625
+ "budgetAdjustment",
626
+ "notes",
627
+ "initiated",
628
+ )
629
+
630
+ #: Every column this endpoint accepts.
631
+ all_fields: tuple[str, ...] = (
632
+ "contestParticipantId",
633
+ "site",
634
+ "siteId",
635
+ "personId",
636
+ "firstName",
637
+ "lastName",
638
+ "username",
639
+ "homeTown",
640
+ "homeCountry",
641
+ "residenceCountry",
642
+ "funding",
643
+ "budget",
644
+ "budgetAdjustment",
645
+ "residenceTown",
646
+ "initiated",
647
+ "notes",
648
+ "transport",
649
+ )
650
+
651
+
652
+ #: Valid column names of :class:`~icpc.models.StaffMemberRow`.
653
+ type StaffMemberField = Literal[
654
+ "staffMemberId",
655
+ "siteId",
656
+ "site",
657
+ "title",
658
+ "firstName",
659
+ "lastName",
660
+ "username",
661
+ "userId",
662
+ "badgeRole",
663
+ "certificateRole",
664
+ "institution",
665
+ "instId",
666
+ "registrationComplete",
667
+ "showInPublicPages",
668
+ "labels",
669
+ "labelsLite",
670
+ ]
671
+
672
+
673
+ class StaffMemberFields:
674
+ """Typed columns of :class:`~icpc.models.StaffMemberRow`."""
675
+
676
+ staff_member_id: Field[StaffMemberRow, int] = Field("staffMemberId")
677
+ site_id: Field[StaffMemberRow, int] = Field("siteId")
678
+ site: Field[StaffMemberRow, str] = Field("site")
679
+ title: Field[StaffMemberRow, Title | str] = Field("title")
680
+ first_name: Field[StaffMemberRow, str] = Field("firstName")
681
+ last_name: Field[StaffMemberRow, str] = Field("lastName")
682
+ username: Field[StaffMemberRow, str] = Field("username")
683
+ user_id: Field[StaffMemberRow, int] = Field("userId")
684
+ badge_role: Field[StaffMemberRow, str] = Field("badgeRole")
685
+ certificate_role: Field[StaffMemberRow, str] = Field("certificateRole")
686
+ institution: Field[StaffMemberRow, str] = Field("institution")
687
+ inst_id: Field[StaffMemberRow, int] = Field("instId")
688
+ registration_complete: Field[StaffMemberRow, bool] = Field("registrationComplete")
689
+ show_in_public_pages: Field[StaffMemberRow, bool] = Field("showInPublicPages")
690
+ labels: Field[StaffMemberRow, str] = Field("labels")
691
+ labels_lite: Field[StaffMemberRow, str] = Field("labelsLite")
692
+
693
+ #: Columns the icpc.global grid projects by default.
694
+ default_proj: tuple[str, ...] = (
695
+ "site",
696
+ "title",
697
+ "firstName",
698
+ "lastName",
699
+ "username",
700
+ "badgeRole",
701
+ "certificateRole",
702
+ "institution",
703
+ "labels",
704
+ "registrationComplete",
705
+ "showInPublicPages",
706
+ )
707
+
708
+ #: Every column this endpoint accepts.
709
+ all_fields: tuple[str, ...] = (
710
+ "staffMemberId",
711
+ "siteId",
712
+ "site",
713
+ "title",
714
+ "firstName",
715
+ "lastName",
716
+ "username",
717
+ "userId",
718
+ "badgeRole",
719
+ "certificateRole",
720
+ "institution",
721
+ "instId",
722
+ "registrationComplete",
723
+ "showInPublicPages",
724
+ "labels",
725
+ "labelsLite",
726
+ )
727
+
728
+
729
+ #: Valid column names of :class:`~icpc.models.StaffRow`.
730
+ type StaffField = Literal[
731
+ "staffMemberId",
732
+ "username",
733
+ "firstName",
734
+ "lastName",
735
+ "badgeName",
736
+ "certificateName",
737
+ "roles",
738
+ "phone",
739
+ "institution",
740
+ "site",
741
+ "shirtSize",
742
+ "specialNeeds",
743
+ "sex",
744
+ "completeRegistration",
745
+ "country",
746
+ "twitter",
747
+ "labels",
748
+ "extraField",
749
+ "personId",
750
+ ]
751
+
752
+
753
+ class StaffFields:
754
+ """Typed columns of :class:`~icpc.models.StaffRow`."""
755
+
756
+ staff_member_id: Field[StaffRow, int] = Field("staffMemberId")
757
+ username: Field[StaffRow, str] = Field("username")
758
+ first_name: Field[StaffRow, str] = Field("firstName")
759
+ last_name: Field[StaffRow, str] = Field("lastName")
760
+ badge_name: Field[StaffRow, str] = Field("badgeName")
761
+ certificate_name: Field[StaffRow, str] = Field("certificateName")
762
+ roles: Field[StaffRow, str] = Field("roles")
763
+ phone: Field[StaffRow, str] = Field("phone")
764
+ institution: Field[StaffRow, str] = Field("institution")
765
+ site: Field[StaffRow, str] = Field("site")
766
+ shirt_size: Field[StaffRow, ShirtSize | str] = Field("shirtSize")
767
+ special_needs: Field[StaffRow, str] = Field("specialNeeds")
768
+ sex: Field[StaffRow, Sex | str] = Field("sex")
769
+ complete_registration: Field[StaffRow, bool] = Field("completeRegistration")
770
+ country: Field[StaffRow, str] = Field("country")
771
+ twitter: Field[StaffRow, str] = Field("twitter")
772
+ labels: Field[StaffRow, str] = Field("labels")
773
+ extra_field: Field[StaffRow, str] = Field("extraField")
774
+ person_id: Field[StaffRow, int] = Field("personId")
775
+
776
+ #: Columns the icpc.global grid projects by default.
777
+ default_proj: tuple[str, ...] = (
778
+ "username",
779
+ "firstName",
780
+ "lastName",
781
+ "roles",
782
+ "phone",
783
+ "labels",
784
+ "extraField",
785
+ )
786
+
787
+ #: Every column this endpoint accepts.
788
+ all_fields: tuple[str, ...] = (
789
+ "staffMemberId",
790
+ "username",
791
+ "firstName",
792
+ "lastName",
793
+ "badgeName",
794
+ "certificateName",
795
+ "roles",
796
+ "phone",
797
+ "institution",
798
+ "site",
799
+ "shirtSize",
800
+ "specialNeeds",
801
+ "sex",
802
+ "completeRegistration",
803
+ "country",
804
+ "twitter",
805
+ "labels",
806
+ "extraField",
807
+ "personId",
808
+ )
809
+
810
+
811
+ #: Valid column names of :class:`~icpc.models.StaffTshirtRow`.
812
+ type StaffTshirtField = Literal[
813
+ "contestParticipantId",
814
+ "staffMemberId",
815
+ "site",
816
+ "personId",
817
+ "firstName",
818
+ "lastName",
819
+ "username",
820
+ "badgeRole",
821
+ "institution",
822
+ "registrationComplete",
823
+ "shirtSize",
824
+ "tshirts",
825
+ ]
826
+
827
+
828
+ class StaffTshirtFields:
829
+ """Typed columns of :class:`~icpc.models.StaffTshirtRow`."""
830
+
831
+ contest_participant_id: Field[StaffTshirtRow, int] = Field("contestParticipantId")
832
+ staff_member_id: Field[StaffTshirtRow, int] = Field("staffMemberId")
833
+ site: Field[StaffTshirtRow, str] = Field("site")
834
+ person_id: Field[StaffTshirtRow, int] = Field("personId")
835
+ first_name: Field[StaffTshirtRow, str] = Field("firstName")
836
+ last_name: Field[StaffTshirtRow, str] = Field("lastName")
837
+ username: Field[StaffTshirtRow, str] = Field("username")
838
+ badge_role: Field[StaffTshirtRow, str] = Field("badgeRole")
839
+ institution: Field[StaffTshirtRow, str] = Field("institution")
840
+ registration_complete: Field[StaffTshirtRow, bool] = Field("registrationComplete")
841
+ shirt_size: Field[StaffTshirtRow, ShirtSize | str] = Field("shirtSize")
842
+ tshirts: Field[StaffTshirtRow, str] = Field("tshirts")
843
+
844
+ #: Columns the icpc.global grid projects by default.
845
+ default_proj: tuple[str, ...] = (
846
+ "site",
847
+ "firstName",
848
+ "lastName",
849
+ "username",
850
+ "badgeRole",
851
+ "institution",
852
+ "registrationComplete",
853
+ "shirtSize",
854
+ "tshirts",
855
+ )
856
+
857
+ #: Every column this endpoint accepts.
858
+ all_fields: tuple[str, ...] = (
859
+ "contestParticipantId",
860
+ "staffMemberId",
861
+ "site",
862
+ "personId",
863
+ "firstName",
864
+ "lastName",
865
+ "username",
866
+ "badgeRole",
867
+ "institution",
868
+ "registrationComplete",
869
+ "shirtSize",
870
+ "tshirts",
871
+ )
872
+
873
+
874
+ #: Valid column names of :class:`~icpc.models.StandingsRow`.
875
+ type StandingsField = Literal[
876
+ "id",
877
+ "name",
878
+ "enteredBy",
879
+ "dateEntered",
880
+ "certified",
881
+ "certifiedBy",
882
+ "dateCertified",
883
+ "published",
884
+ ]
885
+
886
+
887
+ class StandingsFields:
888
+ """Typed columns of :class:`~icpc.models.StandingsRow`."""
889
+
890
+ id: Field[StandingsRow, int] = Field("id")
891
+ name: Field[StandingsRow, str] = Field("name")
892
+ entered_by: Field[StandingsRow, str] = Field("enteredBy")
893
+ date_entered: Field[StandingsRow, datetime | str] = Field("dateEntered")
894
+ certified: Field[StandingsRow, bool] = Field("certified")
895
+ certified_by: Field[StandingsRow, str] = Field("certifiedBy")
896
+ date_certified: Field[StandingsRow, datetime | str] = Field("dateCertified")
897
+ published: Field[StandingsRow, bool] = Field("published")
898
+
899
+ #: Columns the icpc.global grid projects by default.
900
+ default_proj: tuple[str, ...] = (
901
+ "name",
902
+ "enteredBy",
903
+ "dateEntered",
904
+ "certified",
905
+ "certifiedBy",
906
+ "dateCertified",
907
+ "published",
908
+ )
909
+
910
+ #: Every column this endpoint accepts.
911
+ all_fields: tuple[str, ...] = (
912
+ "id",
913
+ "name",
914
+ "enteredBy",
915
+ "dateEntered",
916
+ "certified",
917
+ "certifiedBy",
918
+ "dateCertified",
919
+ "published",
920
+ )
921
+
922
+
923
+ #: Valid column names of :class:`~icpc.models.TeamMemberRow`.
924
+ type TeamMemberField = Literal[
925
+ "id",
926
+ "role",
927
+ "personId",
928
+ "username",
929
+ "firstName",
930
+ "lastName",
931
+ "localName",
932
+ "phone",
933
+ "specialNeeds",
934
+ "sex",
935
+ "completeRegistration",
936
+ "attendingOnsite",
937
+ "dob",
938
+ "shirtSize",
939
+ "country",
940
+ "twitter",
941
+ "teamMemberInstId",
942
+ "teamMemberInstName",
943
+ "areaOfStudy",
944
+ "degreePursued",
945
+ "beganDegree",
946
+ "expectedGrad",
947
+ "includeEmail",
948
+ "employmentOpportunities",
949
+ "informOtherContests",
950
+ "badgeName",
951
+ "certificateName",
952
+ "teamId",
953
+ "teamName",
954
+ "workstationId",
955
+ "teamStatus",
956
+ "teamRank",
957
+ "extraField",
958
+ "labels",
959
+ "teamInstId",
960
+ "teamInstName",
961
+ "teamInstShortName",
962
+ "siteId",
963
+ "siteName",
964
+ ]
965
+
966
+
967
+ class TeamMemberFields:
968
+ """Typed columns of :class:`~icpc.models.TeamMemberRow`."""
969
+
970
+ id: Field[TeamMemberRow, int] = Field("id")
971
+ role: Field[TeamMemberRow, MemberRole | str] = Field("role")
972
+ person_id: Field[TeamMemberRow, int] = Field("personId")
973
+ username: Field[TeamMemberRow, str] = Field("username")
974
+ first_name: Field[TeamMemberRow, str] = Field("firstName")
975
+ last_name: Field[TeamMemberRow, str] = Field("lastName")
976
+ local_name: Field[TeamMemberRow, str] = Field("localName")
977
+ phone: Field[TeamMemberRow, str] = Field("phone")
978
+ special_needs: Field[TeamMemberRow, str] = Field("specialNeeds")
979
+ sex: Field[TeamMemberRow, Sex | str] = Field("sex")
980
+ complete_registration: Field[TeamMemberRow, bool] = Field("completeRegistration")
981
+ attending_onsite: Field[TeamMemberRow, bool] = Field("attendingOnsite")
982
+ dob: Field[TeamMemberRow, date | str] = Field("dob")
983
+ shirt_size: Field[TeamMemberRow, ShirtSize | str] = Field("shirtSize")
984
+ country: Field[TeamMemberRow, str] = Field("country")
985
+ twitter: Field[TeamMemberRow, str] = Field("twitter")
986
+ team_member_inst_id: Field[TeamMemberRow, int] = Field("teamMemberInstId")
987
+ team_member_inst_name: Field[TeamMemberRow, str] = Field("teamMemberInstName")
988
+ area_of_study: Field[TeamMemberRow, str] = Field("areaOfStudy")
989
+ degree_pursued: Field[TeamMemberRow, str] = Field("degreePursued")
990
+ began_degree: Field[TeamMemberRow, date | str] = Field("beganDegree")
991
+ expected_grad: Field[TeamMemberRow, date | str] = Field("expectedGrad")
992
+ include_email: Field[TeamMemberRow, Consent | str] = Field("includeEmail")
993
+ employment_opportunities: Field[TeamMemberRow, Consent | str] = Field("employmentOpportunities")
994
+ inform_other_contests: Field[TeamMemberRow, Consent | str] = Field("informOtherContests")
995
+ badge_name: Field[TeamMemberRow, str] = Field("badgeName")
996
+ certificate_name: Field[TeamMemberRow, str] = Field("certificateName")
997
+ team_id: Field[TeamMemberRow, int] = Field("teamId")
998
+ team_name: Field[TeamMemberRow, str] = Field("teamName")
999
+ workstation_id: Field[TeamMemberRow, int] = Field("workstationId")
1000
+ team_status: Field[TeamMemberRow, TeamStatus | str] = Field("teamStatus")
1001
+ team_rank: Field[TeamMemberRow, int] = Field("teamRank")
1002
+ extra_field: Field[TeamMemberRow, str] = Field("extraField")
1003
+ labels: Field[TeamMemberRow, str] = Field("labels")
1004
+ team_inst_id: Field[TeamMemberRow, int] = Field("teamInstId")
1005
+ team_inst_name: Field[TeamMemberRow, str] = Field("teamInstName")
1006
+ team_inst_short_name: Field[TeamMemberRow, str] = Field("teamInstShortName")
1007
+ site_id: Field[TeamMemberRow, int] = Field("siteId")
1008
+ site_name: Field[TeamMemberRow, str] = Field("siteName")
1009
+
1010
+ #: Columns the icpc.global grid projects by default.
1011
+ default_proj: tuple[str, ...] = (
1012
+ "username",
1013
+ "firstName",
1014
+ "lastName",
1015
+ "localName",
1016
+ "teamInstName",
1017
+ "teamName",
1018
+ "labels",
1019
+ "teamMemberInstName",
1020
+ "areaOfStudy",
1021
+ "degreePursued",
1022
+ "extraField",
1023
+ )
1024
+
1025
+ #: Every column this endpoint accepts.
1026
+ all_fields: tuple[str, ...] = (
1027
+ "id",
1028
+ "role",
1029
+ "personId",
1030
+ "username",
1031
+ "firstName",
1032
+ "lastName",
1033
+ "localName",
1034
+ "phone",
1035
+ "specialNeeds",
1036
+ "sex",
1037
+ "completeRegistration",
1038
+ "attendingOnsite",
1039
+ "dob",
1040
+ "shirtSize",
1041
+ "country",
1042
+ "twitter",
1043
+ "teamMemberInstId",
1044
+ "teamMemberInstName",
1045
+ "areaOfStudy",
1046
+ "degreePursued",
1047
+ "beganDegree",
1048
+ "expectedGrad",
1049
+ "includeEmail",
1050
+ "employmentOpportunities",
1051
+ "informOtherContests",
1052
+ "badgeName",
1053
+ "certificateName",
1054
+ "teamId",
1055
+ "teamName",
1056
+ "workstationId",
1057
+ "teamStatus",
1058
+ "teamRank",
1059
+ "extraField",
1060
+ "labels",
1061
+ "teamInstId",
1062
+ "teamInstName",
1063
+ "teamInstShortName",
1064
+ "siteId",
1065
+ "siteName",
1066
+ )
1067
+
1068
+
1069
+ #: Valid column names of :class:`~icpc.models.TeamRow`.
1070
+ type TeamField = Literal[
1071
+ "id",
1072
+ "name",
1073
+ "teamMembers",
1074
+ "status",
1075
+ "extendedState",
1076
+ "paid",
1077
+ "note",
1078
+ "checkIn",
1079
+ "workstationId",
1080
+ "rank",
1081
+ "certified",
1082
+ "eligibilityStatus",
1083
+ "eligibilityIssue",
1084
+ "eligibilityComment",
1085
+ "instId",
1086
+ "instName",
1087
+ "instShortName",
1088
+ "instAddress",
1089
+ "city",
1090
+ "country",
1091
+ "a2",
1092
+ "site",
1093
+ "createdWhen",
1094
+ "extraField",
1095
+ ]
1096
+
1097
+
1098
+ class TeamFields:
1099
+ """Typed columns of :class:`~icpc.models.TeamRow`."""
1100
+
1101
+ id: Field[TeamRow, int] = Field("id")
1102
+ name: Field[TeamRow, str] = Field("name")
1103
+ team_members: Field[TeamRow, str] = Field("teamMembers")
1104
+ status: Field[TeamRow, TeamStatus | str] = Field("status")
1105
+ extended_state: Field[TeamRow, str] = Field("extendedState")
1106
+ paid: Field[TeamRow, bool] = Field("paid")
1107
+ note: Field[TeamRow, str] = Field("note")
1108
+ check_in: Field[TeamRow, str] = Field("checkIn")
1109
+ workstation_id: Field[TeamRow, int] = Field("workstationId")
1110
+ rank: Field[TeamRow, int] = Field("rank")
1111
+ certified: Field[TeamRow, bool] = Field("certified")
1112
+ eligibility_status: Field[TeamRow, EligibilityStatus | str] = Field("eligibilityStatus")
1113
+ eligibility_issue: Field[TeamRow, str] = Field("eligibilityIssue")
1114
+ eligibility_comment: Field[TeamRow, str] = Field("eligibilityComment")
1115
+ inst_id: Field[TeamRow, int] = Field("instId")
1116
+ inst_name: Field[TeamRow, str] = Field("instName")
1117
+ inst_short_name: Field[TeamRow, str] = Field("instShortName")
1118
+ inst_address: Field[TeamRow, str] = Field("instAddress")
1119
+ city: Field[TeamRow, str] = Field("city")
1120
+ country: Field[TeamRow, str] = Field("country")
1121
+ a2: Field[TeamRow, str] = Field("a2")
1122
+ site: Field[TeamRow, str] = Field("site")
1123
+ created_when: Field[TeamRow, datetime | str] = Field("createdWhen")
1124
+ extra_field: Field[TeamRow, str] = Field("extraField")
1125
+
1126
+ #: Columns the icpc.global grid projects by default.
1127
+ default_proj: tuple[str, ...] = (
1128
+ "id",
1129
+ "name",
1130
+ "status",
1131
+ "certified",
1132
+ "instName",
1133
+ "instAddress",
1134
+ "city",
1135
+ "country",
1136
+ "site",
1137
+ )
1138
+
1139
+ #: Every column this endpoint accepts.
1140
+ all_fields: tuple[str, ...] = (
1141
+ "id",
1142
+ "name",
1143
+ "teamMembers",
1144
+ "status",
1145
+ "extendedState",
1146
+ "paid",
1147
+ "note",
1148
+ "checkIn",
1149
+ "workstationId",
1150
+ "rank",
1151
+ "certified",
1152
+ "eligibilityStatus",
1153
+ "eligibilityIssue",
1154
+ "eligibilityComment",
1155
+ "instId",
1156
+ "instName",
1157
+ "instShortName",
1158
+ "instAddress",
1159
+ "city",
1160
+ "country",
1161
+ "a2",
1162
+ "site",
1163
+ "createdWhen",
1164
+ "extraField",
1165
+ )
1166
+
1167
+
1168
+ #: Valid column names of :class:`~icpc.models.TeamSummaryRow`.
1169
+ type TeamSummaryField = Literal[
1170
+ "teamId",
1171
+ "teamName",
1172
+ "rank",
1173
+ "siteId",
1174
+ "siteName",
1175
+ "country",
1176
+ "a2",
1177
+ "instId",
1178
+ "instName",
1179
+ "coachId",
1180
+ "coachName",
1181
+ "promotedFromTeamId",
1182
+ "promotedFromTeamName",
1183
+ "promotedFromContestId",
1184
+ "promotedFromContestName",
1185
+ "created",
1186
+ "status",
1187
+ "eligibilityId",
1188
+ "eligibilityStatus",
1189
+ "certified",
1190
+ "paid",
1191
+ "extendedState",
1192
+ ]
1193
+
1194
+
1195
+ class TeamSummaryFields:
1196
+ """Typed columns of :class:`~icpc.models.TeamSummaryRow`."""
1197
+
1198
+ team_id: Field[TeamSummaryRow, int] = Field("teamId")
1199
+ team_name: Field[TeamSummaryRow, str] = Field("teamName")
1200
+ rank: Field[TeamSummaryRow, int] = Field("rank")
1201
+ site_id: Field[TeamSummaryRow, int] = Field("siteId")
1202
+ site_name: Field[TeamSummaryRow, str] = Field("siteName")
1203
+ country: Field[TeamSummaryRow, str] = Field("country")
1204
+ a2: Field[TeamSummaryRow, str] = Field("a2")
1205
+ inst_id: Field[TeamSummaryRow, int] = Field("instId")
1206
+ inst_name: Field[TeamSummaryRow, str] = Field("instName")
1207
+ coach_id: Field[TeamSummaryRow, int] = Field("coachId")
1208
+ coach_name: Field[TeamSummaryRow, str] = Field("coachName")
1209
+ promoted_from_team_id: Field[TeamSummaryRow, int] = Field("promotedFromTeamId")
1210
+ promoted_from_team_name: Field[TeamSummaryRow, str] = Field("promotedFromTeamName")
1211
+ promoted_from_contest_id: Field[TeamSummaryRow, int] = Field("promotedFromContestId")
1212
+ promoted_from_contest_name: Field[TeamSummaryRow, str] = Field("promotedFromContestName")
1213
+ created: Field[TeamSummaryRow, datetime | str] = Field("created")
1214
+ status: Field[TeamSummaryRow, TeamStatus | str] = Field("status")
1215
+ eligibility_id: Field[TeamSummaryRow, int] = Field("eligibilityId")
1216
+ eligibility_status: Field[TeamSummaryRow, EligibilityStatus | str] = Field("eligibilityStatus")
1217
+ certified: Field[TeamSummaryRow, bool] = Field("certified")
1218
+ paid: Field[TeamSummaryRow, bool] = Field("paid")
1219
+ extended_state: Field[TeamSummaryRow, str] = Field("extendedState")
1220
+
1221
+ #: Columns the icpc.global grid projects by default.
1222
+ default_proj: tuple[str, ...] = (
1223
+ "teamId",
1224
+ "teamName",
1225
+ "rank",
1226
+ "siteName",
1227
+ "country",
1228
+ "instName",
1229
+ "coachName",
1230
+ "promotedFromTeamName",
1231
+ "promotedFromContestName",
1232
+ "created",
1233
+ "status",
1234
+ "eligibilityStatus",
1235
+ "certified",
1236
+ "paid",
1237
+ "extendedState",
1238
+ )
1239
+
1240
+ #: Every column this endpoint accepts.
1241
+ all_fields: tuple[str, ...] = (
1242
+ "teamId",
1243
+ "teamName",
1244
+ "rank",
1245
+ "siteId",
1246
+ "siteName",
1247
+ "country",
1248
+ "a2",
1249
+ "instId",
1250
+ "instName",
1251
+ "coachId",
1252
+ "coachName",
1253
+ "promotedFromTeamId",
1254
+ "promotedFromTeamName",
1255
+ "promotedFromContestId",
1256
+ "promotedFromContestName",
1257
+ "created",
1258
+ "status",
1259
+ "eligibilityId",
1260
+ "eligibilityStatus",
1261
+ "certified",
1262
+ "paid",
1263
+ "extendedState",
1264
+ )
1265
+
1266
+
1267
+ #: Valid column names of :class:`~icpc.models.Top20Row`.
1268
+ type Top20Field = Literal[
1269
+ "area",
1270
+ "contest",
1271
+ "contestId",
1272
+ "rank",
1273
+ "team",
1274
+ "teamId",
1275
+ "role",
1276
+ "institution",
1277
+ "instId",
1278
+ "firstName",
1279
+ "lastName",
1280
+ "username",
1281
+ "userId",
1282
+ "inform",
1283
+ ]
1284
+
1285
+
1286
+ class Top20Fields:
1287
+ """Typed columns of :class:`~icpc.models.Top20Row`."""
1288
+
1289
+ area: Field[Top20Row, str] = Field("area")
1290
+ contest: Field[Top20Row, str] = Field("contest")
1291
+ contest_id: Field[Top20Row, int] = Field("contestId")
1292
+ rank: Field[Top20Row, int] = Field("rank")
1293
+ team: Field[Top20Row, str] = Field("team")
1294
+ team_id: Field[Top20Row, int] = Field("teamId")
1295
+ role: Field[Top20Row, str] = Field("role")
1296
+ institution: Field[Top20Row, str] = Field("institution")
1297
+ inst_id: Field[Top20Row, int] = Field("instId")
1298
+ first_name: Field[Top20Row, str] = Field("firstName")
1299
+ last_name: Field[Top20Row, str] = Field("lastName")
1300
+ username: Field[Top20Row, str] = Field("username")
1301
+ user_id: Field[Top20Row, int] = Field("userId")
1302
+ inform: Field[Top20Row, Consent | str] = Field("inform")
1303
+
1304
+ #: Columns the icpc.global grid projects by default.
1305
+ default_proj: tuple[str, ...] = (
1306
+ "area",
1307
+ "contest",
1308
+ "contestId",
1309
+ "rank",
1310
+ "team",
1311
+ "teamId",
1312
+ "role",
1313
+ "institution",
1314
+ "instId",
1315
+ "firstName",
1316
+ "lastName",
1317
+ "username",
1318
+ "userId",
1319
+ "inform",
1320
+ )
1321
+
1322
+ #: Every column this endpoint accepts.
1323
+ all_fields: tuple[str, ...] = (
1324
+ "area",
1325
+ "contest",
1326
+ "contestId",
1327
+ "rank",
1328
+ "team",
1329
+ "teamId",
1330
+ "role",
1331
+ "institution",
1332
+ "instId",
1333
+ "firstName",
1334
+ "lastName",
1335
+ "username",
1336
+ "userId",
1337
+ "inform",
1338
+ )
1339
+
1340
+
1341
+ #: Valid column names of :class:`~icpc.models.TransportationMissingRow`.
1342
+ type TransportationMissingField = Literal[
1343
+ "personId",
1344
+ "firstName",
1345
+ "lastName",
1346
+ "attendingOnsite",
1347
+ "countryName",
1348
+ "countryA2",
1349
+ "email",
1350
+ "modifiedWhen",
1351
+ "participantId",
1352
+ "siteName",
1353
+ "coach",
1354
+ ]
1355
+
1356
+
1357
+ class TransportationMissingFields:
1358
+ """Typed columns of :class:`~icpc.models.TransportationMissingRow`."""
1359
+
1360
+ person_id: Field[TransportationMissingRow, int] = Field("personId")
1361
+ first_name: Field[TransportationMissingRow, str] = Field("firstName")
1362
+ last_name: Field[TransportationMissingRow, str] = Field("lastName")
1363
+ attending_onsite: Field[TransportationMissingRow, bool] = Field("attendingOnsite")
1364
+ country_name: Field[TransportationMissingRow, str] = Field("countryName")
1365
+ country_a2: Field[TransportationMissingRow, str] = Field("countryA2")
1366
+ email: Field[TransportationMissingRow, str] = Field("email")
1367
+ modified_when: Field[TransportationMissingRow, datetime | str] = Field("modifiedWhen")
1368
+ participant_id: Field[TransportationMissingRow, int] = Field("participantId")
1369
+ site_name: Field[TransportationMissingRow, str] = Field("siteName")
1370
+ coach: Field[TransportationMissingRow, bool] = Field("coach")
1371
+
1372
+ #: Columns the icpc.global grid projects by default.
1373
+ default_proj: tuple[str, ...] = (
1374
+ "countryName",
1375
+ "firstName",
1376
+ "lastName",
1377
+ "email",
1378
+ "attendingOnsite",
1379
+ "modifiedWhen",
1380
+ )
1381
+
1382
+ #: Every column this endpoint accepts.
1383
+ all_fields: tuple[str, ...] = (
1384
+ "personId",
1385
+ "firstName",
1386
+ "lastName",
1387
+ "attendingOnsite",
1388
+ "countryName",
1389
+ "countryA2",
1390
+ "email",
1391
+ "modifiedWhen",
1392
+ "participantId",
1393
+ "siteName",
1394
+ "coach",
1395
+ )
1396
+
1397
+
1398
+ #: Valid column names of :class:`~icpc.models.TshirtRow`.
1399
+ type TshirtField = Literal[
1400
+ "institution",
1401
+ "personName",
1402
+ "teamName",
1403
+ "tshirtSize",
1404
+ ]
1405
+
1406
+
1407
+ class TshirtFields:
1408
+ """Typed columns of :class:`~icpc.models.TshirtRow`."""
1409
+
1410
+ institution: Field[TshirtRow, str] = Field("institution")
1411
+ person_name: Field[TshirtRow, str] = Field("personName")
1412
+ team_name: Field[TshirtRow, str] = Field("teamName")
1413
+ tshirt_size: Field[TshirtRow, ShirtSize | str] = Field("tshirtSize")
1414
+
1415
+ #: Columns the icpc.global grid projects by default.
1416
+ default_proj: tuple[str, ...] = (
1417
+ "personName",
1418
+ "tshirtSize",
1419
+ "institution",
1420
+ "teamName",
1421
+ )
1422
+
1423
+ #: Every column this endpoint accepts.
1424
+ all_fields: tuple[str, ...] = (
1425
+ "institution",
1426
+ "personName",
1427
+ "teamName",
1428
+ "tshirtSize",
1429
+ )
1430
+
1431
+
1432
+ def contest_teams(contest_id: int) -> SearchEndpoint[TeamRow, TeamFields]:
1433
+ """Teams registered for a contest.
1434
+
1435
+ ``/contest/search/contest/{contest_id}/team``
1436
+ """
1437
+ return SearchEndpoint(
1438
+ path=f"/contest/search/contest/{contest_id}/team",
1439
+ row=TeamRow,
1440
+ fields=TeamFields(),
1441
+ default_proj=TeamFields.default_proj,
1442
+ all_fields=TeamFields.all_fields,
1443
+ name="contest_teams",
1444
+ )
1445
+
1446
+
1447
+ def site_teams(site_id: int) -> SearchEndpoint[TeamRow, TeamFields]:
1448
+ """Teams registered for one site of a contest.
1449
+
1450
+ ``/contest/search/site/{site_id}/teams``
1451
+ """
1452
+ return SearchEndpoint(
1453
+ path=f"/contest/search/site/{site_id}/teams",
1454
+ row=TeamRow,
1455
+ fields=TeamFields(),
1456
+ default_proj=TeamFields.default_proj,
1457
+ all_fields=TeamFields.all_fields,
1458
+ name="site_teams",
1459
+ )
1460
+
1461
+
1462
+ def contest_team_members(contest_id: int) -> SearchEndpoint[TeamMemberRow, TeamMemberFields]:
1463
+ """Every team member in a contest, one row per membership.
1464
+
1465
+ ``/contest/search/contest/{contest_id}/teammember``
1466
+ """
1467
+ return SearchEndpoint(
1468
+ path=f"/contest/search/contest/{contest_id}/teammember",
1469
+ row=TeamMemberRow,
1470
+ fields=TeamMemberFields(),
1471
+ default_proj=TeamMemberFields.default_proj,
1472
+ all_fields=TeamMemberFields.all_fields,
1473
+ name="contest_team_members",
1474
+ )
1475
+
1476
+
1477
+ def site_team_members(site_id: int) -> SearchEndpoint[TeamMemberRow, TeamMemberFields]:
1478
+ """Every team member at one site.
1479
+
1480
+ ``/contest/search/site/{site_id}/teammember``
1481
+ """
1482
+ return SearchEndpoint(
1483
+ path=f"/contest/search/site/{site_id}/teammember",
1484
+ row=TeamMemberRow,
1485
+ fields=TeamMemberFields(),
1486
+ default_proj=TeamMemberFields.default_proj,
1487
+ all_fields=TeamMemberFields.all_fields,
1488
+ name="site_team_members",
1489
+ )
1490
+
1491
+
1492
+ def contest_institutions(contest_id: int) -> SearchEndpoint[InstitutionRow, InstitutionFields]:
1493
+ """Institutions with at least one team in a contest.
1494
+
1495
+ ``/contest/search/contest/{contest_id}/institution``
1496
+ """
1497
+ return SearchEndpoint(
1498
+ path=f"/contest/search/contest/{contest_id}/institution",
1499
+ row=InstitutionRow,
1500
+ fields=InstitutionFields(),
1501
+ default_proj=InstitutionFields.default_proj,
1502
+ all_fields=InstitutionFields.all_fields,
1503
+ name="contest_institutions",
1504
+ )
1505
+
1506
+
1507
+ def site_institutions(site_id: int) -> SearchEndpoint[InstitutionRow, InstitutionFields]:
1508
+ """Institutions with at least one team at a site.
1509
+
1510
+ ``/contest/search/site/{site_id}/institutions``
1511
+ """
1512
+ return SearchEndpoint(
1513
+ path=f"/contest/search/site/{site_id}/institutions",
1514
+ row=InstitutionRow,
1515
+ fields=InstitutionFields(),
1516
+ default_proj=InstitutionFields.default_proj,
1517
+ all_fields=InstitutionFields.all_fields,
1518
+ name="site_institutions",
1519
+ )
1520
+
1521
+
1522
+ def contest_participants(
1523
+ contest_id: int,
1524
+ ) -> SearchEndpoint[ContestParticipantRow, ContestParticipantFields]:
1525
+ """Every person at a contest, with travel and visa detail. The widest DTO here.
1526
+
1527
+ ``/contest/search/contest/{contest_id}/contestparticipant``
1528
+ """
1529
+ return SearchEndpoint(
1530
+ path=f"/contest/search/contest/{contest_id}/contestparticipant",
1531
+ row=ContestParticipantRow,
1532
+ fields=ContestParticipantFields(),
1533
+ default_proj=ContestParticipantFields.default_proj,
1534
+ all_fields=ContestParticipantFields.all_fields,
1535
+ name="contest_participants",
1536
+ )
1537
+
1538
+
1539
+ def site_participants(
1540
+ site_id: int,
1541
+ ) -> SearchEndpoint[ContestParticipantRow, ContestParticipantFields]:
1542
+ """Every person at one site.
1543
+
1544
+ ``/contest/search/site/{site_id}/contestparticipant``
1545
+ """
1546
+ return SearchEndpoint(
1547
+ path=f"/contest/search/site/{site_id}/contestparticipant",
1548
+ row=ContestParticipantRow,
1549
+ fields=ContestParticipantFields(),
1550
+ default_proj=ContestParticipantFields.default_proj,
1551
+ all_fields=ContestParticipantFields.all_fields,
1552
+ name="site_participants",
1553
+ )
1554
+
1555
+
1556
+ def contest_staff(contest_id: int) -> SearchEndpoint[StaffRow, StaffFields]:
1557
+ """Contest staff, from the contest grid.
1558
+
1559
+ ``/contest/search/contest/{contest_id}/staff``
1560
+ """
1561
+ return SearchEndpoint(
1562
+ path=f"/contest/search/contest/{contest_id}/staff",
1563
+ row=StaffRow,
1564
+ fields=StaffFields(),
1565
+ default_proj=StaffFields.default_proj,
1566
+ all_fields=StaffFields.all_fields,
1567
+ name="contest_staff",
1568
+ )
1569
+
1570
+
1571
+ def contest_top20(contest_id: int) -> SearchEndpoint[Top20Row, Top20Fields]:
1572
+ """Top-20 participants of a contest.
1573
+
1574
+ ``/contest/search/contest/{contest_id}/top20``
1575
+ """
1576
+ return SearchEndpoint(
1577
+ path=f"/contest/search/contest/{contest_id}/top20",
1578
+ row=Top20Row,
1579
+ fields=Top20Fields(),
1580
+ default_proj=Top20Fields.default_proj,
1581
+ all_fields=Top20Fields.all_fields,
1582
+ name="contest_top20",
1583
+ )
1584
+
1585
+
1586
+ def contest_team_summaries(contest_id: int) -> SearchEndpoint[TeamSummaryRow, TeamSummaryFields]:
1587
+ """Teams of a contest in the alternate shape used by the team grid: ``teamId``/``teamName`` rather than ``id``/``name``, plus promotion history.
1588
+
1589
+ ``/team/search/{contest_id}/all``
1590
+ """
1591
+ return SearchEndpoint(
1592
+ path=f"/team/search/{contest_id}/all",
1593
+ row=TeamSummaryRow,
1594
+ fields=TeamSummaryFields(),
1595
+ default_proj=TeamSummaryFields.default_proj,
1596
+ all_fields=TeamSummaryFields.all_fields,
1597
+ name="contest_team_summaries",
1598
+ )
1599
+
1600
+
1601
+ def site_home_teams(site_id: int) -> SearchEndpoint[TeamSummaryRow, TeamSummaryFields]:
1602
+ """Teams of a site in the alternate team shape.
1603
+
1604
+ ``/contest/search/site/{site_id}/home/teams``
1605
+ """
1606
+ return SearchEndpoint(
1607
+ path=f"/contest/search/site/{site_id}/home/teams",
1608
+ row=TeamSummaryRow,
1609
+ fields=TeamSummaryFields(),
1610
+ default_proj=TeamSummaryFields.default_proj,
1611
+ all_fields=TeamSummaryFields.all_fields,
1612
+ name="site_home_teams",
1613
+ )
1614
+
1615
+
1616
+ def contest_promote_candidates(contest_id: int) -> SearchEndpoint[PromoteRow, PromoteFields]:
1617
+ """Teams eligible to be promoted out of a contest.
1618
+
1619
+ ``/team/search/{contest_id}/promote``
1620
+ """
1621
+ return SearchEndpoint(
1622
+ path=f"/team/search/{contest_id}/promote",
1623
+ row=PromoteRow,
1624
+ fields=PromoteFields(),
1625
+ default_proj=PromoteFields.default_proj,
1626
+ all_fields=PromoteFields.all_fields,
1627
+ name="contest_promote_candidates",
1628
+ )
1629
+
1630
+
1631
+ def contest_staff_members(contest_id: int) -> SearchEndpoint[StaffMemberRow, StaffMemberFields]:
1632
+ """Staff members of a contest, from the staff administration grid.
1633
+
1634
+ ``/contest/staffmember/contest/{contest_id}/search``
1635
+ """
1636
+ return SearchEndpoint(
1637
+ path=f"/contest/staffmember/contest/{contest_id}/search",
1638
+ row=StaffMemberRow,
1639
+ fields=StaffMemberFields(),
1640
+ default_proj=StaffMemberFields.default_proj,
1641
+ all_fields=StaffMemberFields.all_fields,
1642
+ name="contest_staff_members",
1643
+ )
1644
+
1645
+
1646
+ def contest_public_staff_members(
1647
+ contest_id: int,
1648
+ ) -> SearchEndpoint[StaffMemberRow, StaffMemberFields]:
1649
+ """Staff members flagged for the contest's public pages.
1650
+
1651
+ ``/contest/staffmember/contest/{contest_id}/public/search``
1652
+ """
1653
+ return SearchEndpoint(
1654
+ path=f"/contest/staffmember/contest/{contest_id}/public/search",
1655
+ row=StaffMemberRow,
1656
+ fields=StaffMemberFields(),
1657
+ default_proj=StaffMemberFields.default_proj,
1658
+ all_fields=StaffMemberFields.all_fields,
1659
+ name="contest_public_staff_members",
1660
+ )
1661
+
1662
+
1663
+ def contest_staff_funding(contest_id: int) -> SearchEndpoint[StaffFundingRow, StaffFundingFields]:
1664
+ """Staff funding and budget rows.
1665
+
1666
+ ``/contest/staffMember/funding/contest/{contest_id}/search``
1667
+ """
1668
+ return SearchEndpoint(
1669
+ path=f"/contest/staffMember/funding/contest/{contest_id}/search",
1670
+ row=StaffFundingRow,
1671
+ fields=StaffFundingFields(),
1672
+ default_proj=StaffFundingFields.default_proj,
1673
+ all_fields=StaffFundingFields.all_fields,
1674
+ name="contest_staff_funding",
1675
+ )
1676
+
1677
+
1678
+ def contest_staff_tshirts(contest_id: int) -> SearchEndpoint[StaffTshirtRow, StaffTshirtFields]:
1679
+ """Staff t-shirt sizes.
1680
+
1681
+ ``/contest/staffmember/tshirt/contest/{contest_id}/search``
1682
+ """
1683
+ return SearchEndpoint(
1684
+ path=f"/contest/staffmember/tshirt/contest/{contest_id}/search",
1685
+ row=StaffTshirtRow,
1686
+ fields=StaffTshirtFields(),
1687
+ default_proj=StaffTshirtFields.default_proj,
1688
+ all_fields=StaffTshirtFields.all_fields,
1689
+ name="contest_staff_tshirts",
1690
+ )
1691
+
1692
+
1693
+ def contest_standings(contest_id: int) -> SearchEndpoint[StandingsRow, StandingsFields]:
1694
+ """Uploaded standings documents for a contest (not the results themselves).
1695
+
1696
+ ``/contest/standings/contest/{contest_id}/search``
1697
+ """
1698
+ return SearchEndpoint(
1699
+ path=f"/contest/standings/contest/{contest_id}/search",
1700
+ row=StandingsRow,
1701
+ fields=StandingsFields(),
1702
+ default_proj=StandingsFields.default_proj,
1703
+ all_fields=StandingsFields.all_fields,
1704
+ name="contest_standings",
1705
+ )
1706
+
1707
+
1708
+ def contest_team_certificates(contest_id: int) -> SearchEndpoint[CertificateRow, CertificateFields]:
1709
+ """Team certificates issued for a contest.
1710
+
1711
+ ``/contest/certificate/team/contest/{contest_id}/search``
1712
+ """
1713
+ return SearchEndpoint(
1714
+ path=f"/contest/certificate/team/contest/{contest_id}/search",
1715
+ row=CertificateRow,
1716
+ fields=CertificateFields(),
1717
+ default_proj=CertificateFields.default_proj,
1718
+ all_fields=CertificateFields.all_fields,
1719
+ name="contest_team_certificates",
1720
+ )
1721
+
1722
+
1723
+ def contest_staff_certificates(
1724
+ contest_id: int,
1725
+ ) -> SearchEndpoint[CertificateRow, CertificateFields]:
1726
+ """Staff certificates issued for a contest.
1727
+
1728
+ ``/contest/certificate/staff/contest/{contest_id}/search``
1729
+ """
1730
+ return SearchEndpoint(
1731
+ path=f"/contest/certificate/staff/contest/{contest_id}/search",
1732
+ row=CertificateRow,
1733
+ fields=CertificateFields(),
1734
+ default_proj=CertificateFields.default_proj,
1735
+ all_fields=CertificateFields.all_fields,
1736
+ name="contest_staff_certificates",
1737
+ )
1738
+
1739
+
1740
+ def site_team_certificates(site_id: int) -> SearchEndpoint[CertificateRow, CertificateFields]:
1741
+ """Team certificates issued for one site.
1742
+
1743
+ ``/contest/certificate/site/team/site/{site_id}/search``
1744
+ """
1745
+ return SearchEndpoint(
1746
+ path=f"/contest/certificate/site/team/site/{site_id}/search",
1747
+ row=CertificateRow,
1748
+ fields=CertificateFields(),
1749
+ default_proj=CertificateFields.default_proj,
1750
+ all_fields=CertificateFields.all_fields,
1751
+ name="site_team_certificates",
1752
+ )
1753
+
1754
+
1755
+ def contest_missing_transportation(
1756
+ contest_id: int,
1757
+ ) -> SearchEndpoint[TransportationMissingRow, TransportationMissingFields]:
1758
+ """People who have not filled in their travel details.
1759
+
1760
+ ``/contest/transportation/search/contest/{contest_id}/missing``
1761
+ """
1762
+ return SearchEndpoint(
1763
+ path=f"/contest/transportation/search/contest/{contest_id}/missing",
1764
+ row=TransportationMissingRow,
1765
+ fields=TransportationMissingFields(),
1766
+ default_proj=TransportationMissingFields.default_proj,
1767
+ all_fields=TransportationMissingFields.all_fields,
1768
+ name="contest_missing_transportation",
1769
+ )
1770
+
1771
+
1772
+ def site_coach_tshirts(site_id: int) -> SearchEndpoint[TshirtRow, TshirtFields]:
1773
+ """Coach t-shirt sizes at a site.
1774
+
1775
+ ``/contest/search/site/{site_id}/tshirt/coaches``
1776
+ """
1777
+ return SearchEndpoint(
1778
+ path=f"/contest/search/site/{site_id}/tshirt/coaches",
1779
+ row=TshirtRow,
1780
+ fields=TshirtFields(),
1781
+ default_proj=TshirtFields.default_proj,
1782
+ all_fields=TshirtFields.all_fields,
1783
+ name="site_coach_tshirts",
1784
+ )
1785
+
1786
+
1787
+ def site_cocoach_tshirts(site_id: int) -> SearchEndpoint[TshirtRow, TshirtFields]:
1788
+ """Co-coach t-shirt sizes at a site.
1789
+
1790
+ ``/contest/search/site/{site_id}/tshirt/cocoaches``
1791
+ """
1792
+ return SearchEndpoint(
1793
+ path=f"/contest/search/site/{site_id}/tshirt/cocoaches",
1794
+ row=TshirtRow,
1795
+ fields=TshirtFields(),
1796
+ default_proj=TshirtFields.default_proj,
1797
+ all_fields=TshirtFields.all_fields,
1798
+ name="site_cocoach_tshirts",
1799
+ )
1800
+
1801
+
1802
+ def site_contestant_tshirts(site_id: int) -> SearchEndpoint[TshirtRow, TshirtFields]:
1803
+ """Contestant t-shirt sizes at a site.
1804
+
1805
+ ``/contest/search/site/{site_id}/tshirt/contestants``
1806
+ """
1807
+ return SearchEndpoint(
1808
+ path=f"/contest/search/site/{site_id}/tshirt/contestants",
1809
+ row=TshirtRow,
1810
+ fields=TshirtFields(),
1811
+ default_proj=TshirtFields.default_proj,
1812
+ all_fields=TshirtFields.all_fields,
1813
+ name="site_contestant_tshirts",
1814
+ )