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)
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)
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)
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)
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)
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)
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)
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)
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)
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 )
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)
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)
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)
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)