Ejemplo n.º 1
0
    def put(self):
        """Handles PUT requests."""
        mastery_change_per_skill = (
            self.payload.get('mastery_change_per_skill'))
        if (not mastery_change_per_skill or
                not isinstance(mastery_change_per_skill, dict)):
            raise self.InvalidInputException(
                'Expected payload to contain mastery_change_per_skill '
                'as a dict.')

        skill_ids = list(mastery_change_per_skill.keys())

        current_degrees_of_mastery = (
            skill_services.get_multi_user_skill_mastery(self.user_id, skill_ids)
        )
        new_degrees_of_mastery = {}

        for skill_id in skill_ids:
            try:
                skill_domain.Skill.require_valid_skill_id(skill_id)
            except utils.ValidationError:
                raise self.InvalidInputException(
                    'Invalid skill ID %s' % skill_id)

            # float(bool) will not raise an error.
            if isinstance(mastery_change_per_skill[skill_id], bool):
                raise self.InvalidInputException(
                    'Expected degree of mastery of skill %s to be a number, '
                    'received %s.'
                    % (skill_id, mastery_change_per_skill[skill_id]))

            try:
                mastery_change_per_skill[skill_id] = (
                    float(mastery_change_per_skill[skill_id]))
            except (TypeError, ValueError):
                raise self.InvalidInputException(
                    'Expected degree of mastery of skill %s to be a number, '
                    'received %s.'
                    % (skill_id, mastery_change_per_skill[skill_id]))

            if current_degrees_of_mastery[skill_id] is None:
                current_degrees_of_mastery[skill_id] = 0.0
            new_degrees_of_mastery[skill_id] = (
                current_degrees_of_mastery[skill_id] +
                mastery_change_per_skill[skill_id])

            if new_degrees_of_mastery[skill_id] < 0.0:
                new_degrees_of_mastery[skill_id] = 0.0
            elif new_degrees_of_mastery[skill_id] > 1.0:
                new_degrees_of_mastery[skill_id] = 1.0

        try:
            skill_fetchers.get_multi_skills(skill_ids)
        except Exception as e:
            raise self.PageNotFoundException(e)

        skill_services.create_multi_user_skill_mastery(
            self.user_id, new_degrees_of_mastery)

        self.render_json({})
Ejemplo n.º 2
0
    def test_create_multi_user_skill_mastery(self):
        skill_id_4 = skill_services.get_new_skill_id()
        skill_id_5 = skill_services.get_new_skill_id()
        skill_services.create_multi_user_skill_mastery(
            self.USER_ID, {skill_id_4: 0.3, skill_id_5: 0.5})

        degrees_of_mastery = skill_services.get_multi_user_skill_mastery(
            self.USER_ID, [skill_id_4, skill_id_5])

        self.assertEqual(
            degrees_of_mastery, {skill_id_4: 0.3, skill_id_5: 0.5})
Ejemplo n.º 3
0
    def put(self):
        """Handles PUT requests."""
        degree_of_mastery_per_skill = (
            self.payload.get('degree_of_mastery_per_skill'))
        if (not degree_of_mastery_per_skill
                or not isinstance(degree_of_mastery_per_skill, dict)):
            raise self.InvalidInputException(
                'Expected payload to contain degree_of_mastery_per_skill '
                'as a dict.')

        skill_ids = degree_of_mastery_per_skill.keys()

        for skill_id in skill_ids:
            try:
                skill_domain.Skill.require_valid_skill_id(skill_id)
            except utils.ValidationError:
                raise self.InvalidInputException('Invalid skill ID %s' %
                                                 skill_id)

            # float(bool) will not raise an error.
            if isinstance(degree_of_mastery_per_skill[skill_id], bool):
                raise self.InvalidInputException(
                    'Expected degree of mastery of skill %s to be a number, '
                    'received %s.' %
                    (skill_id, degree_of_mastery_per_skill[skill_id]))

            try:
                degree_of_mastery_per_skill[skill_id] = (float(
                    degree_of_mastery_per_skill[skill_id]))
            except (TypeError, ValueError):
                raise self.InvalidInputException(
                    'Expected degree of mastery of skill %s to be a number, '
                    'received %s.' %
                    (skill_id, degree_of_mastery_per_skill[skill_id]))

            if (degree_of_mastery_per_skill[skill_id] < 0.0
                    or degree_of_mastery_per_skill[skill_id] > 1.0):
                raise self.InvalidInputException(
                    'Expected degree of mastery of skill %s to be a float '
                    'between 0.0 and 1.0, received %s.' %
                    (skill_id, degree_of_mastery_per_skill[skill_id]))

        try:
            skill_services.get_multi_skills(skill_ids)
        except Exception as e:
            raise self.PageNotFoundException(e)

        skill_services.create_multi_user_skill_mastery(
            self.user_id, degree_of_mastery_per_skill)

        self.render_json({})
Ejemplo n.º 4
0
    def put(self):
        """Handles PUT requests."""
        mastery_change_per_skill = (
            self.normalized_payload.get('mastery_change_per_skill'))

        skill_ids = list(mastery_change_per_skill.keys())

        current_degrees_of_mastery = (
            skill_services.get_multi_user_skill_mastery(
                self.user_id, skill_ids))
        new_degrees_of_mastery = {}

        for skill_id in skill_ids:
            try:
                skill_domain.Skill.require_valid_skill_id(skill_id)
            except utils.ValidationError as e:
                raise self.InvalidInputException('Invalid skill ID %s' %
                                                 skill_id) from e

            if current_degrees_of_mastery[skill_id] is None:
                current_degrees_of_mastery[skill_id] = 0.0
            new_degrees_of_mastery[skill_id] = (
                current_degrees_of_mastery[skill_id] +
                mastery_change_per_skill[skill_id])

            if new_degrees_of_mastery[skill_id] < 0.0:
                new_degrees_of_mastery[skill_id] = 0.0
            elif new_degrees_of_mastery[skill_id] > 1.0:
                new_degrees_of_mastery[skill_id] = 1.0

        try:
            skill_fetchers.get_multi_skills(skill_ids)
        except Exception as e:
            raise self.PageNotFoundException(e) from e

        skill_services.create_multi_user_skill_mastery(self.user_id,
                                                       new_degrees_of_mastery)

        self.render_json({})