mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-19 04:19:25 +00:00
feat: init quiz blocks and blocks folder
This commit is contained in:
parent
40e48bab36
commit
642e55ce2e
8 changed files with 158 additions and 7 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
from fastapi import APIRouter
|
from fastapi import APIRouter
|
||||||
from src.routers import activity, users, auth, houses, orgs, roles, files
|
from src.routers import activity, blocks, users, auth, houses, orgs, roles, files
|
||||||
from src.routers.courses import chapters, collections, courses,lectures
|
from src.routers.courses import chapters, collections, courses,lectures
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -13,6 +13,7 @@ global_router.include_router(houses.router, prefix="/houses", tags=["houses"])
|
||||||
global_router.include_router(orgs.router, prefix="/orgs", tags=["orgs"])
|
global_router.include_router(orgs.router, prefix="/orgs", tags=["orgs"])
|
||||||
global_router.include_router(roles.router, prefix="/roles", tags=["roles"])
|
global_router.include_router(roles.router, prefix="/roles", tags=["roles"])
|
||||||
global_router.include_router(files.router, prefix="/files", tags=["files"])
|
global_router.include_router(files.router, prefix="/files", tags=["files"])
|
||||||
|
global_router.include_router(blocks.router, prefix="/blocks", tags=["blocks"])
|
||||||
global_router.include_router(courses.router, prefix="/courses", tags=["courses"])
|
global_router.include_router(courses.router, prefix="/courses", tags=["courses"])
|
||||||
global_router.include_router(chapters.router, prefix="/chapters", tags=["chapters"])
|
global_router.include_router(chapters.router, prefix="/chapters", tags=["chapters"])
|
||||||
global_router.include_router(lectures.router, prefix="/lectures", tags=["lectures"])
|
global_router.include_router(lectures.router, prefix="/lectures", tags=["lectures"])
|
||||||
|
|
|
||||||
81
src/routers/blocks.py
Normal file
81
src/routers/blocks.py
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
from fastapi import APIRouter, Depends, UploadFile, Form, Request
|
||||||
|
from src.dependencies.auth import get_current_user
|
||||||
|
from fastapi import HTTPException, status, UploadFile
|
||||||
|
from src.services.blocks.files.pictures import create_picture_file, get_picture_file
|
||||||
|
from src.services.blocks.files.videos import create_video_file, get_video_file
|
||||||
|
from src.services.blocks.pdfBlock.documents import create_document_file, get_document_file
|
||||||
|
from src.services.blocks.quizBlock.quizBlock import create_quiz_block, get_quiz_block_answers, get_quiz_block_options, quizBlock
|
||||||
|
from src.services.users import PublicUser
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/picture")
|
||||||
|
async def api_create_picture_file_block(request: Request, file_object: UploadFile, lecture_id: str = Form(), current_user: PublicUser = Depends(get_current_user)):
|
||||||
|
"""
|
||||||
|
Create new picture file
|
||||||
|
"""
|
||||||
|
return await create_picture_file(request, file_object, lecture_id)
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/video")
|
||||||
|
async def api_create_video_file_block(request: Request, file_object: UploadFile, lecture_id: str = Form(), current_user: PublicUser = Depends(get_current_user)):
|
||||||
|
"""
|
||||||
|
Create new video file
|
||||||
|
"""
|
||||||
|
return await create_video_file(request, file_object, lecture_id)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/picture")
|
||||||
|
async def api_get_picture_file_block(request: Request, file_id: str, current_user: PublicUser = Depends(get_current_user)):
|
||||||
|
"""
|
||||||
|
Get picture file
|
||||||
|
"""
|
||||||
|
return await get_picture_file(request, file_id, current_user)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/video")
|
||||||
|
async def api_get_video_file_block(request: Request, file_id: str, current_user: PublicUser = Depends(get_current_user)):
|
||||||
|
"""
|
||||||
|
Get video file
|
||||||
|
"""
|
||||||
|
return await get_video_file(request, file_id, current_user)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/document")
|
||||||
|
async def api_get_document_file_block(request: Request, file_id: str, current_user: PublicUser = Depends(get_current_user)):
|
||||||
|
"""
|
||||||
|
Get document file
|
||||||
|
"""
|
||||||
|
return await get_document_file(request, file_id, current_user)
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/document")
|
||||||
|
async def api_create_document_file_block(request: Request, file_object: UploadFile, lecture_id: str = Form(), current_user: PublicUser = Depends(get_current_user)):
|
||||||
|
"""
|
||||||
|
Create new document file
|
||||||
|
"""
|
||||||
|
return await create_document_file(request, file_object, lecture_id)
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/quiz")
|
||||||
|
async def api_create_quiz_block(request: Request, quiz_block: quizBlock, lecture_id: str, current_user: PublicUser = Depends(get_current_user)):
|
||||||
|
"""
|
||||||
|
Create new document file
|
||||||
|
"""
|
||||||
|
return await create_quiz_block(request, quiz_block, lecture_id, current_user)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/quiz/options")
|
||||||
|
async def api_get_quiz_options(request: Request, block_id: str, current_user: PublicUser = Depends(get_current_user)):
|
||||||
|
"""
|
||||||
|
Get quiz options
|
||||||
|
"""
|
||||||
|
return await get_quiz_block_options(request, block_id, current_user)
|
||||||
|
|
||||||
|
@router.get("/quiz/answers")
|
||||||
|
async def api_get_quiz_answers(request: Request, block_id: str, current_user: PublicUser = Depends(get_current_user)):
|
||||||
|
"""
|
||||||
|
Get quiz answers
|
||||||
|
"""
|
||||||
|
return await get_quiz_block_answers(request, block_id, current_user)
|
||||||
|
|
@ -1,10 +1,9 @@
|
||||||
from fastapi import APIRouter, Depends, UploadFile, Form, Request
|
from fastapi import APIRouter, Depends, UploadFile, Form, Request
|
||||||
from src.dependencies.auth import get_current_user
|
from src.dependencies.auth import get_current_user
|
||||||
from fastapi import HTTPException, status, UploadFile
|
from fastapi import HTTPException, status, UploadFile
|
||||||
from src.services.files.documents import create_document_file, get_document_file
|
from src.services.blocks.files.pictures import create_picture_file, get_picture_file
|
||||||
|
from src.services.blocks.files.videos import create_video_file, get_video_file
|
||||||
from src.services.files.pictures import create_picture_file, get_picture_file
|
from src.services.blocks.pdfBlock.documents import create_document_file, get_document_file
|
||||||
from src.services.files.videos import create_video_file, get_video_file
|
|
||||||
from src.services.users import PublicUser
|
from src.services.users import PublicUser
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
@ -41,7 +40,6 @@ async def api_get_video_file(request: Request, file_id: str, current_user: Publi
|
||||||
"""
|
"""
|
||||||
return await get_video_file(request, file_id, current_user)
|
return await get_video_file(request, file_id, current_user)
|
||||||
|
|
||||||
|
|
||||||
@router.get("/document")
|
@router.get("/document")
|
||||||
async def api_get_document_file(request: Request, file_id: str, current_user: PublicUser = Depends(get_current_user)):
|
async def api_get_document_file(request: Request, file_id: str, current_user: PublicUser = Depends(get_current_user)):
|
||||||
"""
|
"""
|
||||||
|
|
@ -55,4 +53,4 @@ async def api_create_document_file(request: Request, file_object: UploadFile, le
|
||||||
"""
|
"""
|
||||||
Create new document file
|
Create new document file
|
||||||
"""
|
"""
|
||||||
return await create_document_file(request, file_object, lecture_id)
|
return await create_document_file(request, file_object, lecture_id)
|
||||||
12
src/services/blocks/blocks.py
Normal file
12
src/services/blocks/blocks.py
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
|
||||||
|
from typing import Any, List, Literal
|
||||||
|
from uuid import uuid4
|
||||||
|
from fastapi import Request
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
|
class Block(BaseModel):
|
||||||
|
block_id: str
|
||||||
|
lecture_id: str
|
||||||
|
block_type: Literal["quizBlock", "videoBlock", "pdfBlock"]
|
||||||
|
block_data: Any
|
||||||
59
src/services/blocks/quizBlock/quizBlock.py
Normal file
59
src/services/blocks/quizBlock/quizBlock.py
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
from typing import List, Literal
|
||||||
|
from uuid import uuid4
|
||||||
|
from fastapi import Request
|
||||||
|
from pydantic import BaseModel
|
||||||
|
from src.services.blocks.blocks import Block
|
||||||
|
from src.services.users import PublicUser
|
||||||
|
|
||||||
|
|
||||||
|
class option(BaseModel):
|
||||||
|
option_id: str
|
||||||
|
option_type: Literal["text", "image"]
|
||||||
|
option_data: str
|
||||||
|
|
||||||
|
|
||||||
|
class answer(BaseModel):
|
||||||
|
question_id: str
|
||||||
|
option_id: str
|
||||||
|
|
||||||
|
|
||||||
|
class question(BaseModel):
|
||||||
|
question_id: str
|
||||||
|
options: List[option]
|
||||||
|
|
||||||
|
|
||||||
|
class quizBlock(BaseModel):
|
||||||
|
questions: List[question]
|
||||||
|
answers: List[answer]
|
||||||
|
|
||||||
|
|
||||||
|
async def create_quiz_block(request: Request, quizBlock: quizBlock, lecture_id: str, user: PublicUser):
|
||||||
|
blocks = request.app.db["blocks"]
|
||||||
|
block_id = str(f"block_{uuid4()}")
|
||||||
|
|
||||||
|
# create block
|
||||||
|
block = Block(block_id=block_id, lecture_id=lecture_id,
|
||||||
|
block_type="quizBlock", block_data=quizBlock)
|
||||||
|
|
||||||
|
# insert block
|
||||||
|
blocks.insert_one(block.dict())
|
||||||
|
|
||||||
|
return block
|
||||||
|
|
||||||
|
|
||||||
|
async def get_quiz_block_options(request: Request, block_id: str, user: PublicUser):
|
||||||
|
blocks = request.app.db["blocks"]
|
||||||
|
# find block but get only the options
|
||||||
|
block = blocks.find_one({"block_id": block_id, }, {
|
||||||
|
"_id": 0, "block_data.answers": 0})
|
||||||
|
|
||||||
|
return block
|
||||||
|
|
||||||
|
async def get_quiz_block_answers(request: Request, block_id: str, user: PublicUser):
|
||||||
|
blocks = request.app.db["blocks"]
|
||||||
|
|
||||||
|
# find block but get only the answers
|
||||||
|
block = blocks.find_one({"block_id": block_id, }, {
|
||||||
|
"_id": 0, "block_data.questions": 0})
|
||||||
|
|
||||||
|
return block
|
||||||
Loading…
Add table
Add a link
Reference in a new issue