diff --git a/.gitignore b/.gitignore index d61c99ea..60e1bcdd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/src/routers/courses/courses.py b/src/routers/courses/courses.py index 450d63ad..32ad4238 100644 --- a/src/routers/courses/courses.py +++ b/src/routers/courses/courses.py @@ -9,7 +9,7 @@ router = APIRouter() @router.post("/") -async def api_create_course(org_id: str, name: str = Form(), mini_description: str = Form(), description: str = Form(), public: bool = Form(), current_user: PublicUser = Depends(get_current_user), thumbnail: UploadFile | None = None): +async def api_create_course(org_id: str, name: str = Form(), mini_description: str = Form(), description: str = Form(), public: bool = Form(), current_user: PublicUser = Depends(get_current_user), thumbnail: UploadFile | None = None): """ Create new Course """ diff --git a/src/routers/courses/elements.py b/src/routers/courses/elements.py index 6d2e3d99..32e6ae9d 100644 --- a/src/routers/courses/elements.py +++ b/src/routers/courses/elements.py @@ -1,6 +1,7 @@ from fastapi import APIRouter, Depends, UploadFile, Form -from src.services.courses.elements import * +from src.services.courses.elements.elements import * from src.dependencies.auth import get_current_user +from src.services.courses.elements.video import create_video_element router = APIRouter() @@ -20,6 +21,7 @@ async def api_get_element(element_id: str, current_user: PublicUser = Depends(ge """ return await get_element(element_id, current_user=current_user) + @router.get("/coursechapter/{coursechapter_id}") async def api_get_elements(coursechapter_id: str, current_user: PublicUser = Depends(get_current_user)): """ @@ -27,6 +29,7 @@ async def api_get_elements(coursechapter_id: str, current_user: PublicUser = Dep """ return await get_elements(coursechapter_id, current_user) + @router.put("/{element_id}") async def api_update_element(element_object: Element, element_id: str, current_user: PublicUser = Depends(get_current_user)): """ @@ -42,4 +45,12 @@ async def api_delete_element(element_id: str, current_user: PublicUser = Depends """ return await delete_element(element_id, current_user) +# Video Element + +@router.post("/video") +async def api_create_video_element(name: str = Form() , coursechapter_id: str = Form(), current_user: PublicUser = Depends(get_current_user), video_file: UploadFile | None = None): + """ + Create new Element + """ + return await create_video_element(name, coursechapter_id, current_user, video_file) diff --git a/src/services/courses/chapters.py b/src/services/courses/chapters.py index 11e1460f..824eb2ac 100644 --- a/src/services/courses/chapters.py +++ b/src/services/courses/chapters.py @@ -4,7 +4,7 @@ from typing import List from uuid import uuid4 from pydantic import BaseModel from src.services.courses.courses import Course, CourseInDB -from src.services.courses.elements import Element, ElementInDB +from src.services.courses.elements.elements import Element, ElementInDB from src.services.database import create_config_collection, check_database, create_database, learnhouseDB, learnhouseDB from src.services.security import verify_user_rights_with_roles from src.services.users import PublicUser diff --git a/src/services/courses/courses.py b/src/services/courses/courses.py index 15178904..5f44ddde 100644 --- a/src/services/courses/courses.py +++ b/src/services/courses/courses.py @@ -3,7 +3,7 @@ import os from typing import List from uuid import uuid4 from pydantic import BaseModel -from src.services.courses.elements import ElementInDB +from src.services.courses.elements.elements import ElementInDB from src.services.uploads import upload_thumbnail from src.services.users import PublicUser, User from src.services.database import create_config_collection, check_database, create_database, learnhouseDB diff --git a/src/services/courses/elements.py b/src/services/courses/elements/elements.py similarity index 100% rename from src/services/courses/elements.py rename to src/services/courses/elements/elements.py diff --git a/src/services/courses/elements/video.py b/src/services/courses/elements/video.py new file mode 100644 index 00000000..3c149408 --- /dev/null +++ b/src/services/courses/elements/video.py @@ -0,0 +1,55 @@ +from pydantic import BaseModel +from src.services.database import create_config_collection, check_database, create_database, learnhouseDB +from src.services.security import verify_user_rights_with_roles +from src.services.uploads import upload_video +from src.services.users import PublicUser, User +from src.services.courses.elements.elements import ElementInDB, Element +from fastapi import FastAPI, HTTPException, status, Request, Response, BackgroundTasks, UploadFile, File +from uuid import uuid4 +from datetime import datetime + + +async def create_video_element(name: str, coursechapter_id: str, current_user: PublicUser, video_file: UploadFile | None = None): + await check_database() + elements = learnhouseDB["elements"] + coursechapters = learnhouseDB["coursechapters"] + + # generate element_id + element_id = str(f"element_{uuid4()}") + + element_object = ElementInDB( + element_id=element_id, + coursechapter_id=coursechapter_id, + name=name, + type="video", + content={ + "video": { + "filename": video_file.filename, + "element_id": element_id, + } + }, + creationDate=str(datetime.now()), + updateDate=str(datetime.now()), + ) + + hasRoleRights = await verify_user_rights_with_roles("create", current_user.user_id, element_id) + + if not hasRoleRights: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, detail="Roles : Insufficient rights to perform this action") + + # create element + element = ElementInDB(**element_object.dict()) + elements.insert_one(element.dict()) + + # upload video + if video_file: + print("uploading video") + await upload_video(video_file, video_file.filename, element_id) + + # todo : choose whether to update the chapter or not + # update chapter + coursechapters.update_one({"coursechapter_id": coursechapter_id}, { + "$addToSet": {"elements": element_id}}) + + return element diff --git a/src/services/uploads.py b/src/services/uploads.py index 8ac027fa..243ad8d0 100644 --- a/src/services/uploads.py +++ b/src/services/uploads.py @@ -1,12 +1,33 @@ +import os + + async def upload_thumbnail(thumbnail_file, name_in_disk): - contents = thumbnail_file.file.read() - try: - with open(f"content/uploads/img/{name_in_disk}", 'wb') as f: - f.write(contents) - f.close() - - except Exception as e: - print(e) - return {"message": "There was an error uploading the file"} - finally: - thumbnail_file.file.close() \ No newline at end of file + contents = thumbnail_file.file.read() + try: + with open(f"content/uploads/img/{name_in_disk}", 'wb') as f: + f.write(contents) + f.close() + + except Exception as e: + print(e) + return {"message": "There was an error uploading the file"} + finally: + thumbnail_file.file.close() + + +async def upload_video(video_file, name_in_disk, element_id): + contents = video_file.file.read() + + # create folder + os.mkdir(f"content/uploads/video/{element_id}") + + try: + with open(f"content/uploads/video/{element_id}/{name_in_disk}", 'wb') as f: + f.write(contents) + f.close() + + except Exception as e: + print(e) + return {"message": "There was an error uploading the file"} + finally: + video_file.file.close()