def _get_questions_by_question_id(cls, questions_by_usage_id): ret = {} ret['single'] = {} ret['grouped'] = {} for question in questions_by_usage_id.values(): question_single = QuestionDAO.load(question['id']) if question_single: ret['single'][question['id']] = question_single else: question_group = QuestionGroupDAO.load(question['id']) if question_group: ret['grouped'][question['id']] = {} for item in question_group.items: ret['grouped'][question['id']][item['question']] = QuestionDAO.load(item['question']) return ret
def get(self): """Get the data to populate the question editor form.""" key = self.request.get('key') if not CourseOutlineRights.can_view(self): transforms.send_json_response(self, 401, 'Access denied.', {'key': key}) return if key: question = QuestionDAO.load(key) payload_dict = question.dict else: payload_dict = { 'version': self.SCHEMA_VERSION, 'question': '', 'description': '', 'graders': [{ 'score': '1.0', 'matcher': 'case_insensitive', 'response': '', 'feedback': '' }] } transforms.send_json_response( self, 200, 'Success', payload_dict=payload_dict, xsrf_token=XsrfTokenManager.create_xsrf_token(self.XSRF_TOKEN))
def delete(self): """Remove a question from the datastore in response to DELETE.""" key = self.request.get('key') if not self.assert_xsrf_token_or_fail(self.request, self.XSRF_TOKEN, {'key': key}): return if not CourseOutlineRights.can_delete(self): transforms.send_json_response(self, 401, 'Access denied.', {'key': key}) return question = QuestionDAO.load(key) if not question: transforms.send_json_response(self, 404, 'Question not found.', {'key': key}) return used_by = QuestionDAO.used_by(question.id) if used_by: group_names = ['"%s"' % x for x in used_by] transforms.send_json_response( self, 403, ('Question in use by question groups:\n%s.\nPlease delete it ' 'from those groups and try again.') % ',\n'.join(group_names), {'key': key}) return QuestionDAO.delete(question) transforms.send_json_response(self, 200, 'Deleted.')
def get(self): """Get the data to populate the question editor form.""" key = self.request.get('key') if not CourseOutlineRights.can_view(self): transforms.send_json_response( self, 401, 'Access denied.', {'key': key}) return if key: question = QuestionDAO.load(key) payload_dict = question.dict else: payload_dict = { 'version': self.SCHEMA_VERSION, 'question': '', 'description': '', 'graders': [ { 'score': '1.0', 'matcher': 'case_insensitive', 'response': '', 'feedback': ''}]} transforms.send_json_response( self, 200, 'Success', payload_dict=payload_dict, xsrf_token=XsrfTokenManager.create_xsrf_token(self.XSRF_TOKEN))
def delete(self): """Remove a question from the datastore in response to DELETE.""" key = self.request.get('key') if not self.assert_xsrf_token_or_fail( self.request, self.XSRF_TOKEN, {'key': key}): return if not CourseOutlineRights.can_delete(self): transforms.send_json_response( self, 401, 'Access denied.', {'key': key}) return question = QuestionDAO.load(key) if not question: transforms.send_json_response( self, 404, 'Question not found.', {'key': key}) return used_by = QuestionDAO.used_by(question.id) if used_by: group_names = ['"%s"' % x for x in used_by] transforms.send_json_response( self, 403, ('Question in use by question groups:\n%s.\nPlease delete it ' 'from those groups and try again.') % ',\n'.join(group_names), {'key': key}) return QuestionDAO.delete(question) transforms.send_json_response(self, 200, 'Deleted.')
def get(self): """Get the data to populate the question editor form.""" def export(q_dict): p_dict = copy.deepcopy(q_dict) # InputEx does not correctly roundtrip booleans, so pass strings p_dict['multiple_selections'] = ( 'true' if q_dict.get('multiple_selections') else 'false') return p_dict key = self.request.get('key') if not CourseOutlineRights.can_view(self): transforms.send_json_response(self, 401, 'Access denied.', {'key': key}) return if key: question = QuestionDAO.load(key) payload_dict = export(question.dict) else: payload_dict = { 'version': self.SCHEMA_VERSION, 'question': '', 'description': '', 'multiple_selections': 'false', 'choices': [{ 'score': '1', 'text': '', 'feedback': '' }, { 'score': '0', 'text': '', 'feedback': '' }, { 'score': '0', 'text': '', 'feedback': '' }, { 'score': '0', 'text': '', 'feedback': '' }] } transforms.send_json_response( self, 200, 'Success', payload_dict=payload_dict, xsrf_token=XsrfTokenManager.create_xsrf_token(self.XSRF_TOKEN))
def _get_questions_by_question_id(cls, questions_by_usage_id): ''' Retrieves every question in the course returning them in a dict: { id:questionDAO, ... } @param questions_by_usage_id.values() is a dict: {unit, lesson, sequence, weight, quid} ''' ret = {} ret['single'] = {} ret['grouped'] = {} for question in questions_by_usage_id.values(): question_single = QuestionDAO.load(question['id']) if question_single: ret['single'][question['id']] = question_single else: question_group = QuestionGroupDAO.load(question['id']) if question_group: ret['grouped'][question['id']] = {} for item in question_group.items: ret['grouped'][question['id']][item['question']] = QuestionDAO.load(item['question']) return ret
def _get_questions_by_question_id(cls, questions_by_usage_id): ''' Retrieves every question in the course returning them in a dict: { id:questionDAO, ... } @param questions_by_usage_id.values() is a dict: {unit, lesson, sequence, weight, quid} ''' ret = {} ret['single'] = {} ret['grouped'] = {} for question in questions_by_usage_id.values(): question_single = QuestionDAO.load(question['id']) if question_single: ret['single'][question['id']] = question_single else: question_group = QuestionGroupDAO.load(question['id']) if question_group: ret['grouped'][question['id']] = {} for item in question_group.items: ret['grouped'][question['id']][ item['question']] = QuestionDAO.load( item['question']) return ret
def post_add_to_question_group(self): try: question_id = long(self.request.get('question_id')) question_dto = QuestionDAO.load(question_id) if question_dto is None: raise ValueError() except ValueError: transforms.send_json_response( self, 500, 'Invalid question id.', {'question-id': self.request.get('question_id')} ) return try: group_id = long(self.request.get('group_id')) group_dto = QuestionGroupDAO.load(group_id) if group_dto is None: raise ValueError() except ValueError: transforms.send_json_response( self, 500, 'Invalid question group id.', {'group-id': self.request.get('group_id')} ) return weight = self.request.get('weight') try: float(weight) except ValueError: transforms.send_json_response( self, 500, 'Invalid weight. Must be a numeric value.', { 'weight': weight}) return group_dto.add_question(question_id, weight) QuestionGroupDAO.save(group_dto) transforms.send_json_response( self, 200, '%s added to %s.' % ( question_dto.description, group_dto.description ), { 'group-id': group_dto.id, 'question-id': question_dto.id } ) return
def get_edit_question(self): key = self.request.get('key') question = QuestionDAO.load(key) if not question: raise Exception('No question found') if question.type == QuestionDTO.MULTIPLE_CHOICE: self.render_page( self.prepare_template(McQuestionRESTHandler, key=key)) elif question.type == QuestionDTO.SHORT_ANSWER: self.render_page( self.prepare_template(SaQuestionRESTHandler, key=key)) else: raise Exception('Unknown question type: %s' % question.type)
def post_add_to_question_group(self): try: question_id = long(self.request.get('question_id')) question_dto = QuestionDAO.load(question_id) if question_dto is None: raise ValueError() except ValueError: transforms.send_json_response( self, 500, 'Invalid question id.', {'question-id': self.request.get('question_id')}) return try: group_id = long(self.request.get('group_id')) group_dto = QuestionGroupDAO.load(group_id) if group_dto is None: raise ValueError() except ValueError: transforms.send_json_response( self, 500, 'Invalid question group id.', {'group-id': self.request.get('group_id')}) return weight = self.request.get('weight') try: float(weight) except ValueError: transforms.send_json_response( self, 500, 'Invalid weight. Must be a numeric value.', {'weight': weight}) return group_dto.add_question(question_id, weight) QuestionGroupDAO.save(group_dto) transforms.send_json_response( self, 200, '%s added to %s.' % (question_dto.description, group_dto.description), { 'group-id': group_dto.id, 'question-id': question_dto.id }) return
def get(self): """Get the data to populate the question editor form.""" def export(q_dict): p_dict = copy.deepcopy(q_dict) # InputEx does not correctly roundtrip booleans, so pass strings p_dict['multiple_selections'] = ( 'true' if q_dict.get('multiple_selections') else 'false') return p_dict key = self.request.get('key') if not CourseOutlineRights.can_view(self): transforms.send_json_response( self, 401, 'Access denied.', {'key': key}) return if key: question = QuestionDAO.load(key) payload_dict = export(question.dict) else: payload_dict = { 'version': self.SCHEMA_VERSION, 'question': '', 'description': '', 'multiple_selections': 'false', 'choices': [ {'score': '1', 'text': '', 'feedback': ''}, {'score': '0', 'text': '', 'feedback': ''}, {'score': '0', 'text': '', 'feedback': ''}, {'score': '0', 'text': '', 'feedback': ''} ]} transforms.send_json_response( self, 200, 'Success', payload_dict=payload_dict, xsrf_token=XsrfTokenManager.create_xsrf_token(self.XSRF_TOKEN))
def post_clone_question(self): original_question = QuestionDAO.load(self.request.get('key')) cloned_question = QuestionDAO.clone(original_question) cloned_question.description += ' (clone)' QuestionDAO.save(cloned_question)
def get_clone_question(self): original_question = QuestionDAO.load(self.request.get('key')) cloned_question = QuestionDAO.clone(original_question) cloned_question.description += ' (clone)' QuestionDAO.save(cloned_question) self.redirect(self.get_action_url('assets', {'tab': 'questions'}))