123 lines
4.2 KiB
Python
123 lines
4.2 KiB
Python
import json
|
|
|
|
import graphene
|
|
import structlog
|
|
from rest_framework.exceptions import PermissionDenied
|
|
from wagtail.models import Page
|
|
|
|
from vbv_lernwelt.assignment.graphql.types import AssignmentCompletionObjectType
|
|
from vbv_lernwelt.assignment.models import Assignment, AssignmentCompletionStatus
|
|
from vbv_lernwelt.assignment.services import update_assignment_completion
|
|
from vbv_lernwelt.core.models import User
|
|
from vbv_lernwelt.course.models import CourseSession, CourseSessionUser
|
|
from vbv_lernwelt.course.permissions import has_course_access, is_course_session_expert
|
|
|
|
logger = structlog.get_logger(__name__)
|
|
|
|
|
|
class AssignmentCompletionMutation(graphene.Mutation):
|
|
assignment_completion = graphene.Field(AssignmentCompletionObjectType)
|
|
|
|
class Arguments:
|
|
assignment_id = graphene.ID(required=True)
|
|
course_session_id = graphene.ID(required=True)
|
|
learning_content_page_id = graphene.ID()
|
|
assignment_user_id = graphene.ID()
|
|
|
|
completion_status = graphene.Argument(
|
|
graphene.Enum.from_enum(AssignmentCompletionStatus)
|
|
)
|
|
completion_data_string = graphene.String()
|
|
|
|
evaluation_grade = graphene.Float()
|
|
evaluation_points = graphene.Float()
|
|
|
|
@classmethod
|
|
def mutate(
|
|
cls,
|
|
root,
|
|
info,
|
|
assignment_id,
|
|
course_session_id,
|
|
learning_content_page_id=None,
|
|
assignment_user_id=None,
|
|
completion_status: AssignmentCompletionStatus = AssignmentCompletionStatus.IN_PROGRESS,
|
|
completion_data_string="{}",
|
|
evaluation_grade=None,
|
|
evaluation_points=None,
|
|
):
|
|
if assignment_user_id is None:
|
|
assignment_user_id = info.context.user.id
|
|
|
|
assignment_user = User.objects.get(id=assignment_user_id)
|
|
assignment = Assignment.objects.get(id=assignment_id)
|
|
|
|
if not has_course_access(
|
|
info.context.user,
|
|
assignment.get_course().id,
|
|
):
|
|
raise PermissionDenied()
|
|
|
|
course_session = CourseSession.objects.get(id=course_session_id)
|
|
|
|
learning_content_page = None
|
|
if learning_content_page_id:
|
|
learning_content_page = Page.objects.get(id=learning_content_page_id)
|
|
if learning_content_page is None:
|
|
learning_content_page = assignment.learningcontentassignment_set.first()
|
|
|
|
assignment_data = {
|
|
"assignment_user": assignment_user,
|
|
"assignment": assignment,
|
|
"course_session": course_session,
|
|
"completion_data": json.loads(completion_data_string),
|
|
"completion_status": completion_status,
|
|
"learning_content_page": learning_content_page,
|
|
}
|
|
|
|
if completion_status == AssignmentCompletionStatus.SUBMITTED:
|
|
# TODO: determine proper way to assign evaluation user
|
|
experts = CourseSessionUser.objects.filter(
|
|
course_session=course_session, role="EXPERT"
|
|
)
|
|
if not experts:
|
|
raise PermissionDenied()
|
|
assignment_data["evaluation_user"] = experts[0].user
|
|
|
|
evaluation_data = {}
|
|
|
|
if completion_status in (
|
|
AssignmentCompletionStatus.EVALUATION_SUBMITTED,
|
|
AssignmentCompletionStatus.EVALUATION_IN_PROGRESS,
|
|
):
|
|
if not is_course_session_expert(info.context.user, course_session_id):
|
|
raise PermissionDenied()
|
|
|
|
evaluation_data = {
|
|
"evaluation_user": info.context.user,
|
|
"evaluation_grade": evaluation_grade,
|
|
"evaluation_points": evaluation_points,
|
|
}
|
|
|
|
ac = update_assignment_completion(
|
|
copy_task_data=False,
|
|
**assignment_data,
|
|
**evaluation_data,
|
|
)
|
|
|
|
logger.debug(
|
|
"AssignmentCompletionMutation successful",
|
|
label="assignment_api",
|
|
assignment_id=assignment.id,
|
|
assignment_title=assignment.title,
|
|
assignment_user_id=assignment_user_id,
|
|
course_session_id=course_session_id,
|
|
completion_status=completion_status,
|
|
)
|
|
|
|
return AssignmentCompletionMutation(assignment_completion=ac)
|
|
|
|
|
|
class AssignmentMutation:
|
|
upsert_assignment_completion = AssignmentCompletionMutation.Field()
|