def get_displayable_question_skill_link_details( question_count, skill_ids, offset): """Returns the list of question summaries and corresponding skill descriptions linked to all the skills given by skill_ids. Args: question_count: int. The number of questions to fetch. skill_ids: list(str). The ids of skills for which the linked questions are to be retrieved. offset: int. Number of query results to skip. Raises: Exception. Querying linked question summaries for more than 3 skills at a time is not supported currently. Returns: list(QuestionSummary), list(MergedQuestionSkillLink). The list of questions linked to the given skill ids, the list of MergedQuestionSkillLink objects, keyed by question ID. """ if len(skill_ids) == 0: return [], [] if len(skill_ids) > 3: raise Exception( 'Querying linked question summaries for more than 3 skills at a ' 'time is not supported currently.') question_skill_link_models = ( question_models.QuestionSkillLinkModel. get_question_skill_links_by_skill_ids( question_count, skill_ids, offset)) # Deduplicate question_ids and group skill_descriptions that are linked to # the same question. question_ids = [] grouped_skill_ids = [] grouped_difficulties = [] for question_skill_link in question_skill_link_models: if question_skill_link.question_id not in question_ids: question_ids.append(question_skill_link.question_id) grouped_skill_ids.append([question_skill_link.skill_id]) grouped_difficulties.append([question_skill_link.skill_difficulty]) else: grouped_skill_ids[-1].append(question_skill_link.skill_id) grouped_difficulties[-1].append( question_skill_link.skill_difficulty) merged_question_skill_links = [] for ind, skill_ids_list in enumerate(grouped_skill_ids): skills = skill_models.SkillModel.get_multi(skill_ids_list) merged_question_skill_links.append( question_domain.MergedQuestionSkillLink( question_ids[ind], skill_ids_list, [skill.description if skill else None for skill in skills], grouped_difficulties[ind])) question_summaries = get_question_summaries_by_ids(question_ids) return (question_summaries, merged_question_skill_links)
def test_to_dict(self): """Test to verify to_dict method of the Merged Question Skill Link Domain object. """ expected_object_dict = { 'question_id': 'testquestion', 'skill_ids': ['testskill'], 'skill_descriptions': ['testskilldescription'], 'skill_difficulties': [0.5], } observed_object = question_domain.MergedQuestionSkillLink( 'testquestion', ['testskill'], ['testskilldescription'], [0.5]) self.assertEqual(expected_object_dict, observed_object.to_dict())
def get_displayable_question_skill_link_details( question_count, skill_ids, start_cursor): """Returns the list of question summaries and corresponding skill descriptions linked to all the skills given by skill_ids. Args: question_count: int. The number of questions to fetch. skill_ids: list(str). The ids of skills for which the linked questions are to be retrieved. start_cursor: str. The starting point from which the batch of questions are to be returned. This value should be urlsafe. Raises: Exception. Querying linked question summaries for more than 3 skills at a time is not supported currently. Returns: list(QuestionSummary), list(MergedQuestionSkillLink), str|None. The list of questions linked to the given skill ids, the list of MergedQuestionSkillLink objects, keyed by question ID and the next cursor value to be used for the next batch of questions (or None if no more pages are left). The returned next cursor value is urlsafe. """ if len(skill_ids) == 0: return [], [], None if len(skill_ids) > 3: raise Exception( 'Querying linked question summaries for more than 3 skills at a ' 'time is not supported currently.') question_skill_link_models, next_cursor = ( question_models.QuestionSkillLinkModel.get_question_skill_links_by_skill_ids( #pylint: disable=line-too-long question_count, skill_ids, start_cursor)) # Deduplicate question_ids and group skill_descriptions that are linked to # the same question. question_ids = [] grouped_skill_ids = [] grouped_difficulties = [] for question_skill_link in question_skill_link_models: if question_skill_link.question_id not in question_ids: question_ids.append(question_skill_link.question_id) grouped_skill_ids.append([question_skill_link.skill_id]) grouped_difficulties.append([question_skill_link.skill_difficulty]) else: grouped_skill_ids[-1].append(question_skill_link.skill_id) grouped_difficulties[-1].append( question_skill_link.skill_difficulty) merged_question_skill_links = [] for ind, skill_ids_list in enumerate(grouped_skill_ids): skills = skill_models.SkillModel.get_multi(skill_ids_list) merged_question_skill_links.append( question_domain.MergedQuestionSkillLink( question_ids[ind], skill_ids_list, [skill.description if skill else None for skill in skills], grouped_difficulties[ind])) question_summaries = get_question_summaries_by_ids(question_ids) return ( question_summaries, merged_question_skill_links, next_cursor)