def post(self, request): """ HTTP POST handler. To create an exam attempt. """ start_immediately = request.data.get('start_clock', 'false').lower() == 'true' exam_id = request.data.get('exam_id', None) attempt_proctored = request.data.get('attempt_proctored', 'false').lower() == 'true' try: exam_attempt_id = create_exam_attempt( exam_id=exam_id, user_id=request.user.id, taking_as_proctored=attempt_proctored) exam = get_exam_by_id(exam_id) # if use elected not to take as proctored exam, then # use must take as open book, and loose credit eligibility if exam['is_proctored'] and not attempt_proctored: update_attempt_status( exam_id, request.user.id, ProctoredExamStudentAttemptStatus.declined) elif start_immediately: start_exam_attempt(exam_id, request.user.id) return Response({'exam_attempt_id': exam_attempt_id}) except ProctoredBaseException, ex: LOG.exception(ex) return Response(status=status.HTTP_400_BAD_REQUEST, data={"detail": unicode(ex)})
def post(self, request): """ HTTP POST handler. To create an exam attempt. """ start_immediately = request.DATA.get('start_clock', 'false').lower() == 'true' exam_id = request.DATA.get('exam_id', None) attempt_proctored = request.DATA.get('attempt_proctored', 'false').lower() == 'true' try: exam_attempt_id = create_exam_attempt( exam_id=exam_id, user_id=request.user.id, taking_as_proctored=attempt_proctored ) exam = get_exam_by_id(exam_id) # if use elected not to take as proctored exam, then # use must take as open book, and loose credit eligibility if exam['is_proctored'] and not attempt_proctored: update_attempt_status( exam_id, request.user.id, ProctoredExamStudentAttemptStatus.declined ) elif start_immediately: start_exam_attempt(exam_id, request.user.id) return Response({'exam_attempt_id': exam_attempt_id}) except ProctoredBaseException, ex: LOG.exception(ex) return Response( status=status.HTTP_400_BAD_REQUEST, data={"detail": unicode(ex)} )
def post(self, request): """ HTTP POST handler. To create an exam attempt. """ start_immediately = request.data.get('start_clock', 'false').lower() == 'true' exam_id = request.data.get('exam_id', None) attempt_proctored = request.data.get('attempt_proctored', 'false').lower() == 'true' exam = get_exam_by_id(exam_id) # Bypassing the due date check for practice exam # because student can attempt the practice after the due date if not exam.get("is_practice_exam") and is_exam_passed_due(exam, request.user): raise ProctoredExamPermissionDenied( u'Attempted to access expired exam with exam_id {exam_id}'.format(exam_id=exam_id) ) exam_attempt_id = create_exam_attempt( exam_id=exam_id, user_id=request.user.id, taking_as_proctored=attempt_proctored ) # if use elected not to take as proctored exam, then # use must take as open book, and loose credit eligibility if exam['is_proctored'] and not attempt_proctored: update_attempt_status( exam_id, request.user.id, ProctoredExamStudentAttemptStatus.declined ) elif start_immediately: start_exam_attempt(exam_id, request.user.id) data = {'exam_attempt_id': exam_attempt_id} return Response(data)
def post(self, request): """ HTTP POST handler. To create an exam attempt. """ start_immediately = request.data.get('start_clock', 'false').lower() == 'true' exam_id = request.data.get('exam_id', None) attempt_proctored = request.data.get('attempt_proctored', 'false').lower() == 'true' exam = get_exam_by_id(exam_id) # Bypassing the due date check for practice exam # because student can attempt the practice after the due date if not exam.get("is_practice_exam") and is_exam_passed_due(exam, request.user): raise ProctoredExamPermissionDenied( 'Attempted to access expired exam with exam_id {exam_id}'.format(exam_id=exam_id) ) exam_attempt_id = create_exam_attempt( exam_id=exam_id, user_id=request.user.id, taking_as_proctored=attempt_proctored ) # if use elected not to take as proctored exam, then # use must take as open book, and loose credit eligibility if exam['is_proctored'] and not attempt_proctored: update_attempt_status( exam_id, request.user.id, ProctoredExamStudentAttemptStatus.declined ) elif start_immediately: start_exam_attempt(exam_id, request.user.id) data = {'exam_attempt_id': exam_attempt_id} return Response(data)
def put(self, request, attempt_id): """ HTTP POST handler. To stop an exam. """ attempt = get_exam_attempt_by_id(attempt_id) if not attempt: err_msg = (u'Attempted to access attempt_id {attempt_id} but ' u'it does not exist.'.format(attempt_id=attempt_id)) raise StudentExamAttemptDoesNotExistsException(err_msg) # make sure the the attempt belongs to the calling user_id if attempt['user']['id'] != request.user.id: err_msg = (u'Attempted to access attempt_id {attempt_id} but ' u'does not have access to it.'.format( attempt_id=attempt_id)) raise ProctoredExamPermissionDenied(err_msg) action = request.data.get('action') if action == 'stop': exam_attempt_id = stop_exam_attempt( exam_id=attempt['proctored_exam']['id'], user_id=request.user.id) elif action == 'start': exam_attempt_id = start_exam_attempt( exam_id=attempt['proctored_exam']['id'], user_id=request.user.id) elif action == 'submit': exam_attempt_id = update_attempt_status( attempt['proctored_exam']['id'], request.user.id, ProctoredExamStudentAttemptStatus.submitted) elif action == 'click_download_software': exam_attempt_id = update_attempt_status( attempt['proctored_exam']['id'], request.user.id, ProctoredExamStudentAttemptStatus.download_software_clicked) elif action == 'error': backend = attempt['proctored_exam']['backend'] waffle_name = PING_FAILURE_PASSTHROUGH_TEMPLATE.format(backend) should_block_user = not ( backend and waffle.switch_is_active(waffle_name)) and ( not attempt['status'] == ProctoredExamStudentAttemptStatus.submitted) if should_block_user: exam_attempt_id = update_attempt_status( attempt['proctored_exam']['id'], request.user.id, ProctoredExamStudentAttemptStatus.error) else: exam_attempt_id = False LOG.warning( u'Browser JS reported problem with proctoring desktop ' u'application. Did block user: %s, for attempt: %s', should_block_user, attempt['id']) elif action == 'decline': exam_attempt_id = update_attempt_status( attempt['proctored_exam']['id'], request.user.id, ProctoredExamStudentAttemptStatus.declined) data = {"exam_attempt_id": exam_attempt_id} return Response(data)
def put(self, request, attempt_id): """ HTTP POST handler. To stop an exam. """ try: attempt = get_exam_attempt_by_id(attempt_id) if not attempt: err_msg = ( 'Attempted to access attempt_id {attempt_id} but ' 'it does not exist.'.format( attempt_id=attempt_id ) ) raise StudentExamAttemptDoesNotExistsException(err_msg) # make sure the the attempt belongs to the calling user_id if attempt['user']['id'] != request.user.id: err_msg = ( 'Attempted to access attempt_id {attempt_id} but ' 'does not have access to it.'.format( attempt_id=attempt_id ) ) raise ProctoredExamPermissionDenied(err_msg) action = request.DATA.get('action') if action == 'stop': exam_attempt_id = stop_exam_attempt( exam_id=attempt['proctored_exam']['id'], user_id=request.user.id ) elif action == 'start': exam_attempt_id = start_exam_attempt( exam_id=attempt['proctored_exam']['id'], user_id=request.user.id ) elif action == 'submit': exam_attempt_id = update_attempt_status( attempt['proctored_exam']['id'], request.user.id, ProctoredExamStudentAttemptStatus.submitted ) elif action == 'decline': exam_attempt_id = update_attempt_status( attempt['proctored_exam']['id'], request.user.id, ProctoredExamStudentAttemptStatus.declined ) return Response({"exam_attempt_id": exam_attempt_id}) except ProctoredBaseException, ex: LOG.exception(ex) return Response( status=status.HTTP_400_BAD_REQUEST, data={"detail": str(ex)} )
def post(self, request): """ HTTP POST handler. To create an exam attempt. """ start_immediately = request.data.get('start_clock', 'false').lower() == 'true' exam_id = request.data.get('exam_id', None) attempt_proctored = request.data.get('attempt_proctored', 'false').lower() == 'true' provider_name = request.data.get('provider_name', 'dummy') try: exam = get_exam_by_id(exam_id) # Bypassing the due date check for practice exam # because student can attempt the practice after the due date if not exam.get("is_practice_exam") and has_due_date_passed( exam.get('due_date')): raise ProctoredExamPermissionDenied( 'Attempted to access expired exam with exam_id {exam_id}'. format(exam_id=exam_id)) exam_attempt_id = create_exam_attempt( exam_id=exam_id, user_id=request.user.id, taking_as_proctored=attempt_proctored, provider_name=provider_name) # if use elected not to take as proctored exam, then # use must take as open book, and loose credit eligibility if exam['is_proctored'] and not attempt_proctored: update_attempt_status( exam_id, request.user.id, ProctoredExamStudentAttemptStatus.declined) elif start_immediately: start_exam_attempt(exam_id, request.user.id) return Response({'exam_attempt_id': exam_attempt_id}) except ProctoredBaseException, ex: LOG.exception(ex) return Response(status=status.HTTP_400_BAD_REQUEST, data={"detail": unicode(ex)})
def put(self, request, attempt_id): """ HTTP POST handler. To stop an exam. """ try: attempt_id = int(attempt_id) attempt = get_exam_attempt_by_id(attempt_id) except: attempt = get_exam_attempt_by_code(attempt_id) try: if not attempt: err_msg = ('Attempted to access attempt_id {attempt_id} but ' 'it does not exist.'.format(attempt_id=attempt_id)) raise StudentExamAttemptDoesNotExistsException(err_msg) # make sure the the attempt belongs to the calling user_id if attempt['user']['id'] != request.user.id: err_msg = ('Attempted to access attempt_id {attempt_id} but ' 'does not have access to it.'.format( attempt_id=attempt_id)) raise ProctoredExamPermissionDenied(err_msg) action = request.data.get('action') if action == 'stop': exam_attempt_id = stop_exam_attempt( exam_id=attempt['proctored_exam']['id'], user_id=request.user.id) elif action == 'start': exam_attempt_id = start_exam_attempt( exam_id=attempt['proctored_exam']['id'], user_id=request.user.id) elif action == 'submit': exam_attempt_id = update_attempt_status( attempt['proctored_exam']['id'], request.user.id, ProctoredExamStudentAttemptStatus.submitted) elif action == 'click_download_software': exam_attempt_id = update_attempt_status( attempt['proctored_exam']['id'], request.user.id, ProctoredExamStudentAttemptStatus.download_software_clicked ) elif action == 'decline': exam_attempt_id = update_attempt_status( attempt['proctored_exam']['id'], request.user.id, ProctoredExamStudentAttemptStatus.declined) return Response({"exam_attempt_id": exam_attempt_id}) except ProctoredBaseException, ex: LOG.exception(ex) return Response(status=status.HTTP_400_BAD_REQUEST, data={"detail": str(ex)})
def put(self, request, attempt_id): """ HTTP POST handler. To stop an exam. """ try: attempt = get_exam_attempt_by_id(attempt_id) if not attempt: err_msg = "Attempted to access attempt_id {attempt_id} but " "it does not exist.".format( attempt_id=attempt_id ) raise StudentExamAttemptDoesNotExistsException(err_msg) # make sure the the attempt belongs to the calling user_id if attempt["user"]["id"] != request.user.id: err_msg = "Attempted to access attempt_id {attempt_id} but " "does not have access to it.".format( attempt_id=attempt_id ) raise ProctoredExamPermissionDenied(err_msg) action = request.data.get("action") if action == "stop": exam_attempt_id = stop_exam_attempt(exam_id=attempt["proctored_exam"]["id"], user_id=request.user.id) elif action == "start": exam_attempt_id = start_exam_attempt(exam_id=attempt["proctored_exam"]["id"], user_id=request.user.id) elif action == "submit": exam_attempt_id = update_attempt_status( attempt["proctored_exam"]["id"], request.user.id, ProctoredExamStudentAttemptStatus.submitted ) elif action == "click_download_software": exam_attempt_id = update_attempt_status( attempt["proctored_exam"]["id"], request.user.id, ProctoredExamStudentAttemptStatus.download_software_clicked, ) elif action == "decline": exam_attempt_id = update_attempt_status( attempt["proctored_exam"]["id"], request.user.id, ProctoredExamStudentAttemptStatus.declined ) return Response({"exam_attempt_id": exam_attempt_id}) except ProctoredBaseException, ex: LOG.exception(ex) return Response(status=status.HTTP_400_BAD_REQUEST, data={"detail": str(ex)})
def put(self, request, attempt_id): """ HTTP POST handler. To stop an exam. """ attempt = get_exam_attempt_by_id(attempt_id) if not attempt: err_msg = ( 'Attempted to access attempt_id {attempt_id} but ' 'it does not exist.'.format( attempt_id=attempt_id ) ) raise StudentExamAttemptDoesNotExistsException(err_msg) # make sure the the attempt belongs to the calling user_id if attempt['user']['id'] != request.user.id: err_msg = ( 'Attempted to access attempt_id {attempt_id} but ' 'does not have access to it.'.format( attempt_id=attempt_id ) ) raise ProctoredExamPermissionDenied(err_msg) action = request.data.get('action') if action == 'stop': exam_attempt_id = stop_exam_attempt( exam_id=attempt['proctored_exam']['id'], user_id=request.user.id ) elif action == 'start': exam_attempt_id = start_exam_attempt( exam_id=attempt['proctored_exam']['id'], user_id=request.user.id ) elif action == 'submit': exam_attempt_id = update_attempt_status( attempt['proctored_exam']['id'], request.user.id, ProctoredExamStudentAttemptStatus.submitted ) elif action == 'click_download_software': exam_attempt_id = update_attempt_status( attempt['proctored_exam']['id'], request.user.id, ProctoredExamStudentAttemptStatus.download_software_clicked ) elif action == 'error': backend = attempt['proctored_exam']['backend'] waffle_name = PING_FAILURE_PASSTHROUGH_TEMPLATE.format(backend) should_block_user = not (backend and waffle.switch_is_active(waffle_name)) and ( not attempt['status'] == ProctoredExamStudentAttemptStatus.submitted ) if should_block_user: exam_attempt_id = update_attempt_status( attempt['proctored_exam']['id'], request.user.id, ProctoredExamStudentAttemptStatus.error ) else: exam_attempt_id = False LOG.warning(u'Browser JS reported problem with proctoring desktop ' u'application. Did block user: %s, for attempt: %s', should_block_user, attempt['id']) elif action == 'decline': exam_attempt_id = update_attempt_status( attempt['proctored_exam']['id'], request.user.id, ProctoredExamStudentAttemptStatus.declined ) data = {"exam_attempt_id": exam_attempt_id} return Response(data)