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({})
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})
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({})
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({})