
- Set up project structure with FastAPI and SQLite - Implement user authentication with JWT - Create models for learning content (subjects, lessons, quizzes) - Add progress tracking and gamification features - Implement comprehensive API documentation - Add error handling and validation - Set up proper logging and health check endpoint
174 lines
3.0 KiB
Python
174 lines
3.0 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from typing import List, Optional
|
|
|
|
from pydantic import BaseModel
|
|
|
|
from app.models.content import DifficultyLevel
|
|
|
|
|
|
# Subject schemas
|
|
class SubjectBase(BaseModel):
|
|
name: str
|
|
description: Optional[str] = None
|
|
image_url: Optional[str] = None
|
|
order: Optional[int] = 0
|
|
is_active: bool = True
|
|
|
|
|
|
class SubjectCreate(SubjectBase):
|
|
pass
|
|
|
|
|
|
class SubjectUpdate(SubjectBase):
|
|
name: Optional[str] = None
|
|
|
|
|
|
class SubjectInDBBase(SubjectBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class Subject(SubjectInDBBase):
|
|
pass
|
|
|
|
|
|
# Lesson schemas
|
|
class LessonBase(BaseModel):
|
|
subject_id: int
|
|
title: str
|
|
description: Optional[str] = None
|
|
content: str
|
|
image_url: Optional[str] = None
|
|
order: Optional[int] = 0
|
|
difficulty: DifficultyLevel = DifficultyLevel.EASY
|
|
points: int = 10
|
|
duration_minutes: int = 15
|
|
is_active: bool = True
|
|
|
|
|
|
class LessonCreate(LessonBase):
|
|
pass
|
|
|
|
|
|
class LessonUpdate(LessonBase):
|
|
subject_id: Optional[int] = None
|
|
title: Optional[str] = None
|
|
content: Optional[str] = None
|
|
|
|
|
|
class LessonInDBBase(LessonBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class Lesson(LessonInDBBase):
|
|
pass
|
|
|
|
|
|
# Quiz schemas
|
|
class QuizBase(BaseModel):
|
|
lesson_id: int
|
|
title: str
|
|
description: Optional[str] = None
|
|
time_limit_minutes: int = 10
|
|
pass_percentage: int = 70
|
|
points: int = 20
|
|
is_active: bool = True
|
|
|
|
|
|
class QuizCreate(QuizBase):
|
|
pass
|
|
|
|
|
|
class QuizUpdate(QuizBase):
|
|
lesson_id: Optional[int] = None
|
|
title: Optional[str] = None
|
|
|
|
|
|
class QuizInDBBase(QuizBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class Quiz(QuizInDBBase):
|
|
pass
|
|
|
|
|
|
# Answer schemas
|
|
class AnswerBase(BaseModel):
|
|
text: str
|
|
is_correct: bool
|
|
explanation: Optional[str] = None
|
|
order: int = 0
|
|
|
|
|
|
class AnswerCreate(AnswerBase):
|
|
pass
|
|
|
|
|
|
class AnswerUpdate(AnswerBase):
|
|
text: Optional[str] = None
|
|
is_correct: Optional[bool] = None
|
|
|
|
|
|
class AnswerInDBBase(AnswerBase):
|
|
id: int
|
|
question_id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class Answer(AnswerInDBBase):
|
|
pass
|
|
|
|
|
|
# Question schemas
|
|
class QuestionBase(BaseModel):
|
|
quiz_id: int
|
|
text: str
|
|
image_url: Optional[str] = None
|
|
explanation: Optional[str] = None
|
|
points: int = 5
|
|
order: int = 0
|
|
is_active: bool = True
|
|
|
|
|
|
class QuestionCreate(QuestionBase):
|
|
answers: List[AnswerCreate]
|
|
|
|
|
|
class QuestionUpdate(QuestionBase):
|
|
quiz_id: Optional[int] = None
|
|
text: Optional[str] = None
|
|
answers: Optional[List[AnswerUpdate]] = None
|
|
|
|
|
|
class QuestionInDBBase(QuestionBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class Question(QuestionInDBBase):
|
|
answers: List[Answer] = []
|