Esempio n. 1
0
def poll_status(request):
    """
    Get statuses for list of exams

    Request example:

    ```
    {"list":["code1","code2"]}
    ```
    """
    data = request.data
    if u'list' in data:
        response = poll_status_request(data['list'])
        for val in response:
            exam = get_object_or_404(Exam.objects.by_user_perms(request.user),
                                     exam_code=val['attempt_code'])
            new_status = val['status']
            if (exam.attempt_status == 'ready_to_start'
                    and new_status == 'started'):
                exam.actual_start_date = datetime.now()
            if (exam.attempt_status == 'started'
                    and new_status == 'submitted')\
                or (exam.attempt_status == 'ready_to_submit'
                    and new_status == 'submitted'):
                exam.actual_end_date = datetime.now()
            exam.attempt_status = new_status
            exam.save()
            data = {'hash': exam.generate_key(), 'status': exam.attempt_status}
            send_ws_msg(data, channel=exam.event.hash_key)
        return Response(status=status.HTTP_200_OK)
    else:
        return Response(status=status.HTTP_400_BAD_REQUEST)
Esempio n. 2
0
def bulk_start_exams(request):
    """
    Start list of exams by exam codes.

    :param request:
    :param exam_codes: comaseparated list of exam codes
    :return:
    """

    exam_codes = request.data.get('list', [])
    # exam_list = Exam.objects.by_user_perms(request.user).filter(
    #     exam_code__in=exam_codes)
    exam_list = Exam.objects.filter(exam_code__in=exam_codes)
    items = bulk_start_exams_request(exam_list)
    for exam in items:
        exam.exam_status = exam.STARTED
        exam.proctor = request.user
        exam.save()
        data = {
            'hash': exam.generate_key(),
            'proctor': exam.proctor.username,
            'status': "OK"
        }
        send_ws_msg(data, channel=exam.event.hash_key)
    Journaling.objects.create(
        type=Journaling.BULK_EXAM_STATUS_CHANGE,
        note="%s. %s -> %s" % (exam_codes, Exam.NEW, Exam.STARTED),
        proctor=request.user,
    )
    return Response(status=status.HTTP_200_OK)
Esempio n. 3
0
    def partial_update(self, request, *args, **kwargs):

        instance = self.get_object()
        fields_for_update = ['status', 'notify', 'comment']
        data = {}

        for field in fields_for_update:
            data[field] = request.data.get(field)
        change_end_date = instance.status == EventSession.IN_PROGRESS and \
                          data.get('status') == EventSession.ARCHIVED
        if instance.status != data.get('status'):
            Journaling.objects.create(
                type=Journaling.EVENT_SESSION_STATUS_CHANGE,
                event=instance,
                proctor=request.user,
                note=instance.status + " -> " + data.get('status'))
        serializer = self.get_serializer(instance, data=data, partial=True)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        if change_end_date:
            event_session = ArchivedEventSession.objects.get(pk=instance.pk)
            event_session.end_date = datetime.now()
            event_session.save()
            serializer = self.get_serializer(event_session)
            ws_data = {'end_session': change_end_date}
            send_ws_msg(ws_data, channel=instance.hash_key)

        return Response(serializer.data)
Esempio n. 4
0
def stop_exam(request, attempt_code):
    """
    Endpoint for exam stops. Attempt code sends in url.
    POST parameters:
        {
            'hash': "hash_key",
            'status': "submitted"
        }

    :param request:
    :param attempt_code:
    :return:
    """
    exam = get_object_or_404(
        Exam.objects.by_user_perms(request.user),
        exam_code=attempt_code
    )
    action = request.data.get('action')
    user_id = request.data.get('user_id')
    if action and user_id:
        response, current_status = _stop_attempt(attempt_code, action, user_id)
        data = {
            'hash': exam.generate_key(),
            'status': current_status
        }
        send_ws_msg(data, channel=exam.event.hash_key)
        return Response(status=response.status_code, data=data)
    else:
        return Response(status=status.HTTP_400_BAD_REQUEST)
Esempio n. 5
0
def stop_exams(request):
    attempts = request.data.get('attempts')
    if isinstance(attempts, basestring):
        attempts = json.loads(attempts)
    if attempts:
        status_list = []
        for attempt in attempts:
            exam = get_object_or_404(Exam.objects.by_user_perms(request.user),
                                     exam_code=attempt['attempt_code'])
            user_id = attempt.get('user_id')
            action = attempt.get('action')
            if action and user_id:
                response, current_status = _stop_attempt(
                    attempt['attempt_code'], action, user_id)
                if response.status_code != 200:
                    status_list.append(response.status_code)
                else:
                    data = {
                        'hash': exam.generate_key(),
                        'status': current_status
                    }
                    send_ws_msg(data, channel=exam.event.hash_key)
            else:
                return Response(status=status.HTTP_400_BAD_REQUEST)
        if status_list:
            return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        return Response(status=status.HTTP_200_OK)
    else:
        return Response(status=status.HTTP_400_BAD_REQUEST)
Esempio n. 6
0
def bulk_start_exams(request):
    """
    Start list of exams by exam codes.

    :param request:
    :param exam_codes: comaseparated list of exam codes
    :return:
    """

    exam_codes = request.data.get('list', [])
    # exam_list = Exam.objects.by_user_perms(request.user).filter(
    #     exam_code__in=exam_codes)
    exam_list = Exam.objects.filter(exam_code__in=exam_codes)
    items = bulk_start_exams_request(exam_list)
    for exam in items:
        exam.exam_status = exam.STARTED
        exam.proctor = request.user
        exam.save()
        data = {
            'hash': exam.generate_key(),
            'proctor': exam.proctor.username,
            'status': "OK"
        }
        send_ws_msg(data, channel=exam.event.hash_key)
    Journaling.objects.create(
        type=Journaling.BULK_EXAM_STATUS_CHANGE,
        note="%s. %s -> %s" % (exam_codes, Exam.NEW, Exam.STARTED),
        proctor=request.user,
    )
    return Response(status=status.HTTP_200_OK)
Esempio n. 7
0
    def create(self, request, *args, **kwargs):
        comment = request.data.get('comment')
        exam = get_object_or_404(
            Exam.objects.by_user_perms(request.user),
            exam_code=request.data.get('examCode')
        )
        Comment.objects.create(
            comment=comment.get('comments'),
            event_status=comment.get('eventStatus'),
            event_start=comment.get('eventStart'),
            event_finish=comment.get('eventFinish'),
            duration=comment.get('duration'),
            exam=exam
        )

        ws_data = {
            'hash': exam.generate_key(),
            'proctor': exam.proctor.username,
            'comments': {
                'comment': comment.get('comments'),
                'timestamp': comment.get('eventStart'),
                'status': comment.get('eventStatus')
            }
        }
        send_ws_msg(ws_data, channel=exam.event.hash_key)

        return Response(status=status.HTTP_201_CREATED)
Esempio n. 8
0
def start_exam(request, attempt_code):
    exam = get_object_or_404(
        Exam.objects.by_user_perms(request.user),
        exam_code=attempt_code
    )
    response = start_exam_request(exam.exam_code)
    if response.status_code == 200:
        exam.exam_status = exam.STARTED
        exam.proctor = request.user
        exam.attempt_status = "OK"
        exam.save()
        Journaling.objects.create(
            type=Journaling.EXAM_STATUS_CHANGE,
            event=exam.event,
            exam=exam,
            proctor=request.user,
            note="%s -> %s" % (exam.NEW, exam.STARTED)
        )
        data = {
            'hash': exam.generate_key(),
            'proctor': exam.proctor.username,
            'status': "OK"
        }
        send_ws_msg(data, channel=exam.event.hash_key)
    else:
        data = {'error': 'Edx response error. See logs'}
    return Response(data=data, status=response.status_code)
Esempio n. 9
0
    def partial_update(self, request, *args, **kwargs):

        instance = self.get_object()
        fields_for_update = ['status', 'notify', 'comment']
        data = {}

        for field in fields_for_update:
            data[field] = request.data.get(field)
        change_end_date = instance.status == EventSession.IN_PROGRESS and \
                          data.get('status') == EventSession.ARCHIVED
        if instance.status != data.get('status'):
            Journaling.objects.create(
                type=Journaling.EVENT_SESSION_STATUS_CHANGE,
                event=instance,
                proctor=request.user,
                note=instance.status + " -> " + data.get('status')
            )
        serializer = self.get_serializer(instance, data=data,
                                         partial=True)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        if change_end_date:
            event_session = ArchivedEventSession.objects.get(pk=instance.pk)
            event_session.end_date = datetime.now()
            event_session.save()
            serializer = self.get_serializer(event_session)
            ws_data = {
                'end_session': change_end_date
            }
            send_ws_msg(ws_data, channel=instance.hash_key)

        return Response(serializer.data)
Esempio n. 10
0
def stop_exams(request):
    attempts = request.data.get('attempts')
    if isinstance(attempts, basestring):
        attempts = json.loads(attempts)
    if attempts:
        status_list = []
        for attempt in attempts:
            exam = get_object_or_404(
                Exam.objects.by_user_perms(request.user),
                exam_code=attempt['attempt_code']
            )
            user_id = attempt.get('user_id')
            action = attempt.get('action')
            if action and user_id:
                response, current_status = _stop_attempt(
                    attempt['attempt_code'], action, user_id
                )
                if response.status_code != 200:
                    status_list.append(response.status_code)
                else:
                    data = {
                        'hash': exam.generate_key(),
                        'status': current_status
                    }
                    send_ws_msg(data, channel=exam.event.hash_key)
            else:
                return Response(status=status.HTTP_400_BAD_REQUEST)
        if status_list:
            return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        return Response(status=status.HTTP_200_OK)
    else:
        return Response(status=status.HTTP_400_BAD_REQUEST)
Esempio n. 11
0
 def create(self, request, *args, **kwargs):
     data = request.data
     serializer = self.get_serializer(data=data)
     serializer.is_valid(raise_exception=True)
     event = InProgressEventSession.objects.filter(
         course_id=serializer.validated_data.get('course_id'),
         course_event_id=serializer.validated_data.get('exam_id'),
     ).order_by('-start_date')
     if not event:
         return _send_journaling_response(
             request=request,
             data=data,
             result={'error': _("No event was found. Forbidden")},
             status_code=status.HTTP_403_FORBIDDEN
         )
     event = event[0]
     self.perform_create(serializer)
     data['hash'] = serializer.instance.generate_key()
     data['status'] = 'created'
     send_ws_msg(data, channel=event.hash_key)
     headers = self.get_success_headers(serializer.data)
     serializer.instance.event = event
     serializer.instance.save()
     Journaling.objects.create(
         type=Journaling.EXAM_ATTEMPT,
         event=event,
         exam=serializer.instance,
     )
     return _send_journaling_response(
         request=request,
         data=data,
         result={'ID': data['hash']},
         status_code=status.HTTP_201_CREATED,
         headers=headers
     )
Esempio n. 12
0
    def create(self, request, *args, **kwargs):
        comment = request.data.get('comment')
        exam = get_object_or_404(Exam.objects.by_user_perms(request.user),
                                 exam_code=request.data.get('examCode'))
        Comment.objects.create(comment=comment.get('comments'),
                               event_status=comment.get('eventStatus'),
                               event_start=comment.get('eventStart'),
                               event_finish=comment.get('eventFinish'),
                               duration=comment.get('duration'),
                               exam=exam)

        ws_data = {
            'hash': exam.generate_key(),
            'proctor': exam.proctor.username,
            'comments': {
                'comment': comment.get('comments'),
                'timestamp': comment.get('eventStart'),
                'status': comment.get('eventStatus')
            }
        }
        send_ws_msg(ws_data, channel=exam.event.hash_key)

        return Response(status=status.HTTP_201_CREATED)
Esempio n. 13
0
def start_exam(request, attempt_code):
    exam = get_object_or_404(Exam.objects.by_user_perms(request.user),
                             exam_code=attempt_code)
    response = start_exam_request(exam.exam_code)
    if response.status_code == 200:
        exam.exam_status = exam.STARTED
        exam.proctor = request.user
        exam.attempt_status = "OK"
        exam.save()
        Journaling.objects.create(type=Journaling.EXAM_STATUS_CHANGE,
                                  event=exam.event,
                                  exam=exam,
                                  proctor=request.user,
                                  note="%s -> %s" % (exam.NEW, exam.STARTED))
        data = {
            'hash': exam.generate_key(),
            'proctor': exam.proctor.username,
            'status': "OK"
        }
        send_ws_msg(data, channel=exam.event.hash_key)
    else:
        data = {'error': 'Edx response error. See logs'}
    return Response(data=data, status=response.status_code)
Esempio n. 14
0
def poll_status(request):
    """
    Get statuses for list of exams

    Request example:

    ```
    {"list":["code1","code2"]}
    ```
    """
    data = request.data
    if u'list' in data:
        response = poll_status_request(data['list'])
        for val in response:
            exam = get_object_or_404(
                Exam.objects.by_user_perms(request.user),
                exam_code=val['attempt_code']
            )
            new_status = val['status']
            if (exam.attempt_status == 'ready_to_start'
                    and new_status == 'started'):
                exam.actual_start_date = datetime.now()
            if (exam.attempt_status == 'started'
                    and new_status == 'submitted')\
                or (exam.attempt_status == 'ready_to_submit'
                    and new_status == 'submitted'):
                exam.actual_end_date = datetime.now()
            exam.attempt_status = new_status
            exam.save()
            data = {
                'hash': exam.generate_key(),
                'status': exam.attempt_status
            }
            send_ws_msg(data, channel=exam.event.hash_key)
        return Response(status=status.HTTP_200_OK)
    else:
        return Response(status=status.HTTP_400_BAD_REQUEST)
Esempio n. 15
0
def stop_exam(request, attempt_code):
    """
    Endpoint for exam stops. Attempt code sends in url.
    POST parameters:
        {
            'hash': "hash_key",
            'status': "submitted"
        }

    :param request:
    :param attempt_code:
    :return:
    """
    exam = get_object_or_404(Exam.objects.by_user_perms(request.user),
                             exam_code=attempt_code)
    action = request.data.get('action')
    user_id = request.data.get('user_id')
    if action and user_id:
        response, current_status = _stop_attempt(attempt_code, action, user_id)
        data = {'hash': exam.generate_key(), 'status': current_status}
        send_ws_msg(data, channel=exam.event.hash_key)
        return Response(status=response.status_code, data=data)
    else:
        return Response(status=status.HTTP_400_BAD_REQUEST)