Coverage for models/roster.py: 100.00%
40 statements
« prev ^ index » next coverage.py v7.10.6, created at 2026-04-13 11:37 +0000
« prev ^ index » next coverage.py v7.10.6, created at 2026-04-13 11:37 +0000
1"""
2Roster-related Pydantic models for player roster management.
3"""
5from pydantic import BaseModel, Field
8class RosterPlayerCreate(BaseModel):
9 """Model for creating a single roster entry."""
11 jersey_number: int = Field(..., ge=1, le=99, description="Jersey number (1-99)")
12 first_name: str | None = Field(None, max_length=100)
13 last_name: str | None = Field(None, max_length=100)
14 positions: list[str] | None = None
15 season_id: int
18class RosterPlayerUpdate(BaseModel):
19 """Model for updating a roster entry's name or positions."""
21 first_name: str | None = Field(None, max_length=100)
22 last_name: str | None = Field(None, max_length=100)
23 positions: list[str] | None = None
26class JerseyNumberUpdate(BaseModel):
27 """Model for changing a player's jersey number."""
29 new_number: int = Field(..., ge=1, le=99, description="New jersey number (1-99)")
32class BulkRosterPlayer(BaseModel):
33 """Single player entry for bulk roster creation."""
35 jersey_number: int = Field(..., ge=1, le=99)
36 first_name: str | None = Field(None, max_length=100)
37 last_name: str | None = Field(None, max_length=100)
38 positions: list[str] | None = None
41class BulkRosterCreate(BaseModel):
42 """Model for bulk creating roster entries."""
44 season_id: int
45 players: list[BulkRosterPlayer] = Field(..., min_length=1)
48class RenumberEntry(BaseModel):
49 """Single entry for bulk renumber operation."""
51 player_id: int
52 new_number: int = Field(..., ge=1, le=99)
55class BulkRenumberRequest(BaseModel):
56 """Model for bulk renumbering players."""
58 changes: list[RenumberEntry] = Field(..., min_length=1)
61class RosterPlayerResponse(BaseModel):
62 """Response model for a roster player."""
64 id: int
65 team_id: int
66 season_id: int
67 jersey_number: int
68 first_name: str | None = None
69 last_name: str | None = None
70 display_name: str # Computed: full name or "#23"
71 user_profile_id: str | None = None
72 has_account: bool
73 positions: list[str] | None = None
74 is_active: bool
76 class Config:
77 """Pydantic config."""
79 from_attributes = True