def METHOD_NAME(self, request: Request, *args, **kwargs) -> Response:
    try:
        jsondata = json.loads(request.body)
    except ValueError:
        logger.error("LTI 1.3/scores: request body was not valid JSON")
        return Response('Not valid JSON', status=400)
    serializer = LTIScoresSerializer(data=jsondata)
    serializer.is_valid(raise_exception=True)
    data = serializer.validated_data
    exercise = get_object_or_404(LTI1p3Exercise, pk=kwargs['id'])
    try:
        user = User.objects.get(pk=int(data.get('userId')))
    except UserProfile.DoesNotExist:
        logger.error("LTI 1.3/scores: User (%s) does not exist", data.get('userId'))
        return Response('UserProfile does not exist', status=400)
    except ValueError:
        logger.error("LTI 1.3/scores: Invalid user ID: %s", data.get('userId'))
        return Response('Invalid user ID', status=400)
    logger.info("Received LTI 1.3 'scores' request for exercise %s, user %s", str(exercise), str(user))
    sub = Submission.objects.filter(exercise=exercise, submitters=user.userprofile)
    if sub.exists():
        # When points come from LTI, we assume there is only one submission per exercise per user,
        # that can be updated if LTI delivers larger points than previously.
        # If points are not larger than previously, we will just ignore the message.
        # Some LTI tools seem to send scores updates quite frequently.
        sub = sub.first()
        adjusted = (1.0 * exercise.max_points * data.get('scoreGiven') / data.get('scoreMaximum'))
        if sub.grade >= adjusted:
            return Response({}, status=200)
    else:
        sub = Submission.objects.create(exercise=exercise)
        sub.submitters.set([user.userprofile])
    sub.set_points(data.get('scoreGiven'), data.get('scoreMaximum'))
    if data.get('gradingProgress') == 'FullyGraded':
        sub.set_ready()
    sub.grading_time = data.get('timestamp')
    sub.save()
    # Note: Moodle appears to expect 200 as response.
    # 204 (as shown in LTI spec example) is not acceptable for Moodle.
    return Response({}, status=200)