98 lines
2.3 KiB
Python
98 lines
2.3 KiB
Python
"""
|
|
Pydantic schemas for Tryout API endpoints.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from typing import List, Literal, Optional
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class TryoutConfigResponse(BaseModel):
|
|
"""Response schema for tryout configuration."""
|
|
|
|
id: int
|
|
website_id: int
|
|
tryout_id: str
|
|
name: str
|
|
description: Optional[str]
|
|
|
|
# Scoring configuration
|
|
scoring_mode: Literal["ctt", "irt", "hybrid"]
|
|
selection_mode: Literal["fixed", "adaptive", "hybrid"]
|
|
normalization_mode: Literal["static", "dynamic", "hybrid"]
|
|
|
|
# Normalization settings
|
|
min_sample_for_dynamic: int
|
|
static_rataan: float
|
|
static_sb: float
|
|
|
|
# AI generation
|
|
ai_generation_enabled: bool
|
|
|
|
# Hybrid mode settings
|
|
hybrid_transition_slot: Optional[int]
|
|
|
|
# IRT settings
|
|
min_calibration_sample: int
|
|
theta_estimation_method: Literal["mle", "map", "eap"]
|
|
fallback_to_ctt_on_error: bool
|
|
|
|
# Current stats
|
|
current_stats: Optional["TryoutStatsResponse"]
|
|
|
|
# Timestamps
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class TryoutStatsResponse(BaseModel):
|
|
"""Response schema for tryout statistics."""
|
|
|
|
participant_count: int
|
|
rataan: Optional[float]
|
|
sb: Optional[float]
|
|
min_nm: Optional[int]
|
|
max_nm: Optional[int]
|
|
last_calculated: Optional[datetime]
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class TryoutConfigBrief(BaseModel):
|
|
"""Brief tryout config for list responses."""
|
|
|
|
tryout_id: str
|
|
name: str
|
|
scoring_mode: str
|
|
selection_mode: str
|
|
normalization_mode: str
|
|
participant_count: Optional[int] = None
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class NormalizationUpdateRequest(BaseModel):
|
|
"""Request schema for updating normalization settings."""
|
|
|
|
normalization_mode: Optional[Literal["static", "dynamic", "hybrid"]] = None
|
|
static_rataan: Optional[float] = Field(None, ge=0)
|
|
static_sb: Optional[float] = Field(None, gt=0)
|
|
|
|
|
|
class NormalizationUpdateResponse(BaseModel):
|
|
"""Response schema for normalization update."""
|
|
|
|
tryout_id: str
|
|
normalization_mode: str
|
|
static_rataan: float
|
|
static_sb: float
|
|
will_switch_to_dynamic_at: int
|
|
current_participant_count: int
|
|
|
|
|
|
# Update forward reference
|
|
TryoutConfigResponse.model_rebuild()
|