learnhouse/apps/api/src/routers/courses/assignments.py
2024-07-19 19:56:49 +02:00

407 lines
12 KiB
Python

from fastapi import APIRouter, Depends, Request, UploadFile
from src.db.courses.assignments import (
AssignmentCreate,
AssignmentRead,
AssignmentTaskCreate,
AssignmentTaskSubmissionCreate,
AssignmentTaskSubmissionUpdate,
AssignmentTaskUpdate,
AssignmentUpdate,
AssignmentUserSubmissionCreate,
)
from src.db.users import PublicUser
from src.core.events.database import get_db_session
from src.security.auth import get_current_user
from src.services.courses.activities.assignments import (
create_assignment,
create_assignment_submission,
create_assignment_task,
delete_assignment,
delete_assignment_from_activity_uuid,
delete_assignment_submission,
delete_assignment_task,
delete_assignment_task_submission,
handle_assignment_task_submission,
put_assignment_task_reference_file,
put_assignment_task_submission_file,
read_assignment,
read_assignment_from_activity_uuid,
read_assignment_submissions,
read_assignment_task,
read_assignment_task_submissions,
read_assignment_tasks,
read_user_assignment_submissions,
read_user_assignment_task_submissions,
read_user_assignment_task_submissions_me,
update_assignment,
update_assignment_submission,
update_assignment_task,
)
router = APIRouter()
## ASSIGNMENTS ##
@router.post("/")
async def api_create_assignments(
request: Request,
assignment_object: AssignmentCreate,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
) -> AssignmentRead:
"""
Create new activity
"""
return await create_assignment(request, assignment_object, current_user, db_session)
@router.get("/{assignment_uuid}")
async def api_read_assignment(
request: Request,
assignment_uuid: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
) -> AssignmentRead:
"""
Read an assignment
"""
return await read_assignment(request, assignment_uuid, current_user, db_session)
@router.get("/activity/{activity_uuid}")
async def api_read_assignment_from_activity(
request: Request,
activity_uuid: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
) -> AssignmentRead:
"""
Read an assignment
"""
return await read_assignment_from_activity_uuid(
request, activity_uuid, current_user, db_session
)
@router.put("/{assignment_uuid}")
async def api_update_assignment(
request: Request,
assignment_uuid: str,
assignment_object: AssignmentUpdate,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
) -> AssignmentRead:
"""
Update an assignment
"""
return await update_assignment(
request, assignment_uuid, assignment_object, current_user, db_session
)
@router.delete("/{assignment_uuid}")
async def api_delete_assignment(
request: Request,
assignment_uuid: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Delete an assignment
"""
return await delete_assignment(request, assignment_uuid, current_user, db_session)
@router.delete("/activity/{activity_uuid}")
async def api_delete_assignment_from_activity(
request: Request,
activity_uuid: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Delete an assignment
"""
return await delete_assignment_from_activity_uuid(
request, activity_uuid, current_user, db_session
)
## ASSIGNMENTS Tasks ##
@router.post("/{assignment_uuid}/tasks")
async def api_create_assignment_tasks(
request: Request,
assignment_uuid: str,
assignment_task_object: AssignmentTaskCreate,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Create new tasks for an assignment
"""
return await create_assignment_task(
request, assignment_uuid, assignment_task_object, current_user, db_session
)
@router.get("/{assignment_uuid}/tasks")
async def api_read_assignment_tasks(
request: Request,
assignment_uuid: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Read tasks for an assignment
"""
return await read_assignment_tasks(
request, assignment_uuid, current_user, db_session
)
@router.get("/task/{assignment_task_uuid}")
async def api_read_assignment_task(
request: Request,
assignment_task_uuid: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Read task for an assignment
"""
return await read_assignment_task(
request, assignment_task_uuid, current_user, db_session
)
@router.put("/{assignment_uuid}/tasks/{assignment_task_uuid}")
async def api_update_assignment_tasks(
request: Request,
assignment_task_uuid: str,
assignment_task_object: AssignmentTaskUpdate,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Update tasks for an assignment
"""
return await update_assignment_task(
request, assignment_task_uuid, assignment_task_object, current_user, db_session
)
@router.post("/{assignment_uuid}/tasks/{assignment_task_uuid}/ref_file")
async def api_put_assignment_task_ref_file(
request: Request,
assignment_task_uuid: str,
reference_file: UploadFile | None = None,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Update tasks for an assignment
"""
return await put_assignment_task_reference_file(
request, db_session, assignment_task_uuid, current_user, reference_file
)
@router.post("/{assignment_uuid}/tasks/{assignment_task_uuid}/sub_file")
async def api_put_assignment_task_sub_file(
request: Request,
assignment_task_uuid: str,
sub_file: UploadFile | None = None,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Update tasks for an assignment
"""
return await put_assignment_task_submission_file(
request, db_session, assignment_task_uuid, current_user, sub_file
)
@router.delete("/{assignment_uuid}/tasks/{assignment_task_uuid}")
async def api_delete_assignment_tasks(
request: Request,
assignment_task_uuid: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Delete tasks for an assignment
"""
return await delete_assignment_task(
request, assignment_task_uuid, current_user, db_session
)
## ASSIGNMENTS Tasks Submissions ##
@router.put("/{assignment_uuid}/tasks/{assignment_task_uuid}/submissions")
async def api_handle_assignment_task_submissions(
request: Request,
assignment_task_submission_object: AssignmentTaskSubmissionUpdate,
assignment_task_uuid: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Create new task submissions for an assignment
"""
return await handle_assignment_task_submission(
request,
assignment_task_uuid,
assignment_task_submission_object,
current_user,
db_session,
)
@router.get("/{assignment_uuid}/tasks/{assignment_task_uuid}/submissions/{user_id}")
async def api_read_user_assignment_task_submissions(
request: Request,
assignment_task_uuid: str,
user_id: int,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Read task submissions for an assignment from a user
"""
return await read_user_assignment_task_submissions(
request, assignment_task_uuid, user_id, current_user, db_session
)
@router.get("/{assignment_uuid}/tasks/{assignment_task_uuid}/submissions/user/me")
async def api_read_user_assignment_task_submissions_me(
request: Request,
assignment_task_uuid: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Read task submissions for an assignment from a user
"""
return await read_user_assignment_task_submissions_me(
request, assignment_task_uuid, current_user, db_session
)
@router.get("/{assignment_uuid}/tasks/{assignment_task_uuid}/submissions")
async def api_read_assignment_task_submissions(
request: Request,
assignment_task_uuid: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Read task submissions for an assignment from a user
"""
return await read_assignment_task_submissions(
request, assignment_task_uuid, current_user, db_session
)
@router.delete(
"/{assignment_uuid}/tasks/{assignment_task_uuid}/submissions/{assignment_task_submission_uuid}"
)
async def api_delete_assignment_task_submissions(
request: Request,
assignment_task_submission_uuid: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Delete task submissions for an assignment from a user
"""
return await delete_assignment_task_submission(
request, assignment_task_submission_uuid, current_user, db_session
)
## ASSIGNMENTS Submissions ##
@router.post("/{assignment_uuid}/submissions")
async def api_create_assignment_submissions(
request: Request,
assignment_uuid: str,
assignment_submission: AssignmentUserSubmissionCreate,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Create new submissions for an assignment
"""
return await create_assignment_submission(
request, assignment_uuid, assignment_submission, current_user, db_session
)
@router.get("/{assignment_uuid}/submissions")
async def api_read_assignment_submissions(
request: Request,
assignment_uuid: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Read submissions for an assignment
"""
return await read_assignment_submissions(
request, assignment_uuid, current_user, db_session
)
@router.get("/{assignment_uuid}/submissions/{user_id}")
async def api_read_user_assignment_submissions(
request: Request,
assignment_uuid: str,
user_id: int,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Read submissions for an assignment from a user
"""
return await read_user_assignment_submissions(
request, assignment_uuid, user_id, current_user, db_session
)
@router.put("/{assignment_uuid}/submissions/{user_id}")
async def api_update_user_assignment_submissions(
request: Request,
assignment_uuid: str,
user_id: str,
assignment_submission: AssignmentUserSubmissionCreate,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Update submissions for an assignment from a user
"""
return await update_assignment_submission(
request, user_id, assignment_submission, current_user, db_session
)
@router.delete("/{assignment_uuid}/submissions/{user_id}")
async def api_delete_user_assignment_submissions(
request: Request,
assignment_id: str,
user_id: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
"""
Delete submissions for an assignment from a user
"""
return await delete_assignment_submission(
request, assignment_id, user_id, current_user, db_session
)