import structlog from rest_framework.decorators import api_view from rest_framework.exceptions import PermissionDenied from rest_framework.response import Response from vbv_lernwelt.assignment.models import AssignmentCompletion from vbv_lernwelt.iam.permissions import can_evaluate_assignments logger = structlog.get_logger(__name__) @api_view(["GET", "POST"]) def request_assignment_completion_status(request, assignment_id, course_session_id): # TODO quickfix before GraphQL... user_selection_ids = request.data.get("user_selection_ids", []) if can_evaluate_assignments( request.user, course_session_id, assignment_user_ids=user_selection_ids ): qs = AssignmentCompletion.objects.filter( course_session_id=course_session_id, assignment_id=assignment_id, ) if len(user_selection_ids) > 0: qs = qs.filter(assignment_user_id__in=user_selection_ids) values = qs.values( "id", "assignment_user_id", "completion_status", "evaluation_points", "evaluation_points_deducted", "evaluation_max_points", "evaluation_passed", "learning_content_page_id", ) # Convert the learning_content_page_id to a string data = list(values) # Evaluate the queryset for item in data: if item["evaluation_points"] is not None: # only `evaluation_points_final` is relevant for the frontend item["evaluation_points_final"] = ( item["evaluation_points"] - item["evaluation_points_deducted"] ) else: item["evaluation_points_final"] = None item["learning_content_page_id"] = str(item["learning_content_page_id"]) return Response(status=200, data=data) raise PermissionDenied()