BakoAI / app /models /player.py
Okidi Norbert
Deployment fix: clean backend only
c6abe34
"""
Pydantic models for player schemas.
"""
from datetime import datetime, date
from typing import Optional, List
from uuid import UUID
from pydantic import BaseModel, Field, field_validator
class PlayerCreate(BaseModel):
"""Request schema for creating a player profile."""
name: str = Field(..., min_length=1, max_length=100)
jersey_number: Optional[int] = Field(None, ge=0, le=99)
position: Optional[str] = Field(None, max_length=50)
height_cm: Optional[float] = Field(None, ge=100, le=250)
weight_kg: Optional[float] = Field(None, ge=30, le=200)
date_of_birth: Optional[date] = None
organization_id: Optional[UUID] = Field(None, description="Required for TEAM players")
phone: Optional[str] = None
address: Optional[str] = None
experience_years: Optional[str] = None
bio: Optional[str] = None
status: Optional[str] = "active"
class PlayerUpdate(BaseModel):
"""Request schema for updating a player profile."""
name: Optional[str] = Field(None, min_length=1, max_length=100)
jersey_number: Optional[int] = Field(None, ge=0, le=99)
position: Optional[str] = Field(None, max_length=50)
height_cm: Optional[float] = Field(None, ge=100, le=250)
weight_kg: Optional[float] = Field(None, ge=30, le=200)
date_of_birth: Optional[date] = None
avatar_url: Optional[str] = None
phone: Optional[str] = None
address: Optional[str] = None
experience_years: Optional[str] = None
bio: Optional[str] = None
status: Optional[str] = None
class Player(BaseModel):
"""Complete player model returned from API."""
id: UUID
name: str
jersey_number: Optional[int] = None
position: Optional[str] = None
height_cm: Optional[float] = None
weight_kg: Optional[float] = None
date_of_birth: Optional[date] = None
avatar_url: Optional[str] = None
phone: Optional[str] = None
address: Optional[str] = None
experience_years: Optional[str] = None
bio: Optional[str] = None
organization_id: Optional[UUID] = None
user_id: Optional[UUID] = None # For PERSONAL accounts
email: Optional[str] = None
status: Optional[str] = "active"
ppg: Optional[float] = 0.0
created_at: datetime
updated_at: Optional[datetime] = None
class Config:
from_attributes = True
@field_validator("experience_years", mode="before")
@classmethod
def coerce_experience_years(cls, v):
"""Convert numeric experience_years to string (handles DB int values)."""
if v is not None and not isinstance(v, str):
return str(v)
return v
class PlayerWithStats(Player):
"""Player with aggregated performance statistics."""
total_videos: int = 0
total_training_minutes: float = 0.0
avg_speed_kmh: Optional[float] = None
total_distance_km: Optional[float] = None
class PlayerListResponse(BaseModel):
"""Response schema for listing players."""
players: List[Player]
total: int