From 642e55ce2e12ef0c1b42ff6717d8ef0fe3d25f38 Mon Sep 17 00:00:00 2001 From: swve Date: Sun, 19 Feb 2023 23:27:56 +0100 Subject: [PATCH] feat: init quiz blocks and blocks folder --- src/main.py | 3 +- src/routers/blocks.py | 81 +++++++++++++++++++ src/routers/files.py | 10 +-- src/services/blocks/blocks.py | 12 +++ src/services/{ => blocks}/files/pictures.py | 0 src/services/{ => blocks}/files/videos.py | 0 .../{files => blocks/pdfBlock}/documents.py | 0 src/services/blocks/quizBlock/quizBlock.py | 59 ++++++++++++++ 8 files changed, 158 insertions(+), 7 deletions(-) create mode 100644 src/routers/blocks.py create mode 100644 src/services/blocks/blocks.py rename src/services/{ => blocks}/files/pictures.py (100%) rename src/services/{ => blocks}/files/videos.py (100%) rename src/services/{files => blocks/pdfBlock}/documents.py (100%) create mode 100644 src/services/blocks/quizBlock/quizBlock.py diff --git a/src/main.py b/src/main.py index 6a41e764..9dbfb5e9 100644 --- a/src/main.py +++ b/src/main.py @@ -1,5 +1,5 @@ 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 @@ -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(roles.router, prefix="/roles", tags=["roles"]) 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(chapters.router, prefix="/chapters", tags=["chapters"]) global_router.include_router(lectures.router, prefix="/lectures", tags=["lectures"]) diff --git a/src/routers/blocks.py b/src/routers/blocks.py new file mode 100644 index 00000000..f65e2d68 --- /dev/null +++ b/src/routers/blocks.py @@ -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) diff --git a/src/routers/files.py b/src/routers/files.py index d520c196..593fed48 100644 --- a/src/routers/files.py +++ b/src/routers/files.py @@ -1,10 +1,9 @@ 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.files.documents import create_document_file, get_document_file - -from src.services.files.pictures import create_picture_file, get_picture_file -from src.services.files.videos import create_video_file, get_video_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.blocks.pdfBlock.documents import create_document_file, get_document_file from src.services.users import PublicUser 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) - @router.get("/document") 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 """ - return await create_document_file(request, file_object, lecture_id) + return await create_document_file(request, file_object, lecture_id) \ No newline at end of file diff --git a/src/services/blocks/blocks.py b/src/services/blocks/blocks.py new file mode 100644 index 00000000..d146e633 --- /dev/null +++ b/src/services/blocks/blocks.py @@ -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 diff --git a/src/services/files/pictures.py b/src/services/blocks/files/pictures.py similarity index 100% rename from src/services/files/pictures.py rename to src/services/blocks/files/pictures.py diff --git a/src/services/files/videos.py b/src/services/blocks/files/videos.py similarity index 100% rename from src/services/files/videos.py rename to src/services/blocks/files/videos.py diff --git a/src/services/files/documents.py b/src/services/blocks/pdfBlock/documents.py similarity index 100% rename from src/services/files/documents.py rename to src/services/blocks/pdfBlock/documents.py diff --git a/src/services/blocks/quizBlock/quizBlock.py b/src/services/blocks/quizBlock/quizBlock.py new file mode 100644 index 00000000..7e9591a1 --- /dev/null +++ b/src/services/blocks/quizBlock/quizBlock.py @@ -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