# IDENTITY: backend/schemas.py # VERSION: 1.9.0 # ⚙️ Pydantic Models for Data Validation from pydantic import BaseModel from typing import List, Optional, Any class UnitBase(BaseModel): name: str is_active: bool = True category: str = "General" class UnitCreate(UnitBase): owner_id: int class UnitUpdate(BaseModel): name: Optional[str] = None is_active: Optional[bool] = None category: Optional[str] = None class UnitResponse(UnitBase): id: int owner_id: int class Config: from_attributes = True class QuizHistoryResponse(BaseModel): unit_name: str pnl: float timestamp: str class ChatMessageResponse(BaseModel): role: str content: str timestamp: str class DashboardResponse(BaseModel): username: str role: str sensory_mode: str semester_status: str difficulty: str ai_persona: str active_units: List[str] average_pnl: float total_quizzes: int quiz_history: List[QuizHistoryResponse] chat_history: List[ChatMessageResponse] class ChaosRequest(BaseModel): unit: str focus_area: Optional[str] = None difficulty: str = "Asian Parent Expectations (Extreme)" student_id: str class ChaosResponse(BaseModel): case_study: str class UserCreate(BaseModel): username: str role: str = "Student" sensory_mode: str = "Standard" difficulty: str = "Medium (Standard)" ai_persona: str = "Standard Edu_AI" semester_status: str = "Year 4 - Redemption Arc" interests: List[str] = [] active_units: List[str] = [] class UserUpdate(BaseModel): role: Optional[str] = None sensory_mode: Optional[str] = None difficulty: Optional[str] = None ai_persona: Optional[str] = None semester_status: Optional[str] = None interests: Optional[List[str]] = None active_units: Optional[List[str]] = None class UserResponseSchema(BaseModel): id: int username: str role: str sensory_mode: str difficulty: str ai_persona: str semester_status: str interests: List[str] active_units: List[str] = [] class Config: from_attributes = True class UserPreferencesUpdate(BaseModel): sensory_mode: Optional[str] = None ai_persona: Optional[str] = None # --- TEACHER PORTAL SCHEMAS --- class StudentSummary(BaseModel): id: int username: str average_pnl: float total_quizzes: int semester_status: str active_units: List[str] is_at_risk: bool = False risk_reason: Optional[str] = None class TeacherDashboardResponse(BaseModel): action_required_queue: List[StudentSummary] total_active_students: int class_health_score: float class ClassReportResponse(BaseModel): report: str # --- PARENT PORTAL SCHEMAS --- class ParentDashboardResponse(BaseModel): student_name: str academic_status: str current_study_path: List[str] ai_progress_review: str teacher_remarks: Optional[str] = None recent_grades: List[QuizHistoryResponse] # --- TIMETABLE SCHEMAS --- class TimetableSlot(BaseModel): day: str time: str activity: str unit: Optional[str] = None type: str # "Study", "Break", "Assessment", "Revision" class TimetableResponse(BaseModel): weekly_plan: List[TimetableSlot] ai_brief: str # --- AI Models --- class ChatMessage(BaseModel): role: str content: str class ChatRequest(BaseModel): prompt: str user_id: str history: List[ChatMessage] = [] class ChatResponse(BaseModel): response: str class QuizRequest(BaseModel): unit_name: str user_id: str class QuizQuestion(BaseModel): question_text: str options: List[str] correct_option_index: int explanation: str class QuizResponse(BaseModel): quiz_title: str questions: List[QuizQuestion] class QuizRecordRequest(BaseModel): unit_name: str score: int total: int user_id: str timestamp: Any class RecommendationResponse(BaseModel): recommendation: str