feat: inot blocks + schemas updates

This commit is contained in:
swve 2023-11-16 22:37:09 +01:00
parent e6adbca562
commit b04fd64c92
8 changed files with 250 additions and 264 deletions

View file

@ -0,0 +1,82 @@
from datetime import datetime
from uuid import uuid4
from fastapi import HTTPException, status, UploadFile, Request
from sqlmodel import Session, select
from src.db.activities import Activity
from src.db.blocks import Block, BlockTypeEnum
from src.db.courses import Course
from src.services.blocks.utils.upload_files import upload_file_and_return_file_object
from src.services.users.users import PublicUser
async def create_image_block(
request: Request, image_file: UploadFile, activity_id: str, db_session: Session
):
statement = select(Activity).where(Activity.id == activity_id)
activity = db_session.exec(statement).first()
if not activity:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Activity not found"
)
block_type = "imageBlock"
# get org_id from activity
org_id = activity.org_id
# get course
statement = select(Course).where(Course.id == activity.course_id)
course = db_session.exec(statement).first()
if not course:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Course not found"
)
# get block id
block_uuid = str(f"block_{uuid4()}")
block_data = await upload_file_and_return_file_object(
request,
image_file,
activity_id,
block_uuid,
["jpg", "jpeg", "png", "gif"],
block_type,
str(org_id),
str(course.id),
)
# create block
block = Block(
activity_id=activity.id is not None,
block_type=BlockTypeEnum.BLOCK_IMAGE,
content=block_data.dict(),
org_id=org_id,
course_id=course.id is not None,
block_uuid=block_uuid,
creation_date=str(datetime.now()),
update_date=str(datetime.now()),
)
# insert block
db_session.add(block)
db_session.commit()
db_session.refresh(block)
return block
async def get_image_block(
request: Request, block_uuid: str, current_user: PublicUser, db_session: Session
):
statement = select(Block).where(Block.block_uuid == block_uuid)
block = db_session.exec(statement).first()
if block:
return block
else:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Image block does not exist"
)

View file

@ -1,72 +0,0 @@
from uuid import uuid4
from fastapi import HTTPException, status, UploadFile, Request
from src.services.blocks.schemas.blocks import Block
from src.services.blocks.utils.upload_files import upload_file_and_return_file_object
from src.services.users.users import PublicUser
async def create_image_block(
request: Request, image_file: UploadFile, activity_id: str
):
blocks = request.app.db["blocks"]
activity = request.app.db["activities"]
courses = request.app.db["courses"]
block_type = "imageBlock"
# get org_id from activity
activity = await activity.find_one({"activity_id": activity_id}, {"_id": 0})
org_id = activity["org_id"]
coursechapter_id = activity["coursechapter_id"]
# get course_id from coursechapter
course = await courses.find_one(
{"chapters": coursechapter_id},
{"_id": 0},
)
# get block id
block_id = str(f"block_{uuid4()}")
block_data = await upload_file_and_return_file_object(
request,
image_file,
activity_id,
block_id,
["jpg", "jpeg", "png", "gif"],
block_type,
org_id,
course["course_id"],
)
# create block
block = Block(
block_id=block_id,
activity_id=activity_id,
block_type=block_type,
block_data=block_data,
org_id=org_id,
course_id=course["course_id"],
)
# insert block
await blocks.insert_one(block.dict())
return block
async def get_image_block(request: Request, file_id: str, current_user: PublicUser):
blocks = request.app.db["blocks"]
video_block = await blocks.find_one({"block_id": file_id})
if video_block:
return Block(**video_block)
else:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Image block does not exist"
)

View file

@ -1,69 +1,83 @@
from datetime import datetime
from uuid import uuid4
from fastapi import HTTPException, status, UploadFile, Request
from src.services.blocks.schemas.blocks import Block
from sqlmodel import Session, select
from src.db.activities import Activity
from src.db.blocks import Block, BlockTypeEnum
from src.db.courses import Course
from src.services.blocks.utils.upload_files import upload_file_and_return_file_object
from src.services.users.users import PublicUser
async def create_pdf_block(request: Request, pdf_file: UploadFile, activity_id: str):
blocks = request.app.db["blocks"]
activity = request.app.db["activities"]
courses = request.app.db["courses"]
async def create_pdf_block(
request: Request, pdf_file: UploadFile, activity_id: str, db_session: Session
):
statement = select(Activity).where(Activity.id == activity_id)
activity = db_session.exec(statement).first()
if not activity:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Activity not found"
)
block_type = "pdfBlock"
# get org_id from activity
activity = await activity.find_one({"activity_id": activity_id}, {"_id": 0})
org_id = activity["org_id"]
org_id = activity.org_id
# get course
statement = select(Course).where(Course.id == activity.course_id)
course = db_session.exec(statement).first()
if not course:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Course not found"
)
# get block id
block_id = str(f"block_{uuid4()}")
coursechapter_id = activity["coursechapter_id"]
# get course_id from coursechapter
course = await courses.find_one(
{"chapters": coursechapter_id},
{"_id": 0},
)
block_uuid = str(f"block_{uuid4()}")
block_data = await upload_file_and_return_file_object(
request,
pdf_file,
activity_id,
block_id,
block_uuid,
["pdf"],
block_type,
org_id,
course["course_id"],
str(org_id),
str(course.id),
)
# create block
block = Block(
block_id=block_id,
activity_id=activity_id,
block_type=block_type,
block_data=block_data,
activity_id=activity.id is not None,
block_type=BlockTypeEnum.BLOCK_DOCUMENT_PDF,
content=block_data.dict(),
org_id=org_id,
course_id=course["course_id"],
course_id=course.id is not None,
block_uuid=block_uuid,
creation_date=str(datetime.now()),
update_date=str(datetime.now()),
)
# insert block
await blocks.insert_one(block.dict())
db_session.add(block)
db_session.commit()
db_session.refresh(block)
return block
async def get_pdf_block(request: Request, file_id: str, current_user: PublicUser):
blocks = request.app.db["blocks"]
async def get_pdf_block(
request: Request, block_uuid: str, current_user: PublicUser, db_session: Session
):
statement = select(Block).where(Block.block_uuid == block_uuid)
block = db_session.exec(statement).first()
pdf_block = await blocks.find_one({"block_id": file_id})
if pdf_block:
return Block(**pdf_block)
else:
if not block:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Video file does not exist"
status_code=status.HTTP_404_NOT_FOUND, detail="Video file does not exist"
)
return block

View file

@ -1,70 +0,0 @@
from typing import List, Literal
from uuid import uuid4
from fastapi import Request
from pydantic import BaseModel
from src.services.blocks.schemas.blocks import Block
from src.services.users.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
question_value:str
options: List[option]
class quizBlock(BaseModel):
questions: List[question]
answers: List[answer]
async def create_quiz_block(request: Request, quizBlock: quizBlock, activity_id: str, user: PublicUser):
blocks = request.app.db["blocks"]
activities = request.app.db["activities"]
request.app.db["courses"]
# Get org_id from activity
activity = await activities.find_one({"activity_id": activity_id}, {"_id": 0, "org_id": 1})
org_id = activity["org_id"]
# Get course_id from activity
course = await activities.find_one({"activity_id": activity_id}, {"_id": 0, "course_id": 1})
block_id = str(f"block_{uuid4()}")
# create block
block = Block(block_id=block_id, activity_id=activity_id,
block_type="quizBlock", block_data=quizBlock, org_id=org_id, course_id=course["course_id"])
# insert block
await 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 = await 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 = await blocks.find_one({"block_id": block_id, }, {
"_id": 0, "block_data.questions": 0})
return block

View file

@ -1,73 +1,83 @@
from datetime import datetime
from uuid import uuid4
from fastapi import HTTPException, status, UploadFile, Request
from src.services.blocks.schemas.blocks import Block
from sqlmodel import Session, select
from src.db.activities import Activity
from src.db.blocks import Block, BlockTypeEnum
from src.db.courses import Course
from src.services.blocks.utils.upload_files import upload_file_and_return_file_object
from src.services.users.users import PublicUser
async def create_video_block(
request: Request, video_file: UploadFile, activity_id: str
request: Request, video_file: UploadFile, activity_id: str, db_session: Session
):
blocks = request.app.db["blocks"]
activity = request.app.db["activities"]
courses = request.app.db["courses"]
statement = select(Activity).where(Activity.id == activity_id)
activity = db_session.exec(statement).first()
if not activity:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Activity not found"
)
block_type = "videoBlock"
# get org_id from activity
activity = await activity.find_one(
{"activity_id": activity_id}, {"_id": 0}
)
org_id = activity["org_id"]
org_id = activity.org_id
# get course
statement = select(Course).where(Course.id == activity.course_id)
course = db_session.exec(statement).first()
if not course:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Course not found"
)
# get block id
block_id = str(f"block_{uuid4()}")
coursechapter_id = activity["coursechapter_id"]
# get course_id from coursechapter
course = await courses.find_one(
{"chapters": coursechapter_id},
{"_id": 0},
)
block_uuid = str(f"block_{uuid4()}")
block_data = await upload_file_and_return_file_object(
request,
video_file,
activity_id,
block_id,
block_uuid,
["mp4", "webm", "ogg"],
block_type,
org_id,
course["course_id"],
str(org_id),
str(course.id),
)
# create block
block = Block(
block_id=block_id,
activity_id=activity_id,
block_type=block_type,
block_data=block_data,
activity_id=activity.id is not None,
block_type=BlockTypeEnum.BLOCK_VIDEO,
content=block_data.dict(),
org_id=org_id,
course_id=course["course_id"],
course_id=course.id is not None,
block_uuid=block_uuid,
creation_date=str(datetime.now()),
update_date=str(datetime.now()),
)
# insert block
await blocks.insert_one(block.dict())
db_session.add(block)
db_session.commit()
db_session.refresh(block)
return block
async def get_video_block(request: Request, file_id: str, current_user: PublicUser):
blocks = request.app.db["blocks"]
async def get_video_block(
request: Request, block_uuid: str, current_user: PublicUser, db_session: Session
):
statement = select(Block).where(Block.block_uuid == block_uuid)
block = db_session.exec(statement).first()
video_block = await blocks.find_one({"block_id": file_id})
if video_block:
return Block(**video_block)
else:
if not block:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Video file does not exist"
status_code=status.HTTP_404_NOT_FOUND, detail="Video file does not exist"
)
return block