예제 #1
0
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)
예제 #2
0
 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())
예제 #3
0
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)