def handle_ajax(self, dispatch, data): """ This is called by courseware.module_render, to handle an AJAX call. `data` is request.POST. Returns a json dictionary: { 'progress_changed' : True/False, 'progress' : 'none'/'in_progress'/'done', <other request-specific values here > } """ handlers = { 'hint_button': self.hint_button, 'problem_get': self.get_problem, 'problem_check': self.check_problem, 'problem_reset': self.reset_problem, 'problem_save': self.save_problem, 'problem_show': self.get_answer, 'score_update': self.update_score, 'input_ajax': self.handle_input_ajax, 'ungraded_response': self.handle_ungraded_response } _ = self.runtime.service(self, "i18n").ugettext generic_error_message = _( "We're sorry, there was an error with processing your request. " "Please try reloading your page and trying again." ) not_found_error_message = _( "The state of this problem has changed since you loaded this page. " "Please refresh your page." ) if dispatch not in handlers: return 'Error: {} is not a known capa action'.format(dispatch) before = self.get_progress() try: result = handlers[dispatch](data) except NotFoundError as err: _, _, traceback_obj = sys.exc_info() # pylint: disable=redefined-outer-name raise ProcessingError(not_found_error_message), None, traceback_obj except Exception as err: _, _, traceback_obj = sys.exc_info() # pylint: disable=redefined-outer-name raise ProcessingError(generic_error_message), None, traceback_obj after = self.get_progress() result.update({ 'progress_changed': after != before, 'progress_status': Progress.to_js_status_str(after), 'progress_detail': Progress.to_js_detail_str(after), }) return json.dumps(result, cls=ComplexEncoder)
def handle_ajax(self, dispatch, data): """ This is called by courseware.module_render, to handle an AJAX call. `data` is request.POST. Returns a json dictionary: { 'progress_changed' : True/False, 'progress' : 'none'/'in_progress'/'done', <other request-specific values here > } """ handlers = { 'problem_get': self.get_problem, 'problem_check': self.check_problem, 'problem_reset': self.reset_problem, 'problem_save': self.save_problem, 'problem_show': self.get_answer, 'score_update': self.update_score, 'input_ajax': self.handle_input_ajax, 'ungraded_response': self.handle_ungraded_response } if dispatch not in handlers: return 'Error' before = self.get_progress() try: result = handlers[dispatch](data) except Exception as err: _, _, traceback_obj = sys.exc_info() raise ProcessingError(err.message, traceback_obj) after = self.get_progress() result.update({ 'progress_changed': after != before, 'progress_status': Progress.to_js_status_str(after), }) return json.dumps(result, cls=ComplexEncoder)
def handle_ajax(self, dispatch, data): """ This is called by courseware.module_render, to handle an AJAX call. `data` is request.POST. Returns a json dictionary: { 'progress_changed' : True/False, 'progress' : 'none'/'in_progress'/'done', <other request-specific values here > } """ handlers = { 'hint_button': self.hint_button, 'problem_get': self.get_problem, 'problem_check': self.submit_problem, 'problem_reset': self.reset_problem, 'problem_save': self.save_problem, 'problem_show': self.get_answer, 'problem_start': self.start_problem, 'score_update': self.update_score, 'input_ajax': self.handle_input_ajax, 'ungraded_response': self.handle_ungraded_response } _ = self.runtime.service(self, "i18n").ugettext generic_error_message = _( "We're sorry, there was an error with processing your request. " "Please try reloading your page and trying again.") not_found_error_message = _( "The state of this problem has changed since you loaded this page. " "Please refresh your page.") time_expired_error_message = _( "This problem's time has expired. Please refresh your page.") if dispatch not in handlers: return 'Error: {} is not a known capa action'.format(dispatch) before = self.get_progress() before_attempts = self.attempts try: result = handlers[dispatch](data) except NotFoundError: log.info( "Unable to find data when dispatching %s to %s for user %s", dispatch, self.scope_ids.usage_id, self.scope_ids.user_id) _, _, traceback_obj = sys.exc_info() # pylint: disable=redefined-outer-name raise ProcessingError(not_found_error_message), None, traceback_obj except TimeExpiredError: dummy1, dummy2, traceback_obj = sys.exc_info() raise ProcessingError(time_expired_error_message), traceback_obj except Exception: log.exception( "Unknown error when dispatching %s to %s for user %s", dispatch, self.scope_ids.usage_id, self.scope_ids.user_id) _, _, traceback_obj = sys.exc_info() # pylint: disable=redefined-outer-name raise ProcessingError(generic_error_message), None, traceback_obj after = self.get_progress() after_attempts = self.attempts progress_changed = (after != before) or (after_attempts != before_attempts) curr_score, total_possible = self.get_display_progress() result.update({ 'progress_changed': progress_changed, 'current_score': curr_score, 'total_possible': total_possible, 'attempts_used': after_attempts, }) return json.dumps(result, cls=ComplexEncoder)
def handle_ajax(self, dispatch, data): """ This is called by courseware.module_render, to handle an AJAX call. `data` is request.POST. Returns a json dictionary: { 'progress_changed' : True/False, 'progress' : 'none'/'in_progress'/'done', <other request-specific values here > } """ # self.score is initialized in self.lcp but in this method is accessed before self.lcp so just call it first. self.lcp # lint-amnesty, pylint: disable=pointless-statement handlers = { 'hint_button': self.hint_button, 'problem_get': self.get_problem, 'problem_check': self.submit_problem, 'problem_reset': self.reset_problem, 'problem_save': self.save_problem, 'problem_show': self.get_answer, 'score_update': self.update_score, 'input_ajax': self.handle_input_ajax, 'ungraded_response': self.handle_ungraded_response } _ = self.runtime.service(self, "i18n").ugettext generic_error_message = _( "We're sorry, there was an error with processing your request. " "Please try reloading your page and trying again." ) not_found_error_message = _( "The state of this problem has changed since you loaded this page. " "Please refresh your page." ) if dispatch not in handlers: return f'Error: {dispatch} is not a known capa action' before = self.get_progress() before_attempts = self.attempts try: result = handlers[dispatch](data) except NotFoundError as ex: log.info( "Unable to find data when dispatching %s to %s for user %s", dispatch, self.scope_ids.usage_id, self.scope_ids.user_id ) _, _, traceback_obj = sys.exc_info() raise ProcessingError(not_found_error_message).with_traceback(traceback_obj) from ex except Exception as ex: # lint-amnesty, pylint: disable=broad-except log.exception( "Unknown error when dispatching %s to %s for user %s", dispatch, self.scope_ids.usage_id, self.scope_ids.user_id ) _, _, traceback_obj = sys.exc_info() raise ProcessingError(generic_error_message).with_traceback(traceback_obj) from ex after = self.get_progress() after_attempts = self.attempts progress_changed = (after != before) or (after_attempts != before_attempts) curr_score, total_possible = self.get_display_progress() result.update({ 'progress_changed': progress_changed, 'current_score': curr_score, 'total_possible': total_possible, 'attempts_used': after_attempts, }) return json.dumps(result, cls=ComplexEncoder)