78 lines
3.6 KiB
Python
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")
|