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
Exemplo n.º 2
0
    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))
Exemplo n.º 3
0
    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.')
Exemplo n.º 4
0
    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))
Exemplo n.º 5
0
    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.')
Exemplo n.º 6
0
    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))
Exemplo n.º 7
0
    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
Exemplo n.º 8
0
    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
Exemplo n.º 10
0
    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)
Exemplo n.º 11
0
    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)
Exemplo n.º 12
0
    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
Exemplo n.º 13
0
    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))
Exemplo n.º 14
0
 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)
Exemplo n.º 15
0
 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'}))