Coverage for models/lineup.py: 100.00%

25 statements  

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

1""" 

2Lineup Pydantic models. 

3 

4Models for match lineup/formation management. 

5""" 

6 

7from datetime import datetime 

8 

9from pydantic import BaseModel, Field 

10 

11 

12class LineupPositionEntry(BaseModel): 

13 """A single player-position assignment in a lineup.""" 

14 

15 player_id: int = Field(..., description="ID of the player") 

16 position: str = Field(..., max_length=10, description="Position code (e.g., GK, LB, ST)") 

17 

18 

19class LineupSave(BaseModel): 

20 """Request model for saving a lineup.""" 

21 

22 formation_name: str = Field( 

23 ..., 

24 max_length=20, 

25 description="Formation preset name (e.g., 4-3-3, 4-4-2)", 

26 ) 

27 positions: list[LineupPositionEntry] = Field( 

28 default_factory=list, 

29 description="List of player-position assignments", 

30 ) 

31 

32 

33class LineupPositionResponse(BaseModel): 

34 """A position in a lineup response with player details.""" 

35 

36 player_id: int 

37 position: str 

38 jersey_number: int | None = None 

39 first_name: str | None = None 

40 last_name: str | None = None 

41 display_name: str | None = None 

42 

43 

44class LineupResponse(BaseModel): 

45 """Response model for a lineup.""" 

46 

47 id: int 

48 match_id: int 

49 team_id: int 

50 formation_name: str 

51 positions: list[LineupPositionResponse] = [] 

52 created_at: datetime | None = None 

53 updated_at: datetime | None = None 

54 created_by: str | None = None 

55 updated_by: str | None = None