Spaces:
Build error
Build error
| from locale import currency | |
| from typing import Any, List | |
| from hashlib import sha1 | |
| import os | |
| import shutil | |
| from fastapi import APIRouter, Depends, UploadFile, File | |
| from sqlalchemy.orm import Session | |
| from core.config import settings | |
| from models import User | |
| import aiofiles | |
| from utils import deps | |
| from cruds import crud_assignment, crud_group, crud_assignment_upload | |
| from schemas import Assignment, AssignmentUpdate, AssignmentCreate | |
| router = APIRouter() | |
| ASSIGNMENT_ROUTE: str = "assignments" | |
| async def get_assignment( | |
| db: Session = Depends(deps.get_db), | |
| skip: int = 0, | |
| limit: int = -1, | |
| current_user: User = Depends(deps.get_current_active_user), | |
| ) -> Any: | |
| if current_user.user_type == settings.UserType.STUDENT.value: | |
| group = crud_group.get(db, id=current_user.group_id) | |
| assignment = crud_assignment.get_quiz_by_group_id(db=db, group=group) | |
| index = 0 | |
| for assig in assignment: | |
| assignmentUpload = crud_assignment_upload.get_by_assignment_id( | |
| db=db, | |
| assignmentId=assig.id, | |
| studentId=current_user.id, | |
| ) | |
| if assignmentUpload: | |
| assignment[index].exists = True | |
| else: | |
| assignment[index].exists = False | |
| index += 1 | |
| return assignment | |
| if current_user.user_type == settings.UserType.TEACHER.value: | |
| return crud_assignment.get_quiz_by_instructor_id(db=db, user=current_user) | |
| if current_user.user_type <= settings.UserType.ADMIN.value: | |
| return crud_assignment.get_multi(db, skip=skip, limit=limit) | |
| async def create_assignment( | |
| db: Session = Depends(deps.get_db), | |
| *, | |
| obj_in: AssignmentCreate, | |
| current_user: User = Depends(deps.get_current_active_user), | |
| ) -> Any: | |
| if obj_in.instructor: | |
| if current_user.id not in obj_in.instructor: | |
| obj_in.instructor.append(current_user.id) | |
| else: | |
| obj_in.instructor = [current_user.id] | |
| assignment = crud_assignment.create(db, obj_in=obj_in) | |
| return assignment | |
| async def post_files( | |
| db: Session = Depends(deps.get_db), | |
| files: List[UploadFile] = File(...), | |
| current_user=Depends(deps.get_current_active_teacher_or_above), | |
| *, | |
| id: int, | |
| ): | |
| assignment = crud_assignment.get(db=db, id=id) | |
| hashedAssignmentId = sha1(str(id).encode(encoding="UTF-8", errors="strict")) | |
| FILE_ASSIGNMENT_PATH = os.path.join( | |
| ASSIGNMENT_ROUTE, | |
| hashedAssignmentId.hexdigest(), | |
| ) | |
| FILE_PATH = os.path.join( | |
| settings.UPLOAD_DIR_ROOT, | |
| FILE_ASSIGNMENT_PATH, | |
| ) | |
| if not os.path.exists(FILE_PATH): | |
| os.makedirs(FILE_PATH) | |
| if assignment.files: | |
| assignmentFiles = assignment.files.copy() | |
| fileIndex = len(assignment.files) | |
| else: | |
| assignmentFiles = [] | |
| fileIndex = 0 | |
| for file in files: | |
| fileName, fileExtension = os.path.splitext(file.filename) | |
| hashedFileName = sha1( | |
| (fileName + str(fileIndex)).encode(encoding="UTF-8", errors="strict") | |
| ) | |
| fileIndex = fileIndex + 1 | |
| filename = f"{FILE_PATH}/{hashedFileName.hexdigest()}{fileExtension}" | |
| async with aiofiles.open(filename, mode="wb") as f: | |
| content = await file.read() | |
| await f.write(content) | |
| assignmentFiles.append( | |
| { | |
| "path": f"{FILE_ASSIGNMENT_PATH}/{hashedFileName.hexdigest()}{fileExtension}", | |
| "name": file.filename, | |
| } | |
| ) | |
| obj_in = AssignmentUpdate(files=assignmentFiles) | |
| updated = crud_assignment.update(db=db, db_obj=assignment, obj_in=obj_in) | |
| return updated | |
| async def get_specific_assignment( | |
| db: Session = Depends(deps.get_db), | |
| current_user: User = Depends(deps.get_current_active_user), | |
| *, | |
| id: int, | |
| ) -> Any: | |
| assignments = await get_assignment(db=db, current_user=current_user) | |
| if assignments: | |
| for assignment in assignments: | |
| if assignment.id == id: | |
| return assignment | |
| async def delete_assignment( | |
| db: Session = Depends(deps.get_db), | |
| current_user: User = Depends(deps.get_current_active_teacher_or_above), | |
| *, | |
| id: int, | |
| ) -> Any: | |
| assignment = await get_specific_assignment(db=db, current_user=current_user, id=id) | |
| if not assignment: | |
| return {"msg": "assignment not found"} | |
| deleted = crud_assignment.remove(db=db, id=assignment.id) | |
| if deleted: | |
| hashedAssignmentId = sha1( | |
| str(assignment.id).encode(encoding="UTF-8", errors="strict") | |
| ) | |
| FILE_ASSIGNMENT_PATH = os.path.join( | |
| ASSIGNMENT_ROUTE, | |
| hashedAssignmentId.hexdigest(), | |
| ) | |
| FILE_PATH = os.path.join( | |
| settings.UPLOAD_DIR_ROOT, | |
| FILE_ASSIGNMENT_PATH, | |
| ) | |
| if os.path.exists(FILE_PATH): | |
| shutil.rmtree(FILE_PATH) | |
| return {"msg": "delete success"} | |
| async def update_assignment( | |
| db: Session = Depends(deps.get_db), *, id: int, obj_in: AssignmentUpdate | |
| ) -> Any: | |
| assignment = crud_assignment.get(db, id) | |
| assignment = crud_assignment.update(db, db_obj=assignment, obj_in=obj_in) | |
| return assignment | |