""" 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()