from datetime import datetime from typing import Any, Optional from pydantic import BaseModel, Field class ClassroomActivityCreate(BaseModel): title: str = Field(..., min_length=1, max_length=200) activity_type: str = Field(default="poll", max_length=50) description: str = "" config: dict[str, Any] = {} status: str = "draft" class ClassroomActivityUpdate(BaseModel): title: Optional[str] = None activity_type: Optional[str] = None description: Optional[str] = None config: Optional[dict[str, Any]] = None responses: Optional[list[dict[str, Any]]] = None status: Optional[str] = None class ClassroomResponseCreate(BaseModel): student_name: str = Field(default="", max_length=50) answer: Any meta: dict[str, Any] = {} class ClassroomActivityOut(BaseModel): id: int user_id: int title: str activity_type: str = "poll" description: str = "" config: dict = {} responses: list = [] status: str = "draft" created_at: datetime | None = None updated_at: datetime | None = None model_config = {"from_attributes": True} class ClassroomOptionStat(BaseModel): option: str count: int = 0 percent: int = 0 class ClassroomKeywordStat(BaseModel): keyword: str count: int = 0 class ClassroomAnalysisOut(BaseModel): activity_id: int title: str activity_type: str = "poll" question: str = "" response_count: int = 0 participant_count: int = 0 option_stats: list[ClassroomOptionStat] = Field(default_factory=list) keywords: list[ClassroomKeywordStat] = Field(default_factory=list) common_answers: list[str] = Field(default_factory=list) mastery_level: str = "暂无数据" accuracy: int | None = None diagnosis: list[str] = Field(default_factory=list) teaching_suggestions: list[str] = Field(default_factory=list) followup_prompt: str = "" generated_at: datetime | None = None