Edu-AI / schemas.py
Orbit Automations
Auto-sync from Julius-606/Orbit monorepo
be6ee20
# 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