parent
af4801a27a
commit
0911317808
@ -1,83 +1,56 @@ |
|||||||
from flask import Blueprint, request, jsonify |
from flask import Blueprint, request, jsonify, g |
||||||
from werkzeug.utils import secure_filename |
from werkzeug.datastructures import MultiDict |
||||||
from sqlalchemy.sql import func |
|
||||||
import os |
import os |
||||||
import uuid |
import uuid |
||||||
from db.model import db, Course, Category, User |
from config import DEFAULT_COURSE_COVER |
||||||
|
from db.model import db, Course, Category, User, Chat |
||||||
from utils.utils import random_string_generator |
from utils.utils import random_string_generator |
||||||
|
from utils.auth import auth_required, requires_role |
||||||
from constants import * |
from constants import * |
||||||
from config import * |
from config import * |
||||||
|
from constants import PublishedStatus |
||||||
|
|
||||||
course = Blueprint('course', __name__) |
course = Blueprint('course', __name__) |
||||||
|
|
||||||
@course.route('/create/course', methods=['POST']) |
@course.route('/create', methods=['POST']) |
||||||
|
@auth_required() |
||||||
def create_course(): |
def create_course(): |
||||||
""" |
form_data: dict = request.form |
||||||
Endpoint to create a new course. |
course_uploaded_cover_image: MultiDict|None = request.files.get('cover_image', None) |
||||||
Ensures strict adherence to the Course model, with file handling and default behaviors. |
course_uploaded_pdf: MultiDict|None = request.files.get('course_pdf', None) |
||||||
""" |
|
||||||
|
cover_file_name: str = DEFAULT_COURSE_COVER |
||||||
|
pdf_file_name: str = '' |
||||||
|
if course_uploaded_cover_image is not None: |
||||||
|
cover_file_name: str = random_string_generator(32)+course_uploaded_cover_image.filename.split('.')[-1] |
||||||
|
course_uploaded_cover_image.save(os.path.join(USER_UPLOADS_DIR, cover_file_name)) |
||||||
|
if course_uploaded_pdf is not None: |
||||||
|
pdf_file_name: str = random_string_generator(32) + course_uploaded_pdf.filename.split('.')[-1] |
||||||
|
course_uploaded_pdf.save(os.path.join(USER_UPLOADS_DIR, pdf_file_name)) |
||||||
|
published_status: PublishedStatus = PublishedStatus.DRAFT |
||||||
try: |
try: |
||||||
# Retrieve form data |
course_name: str = form_data['course_name'] |
||||||
data = request.form |
except KeyError: |
||||||
name :str= data.get('name', '').strip() |
return jsonify({'message': 'Course name cannot be empty'}), 401 |
||||||
category_id :str = data.get('category_id', '').strip() |
|
||||||
description :str= data.get('description', '') |
course_description: str = form_data.get('course_name', '') |
||||||
is_active :bool = bool(int(data.get('is_active', 0))) |
category_id: uuid.UUID = uuid.UUID(form_data['category_uuid']) |
||||||
published_status :int = data.get('published_status', int(PublishedStatus.DRAFT.value)) # Defaults to DRAFT |
pages_required_for_community: int = int(form_data['community_unlock_at_pages']) # TODO: Add this field to model |
||||||
author_id :str = data.get('author_id', '').strip() |
|
||||||
|
new_course: Course = Course( |
||||||
# Validate required fields |
name=course_name, |
||||||
if not name or not category_id or not author_id: |
categoryID=category_id, |
||||||
return jsonify({"error": "Missing required fields: 'name', 'category_id', or 'author_id'."}), 400 |
authorID=g.current_user.id, |
||||||
|
description=course_description, |
||||||
# Validate category existence |
isActive=True, |
||||||
category :str= Category.query.get(category_id) |
|
||||||
if not category: |
|
||||||
return jsonify({"error": "Category not found."}), 404 |
|
||||||
|
|
||||||
# Validate author existence |
|
||||||
author :str = User.query.get(author_id) |
|
||||||
if not author: |
|
||||||
return jsonify({"error": "Author not found."}), 404 |
|
||||||
|
|
||||||
# File handling |
|
||||||
uploaded_cover_image = request.files.get('cover') |
|
||||||
uploaded_file = request.files.get('pdf') |
|
||||||
|
|
||||||
cover_filename_image :str= '' |
|
||||||
pdf_file_filename :str= '' |
|
||||||
if uploaded_cover_image is not None: |
|
||||||
cover_filename_image :str = random_string_generator(10) + os.path.splitext(uploaded_cover_image.filename)[-1] |
|
||||||
uploaded_cover_image.save(os.path.join(USER_UPLOADS_DIR, cover_filename_image)) |
|
||||||
|
|
||||||
if uploaded_file is not None: |
|
||||||
pdf_file_filename :str= random_string_generator(10) + os.path.splitext(uploaded_file.filename)[-1] |
|
||||||
uploaded_file.save( os.path.join(USER_UPLOADS_DIR, pdf_file_filename)) |
|
||||||
|
|
||||||
# Default to DRAFT if critical content is missing |
|
||||||
if not uploaded_cover_image or not uploaded_file: |
|
||||||
published_status :int= int(PublishedStatus.DRAFT.value) |
|
||||||
|
|
||||||
# Create new course |
|
||||||
new_course = Course( |
|
||||||
name=name, |
|
||||||
categoryID=uuid.UUID(category_id), |
|
||||||
description=description, |
|
||||||
isActive=is_active, |
|
||||||
publishedStatus=int(published_status), |
publishedStatus=int(published_status), |
||||||
coverImage=cover_filename_image, |
coverImage=cover_file_name, |
||||||
serverFilename=pdf_file_filename, |
serverFilename =pdf_file_name, |
||||||
authorID=uuid.UUID(author_id), |
enrollments=[], |
||||||
creationDate=func.now(), |
quizzes=[], |
||||||
|
chats=[] |
||||||
) |
) |
||||||
|
# chat: Chat = Chat(courseID=new_course.id) TODO: Add a welcome chat for this course |
||||||
# Save the course to the database |
db.session.add_all(new_course) |
||||||
db.session.add(new_course) |
|
||||||
db.session.commit() |
db.session.commit() |
||||||
|
return jsonify({'message': 'Course was created successfully.'}), 200 |
||||||
return jsonify({"message": "Course created successfully.", "course_id": str(new_course.id)}), 201 |
|
||||||
|
|
||||||
except Exception as e: |
|
||||||
# Rollback in case of an error |
|
||||||
db.session.rollback() |
|
||||||
return jsonify({"error": f"An error occurred: {str(e)}"}), 500 |
|
Loading…
Reference in new issue