2026-02-01 09:31:38 +01:00

78 lines
3.6 KiB
Python

"""
Pydantic schemas for predictions.
This module defines request and response schemas for prediction-related operations.
"""
from datetime import datetime
from typing import Optional, Any
from pydantic import BaseModel, Field, ConfigDict
class PredictionBase(BaseModel):
"""Base schema for prediction data."""
match_id: int = Field(..., description="Foreign key to matches table")
energy_score: str = Field(..., min_length=1, max_length=50, description="Energy score for the prediction")
confidence: str = Field(..., min_length=1, max_length=50, description="Confidence level of the prediction")
predicted_winner: str = Field(..., min_length=1, max_length=255, description="Predicted winner team name")
created_at: datetime = Field(..., description="Timestamp when prediction was created")
class PredictionCreate(PredictionBase):
"""Schema for creating a new prediction."""
pass
class PredictionUpdate(BaseModel):
"""Schema for updating a prediction."""
energy_score: Optional[str] = Field(None, min_length=1, max_length=50)
confidence: Optional[str] = Field(None, min_length=1, max_length=50)
predicted_winner: Optional[str] = Field(None, min_length=1, max_length=255)
class MatchInfo(BaseModel):
"""Schema for match information included in prediction response."""
id: int = Field(..., description="Match ID")
home_team: str = Field(..., description="Home team name")
away_team: str = Field(..., description="Away team name")
date: datetime = Field(..., description="Match date and time")
league: str = Field(..., description="League name")
status: str = Field(..., description="Match status")
class PredictionResponse(BaseModel):
"""Schema for prediction response with match details."""
id: int = Field(..., description="Primary key")
match_id: int = Field(..., description="Foreign key to matches table")
match: MatchInfo = Field(..., description="Match details")
energy_score: str = Field(..., description="Energy score for the prediction")
confidence: str = Field(..., description="Confidence level of the prediction")
predicted_winner: str = Field(..., description="Predicted winner team name")
created_at: datetime = Field(..., description="Timestamp when prediction was created")
model_config = ConfigDict(from_attributes=False)
class PredictionListMeta(BaseModel):
"""Schema for pagination metadata."""
total: int = Field(..., description="Total number of predictions matching filters")
limit: int = Field(..., description="Number of predictions returned")
offset: int = Field(..., description="Number of predictions skipped")
timestamp: str = Field(..., description="ISO 8601 timestamp of response")
version: str = Field(default="v1", description="API version")
class PredictionListResponse(BaseModel):
"""Schema for a list of predictions with standardized metadata."""
data: list[PredictionResponse] = Field(..., description="List of predictions")
meta: PredictionListMeta = Field(..., description="Pagination and metadata")
class PredictionStatsResponse(BaseModel):
"""Schema for prediction statistics."""
total_predictions: int = Field(..., description="Total number of predictions")
predictions_by_confidence: dict = Field(..., description="Breakdown by confidence level")
predictions_by_energy_score: dict = Field(..., description="Breakdown by energy score")
avg_confidence: float = Field(..., description="Average confidence level")
unique_matches_predicted: int = Field(..., description="Number of unique matches with predictions")