Automated Action 53d9909fb6 Create gamified kids learning API with FastAPI and SQLite
- 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
2025-06-17 18:25:16 +00:00

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] = []