Exemplo n.º 1
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.º 2
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.º 3
0
    def put(self):
        """Store a question group in the datastore in response to a PUT."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(
                request, self.XSRF_TOKEN, {'key': key}):
            return

        if not CourseOutlineRights.can_edit(self):
            transforms.send_json_response(
                self, 401, 'Access denied.', {'key': key})
            return

        payload = request.get('payload')
        question_group_dict = transforms.json_to_dict(
            transforms.loads(payload),
            self.get_schema().get_json_schema_dict())

        validation_errors = self.validate(question_group_dict, key)
        if validation_errors:
            self.validation_error('\n'.join(validation_errors), key=key)
            return

        assert self.SCHEMA_VERSION == question_group_dict.get('version')

        if key:
            question_group = QuestionGroupDTO(key, question_group_dict)
        else:
            question_group = QuestionGroupDTO(None, question_group_dict)

        key_after_save = QuestionGroupDAO.save(question_group)
        transforms.send_json_response(
            self, 200, 'Saved.', payload_dict={'key': key_after_save})
Exemplo n.º 4
0
    def get(self):
        """Respond to the REST GET verb with the contents of the group."""
        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_group = QuestionGroupDAO.load(key)
            version = question_group.dict.get('version')
            if self.SCHEMA_VERSION != version:
                transforms.send_json_response(
                    self, 403, 'Cannot edit a Version %s group.' % version,
                    {'key': key})
                return
            payload_dict = question_group.dict
        else:
            payload_dict = {
                'version': self.SCHEMA_VERSION,
                'items': [{'weight': ''}, {'weight': ''}, {'weight': ''}]}

        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 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.º 6
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.º 7
0
    def put(self):
        """Store a question in the datastore in response to a PUT."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(
                request, self.XSRF_TOKEN, {'key': key}):
            return

        if not CourseOutlineRights.can_edit(self):
            transforms.send_json_response(
                self, 401, 'Access denied.', {'key': key})
            return

        payload = request.get('payload')
        question_dict = transforms.loads(payload)
        question_dict['description'] = question_dict['description'].strip()

        question_dict, errors = self.import_and_validate(question_dict, key)

        if errors:
            self.validation_error('\n'.join(errors), key=key)
            return

        if key:
            question = QuestionDTO(key, question_dict)
        else:
            question = QuestionDTO(None, question_dict)

        question.type = self.TYPE
        key_after_save = QuestionDAO.save(question)

        transforms.send_json_response(
            self, 200, 'Saved.', payload_dict={'key': key_after_save})
Exemplo n.º 8
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.º 9
0
    def delete(self):
        """Delete the question_group in response to REST request."""
        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_group = QuestionGroupDAO.load(key)
        if not question_group:
            transforms.send_json_response(
                self, 404, 'Question Group not found.', {'key': key})
            return
        QuestionGroupDAO.delete(question_group)
        transforms.send_json_response(self, 200, 'Deleted.')
Exemplo n.º 10
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.º 11
0
    def put(self):
        """Store a question in the datastore in response to a PUT."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(request, self.XSRF_TOKEN,
                                              {'key': key}):
            return

        if not CourseOutlineRights.can_edit(self):
            transforms.send_json_response(self, 401, 'Access denied.',
                                          {'key': key})
            return

        payload = request.get('payload')
        question_dict = transforms.loads(payload)
        question_dict['description'] = question_dict['description'].strip()

        question_dict, errors = self.import_and_validate(question_dict, key)

        if errors:
            self.validation_error('\n'.join(errors), key=key)
            return

        if key:
            question = QuestionDTO(key, question_dict)
        else:
            question = QuestionDTO(None, question_dict)

        question.type = self.TYPE
        key_after_save = QuestionDAO.save(question)

        transforms.send_json_response(self,
                                      200,
                                      'Saved.',
                                      payload_dict={'key': key_after_save})