Coverage for models/roster.py: 100.00%

40 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2026-04-15 13:02 +0000

1""" 

2Roster-related Pydantic models for player roster management. 

3""" 

4 

5from pydantic import BaseModel, Field 

6 

7 

8class RosterPlayerCreate(BaseModel): 

9 """Model for creating a single roster entry.""" 

10 

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 

16 

17 

18class RosterPlayerUpdate(BaseModel): 

19 """Model for updating a roster entry's name or positions.""" 

20 

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 

24 

25 

26class JerseyNumberUpdate(BaseModel): 

27 """Model for changing a player's jersey number.""" 

28 

29 new_number: int = Field(..., ge=1, le=99, description="New jersey number (1-99)") 

30 

31 

32class BulkRosterPlayer(BaseModel): 

33 """Single player entry for bulk roster creation.""" 

34 

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 

39 

40 

41class BulkRosterCreate(BaseModel): 

42 """Model for bulk creating roster entries.""" 

43 

44 season_id: int 

45 players: list[BulkRosterPlayer] = Field(..., min_length=1) 

46 

47 

48class RenumberEntry(BaseModel): 

49 """Single entry for bulk renumber operation.""" 

50 

51 player_id: int 

52 new_number: int = Field(..., ge=1, le=99) 

53 

54 

55class BulkRenumberRequest(BaseModel): 

56 """Model for bulk renumbering players.""" 

57 

58 changes: list[RenumberEntry] = Field(..., min_length=1) 

59 

60 

61class RosterPlayerResponse(BaseModel): 

62 """Response model for a roster player.""" 

63 

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 

75 

76 class Config: 

77 """Pydantic config.""" 

78 

79 from_attributes = True