def get_library_groups(language_codes): """Returns a list of groups for the library index page. Each group has a header and a list of dicts representing activity summaries. """ language_codes_suffix = '' if language_codes: language_codes_suffix = ' language_code=("%s")' % ( '" OR "'.join(language_codes)) def _generate_query(categories): # This assumes that 'categories' is non-empty. return 'category=("%s")%s' % ('" OR "'.join(categories), language_codes_suffix) # Collect all exp ids so that the summary details can be retrieved with a # single get_multi() call. all_exp_ids = [] header_to_exp_ids = {} for group in _LIBRARY_INDEX_GROUPS: exp_ids = exp_services.search_explorations( _generate_query(group['search_categories']), 8)[0] header_to_exp_ids[group['header']] = exp_ids all_exp_ids += exp_ids all_summaries = [ summary for summary in exp_services.get_exploration_summaries_matching_ids(all_exp_ids) if summary is not None ] all_summary_dicts = { summary_dict['id']: summary_dict for summary_dict in _get_displayable_exp_summary_dicts(all_summaries) } results = [] for group in _LIBRARY_INDEX_GROUPS: exp_ids_to_display = header_to_exp_ids[group['header']] summary_dicts = [ all_summary_dicts[exp_id] for exp_id in exp_ids_to_display if exp_id in all_summary_dicts ] if not summary_dicts: continue results.append({ 'header': group['header'], 'categories': group['search_categories'], 'activity_summary_dicts': summary_dicts, }) return results
def get_library_groups(language_codes): """Returns a list of groups for the library index page. Each group has a header and a list of dicts representing activity summaries. """ language_codes_suffix = '' if language_codes: language_codes_suffix = ' language_code=("%s")' % ( '" OR "'.join(language_codes)) def _generate_query(categories): # This assumes that 'categories' is non-empty. return 'category=("%s")%s' % ( '" OR "'.join(categories), language_codes_suffix) # Collect all exp ids so that the summary details can be retrieved with a # single get_multi() call. all_exp_ids = [] header_to_exp_ids = {} for group in _LIBRARY_INDEX_GROUPS: exp_ids = exp_services.search_explorations( _generate_query(group['search_categories']), 8)[0] header_to_exp_ids[group['header']] = exp_ids all_exp_ids += exp_ids all_exploration_summaries = ( exp_services.get_exploration_summaries_matching_ids(all_exp_ids)) all_summary_dicts = { summary_dict['id']: summary_dict for summary_dict in _get_displayable_exp_summary_dicts( all_exploration_summaries) } results = [] for group in _LIBRARY_INDEX_GROUPS: exp_ids_to_display = header_to_exp_ids[group['header']] summary_dicts = [ all_summary_dicts[exp_id] for exp_id in exp_ids_to_display if exp_id in all_summary_dicts] if not summary_dicts: continue results.append({ 'header': group['header'], 'categories': group['search_categories'], 'activity_summary_dicts': summary_dicts, }) return results
def get_library_groups(language_codes): """Returns a list of groups for the library index page. Each group has a header and a list of dicts representing activity summaries. Args: language_codes: list(str). A list of language codes. Only explorations with these languages will be returned. Return: list(dict). A list of groups for the library index page. Each group is represented by a dict with the following keys and values: - activity_summary_dicts: list(dict). A list of dicts representing activity summaries. - categories: list(str). The list of group categories. - header_i18n_id: str. The i18n id for the header of the category. - has_full_results_page: bool. Whether the group header links to a "full results" page. This is always True for the "exploration category" groups. - full_results_url: str. The URL to the corresponding "full results" page. """ language_codes_suffix = '' if language_codes: language_codes_suffix = ' language_code=("%s")' % ( '" OR "'.join(language_codes)) def _generate_query(categories): # This assumes that 'categories' is non-empty. return 'category=("%s")%s' % ('" OR "'.join(categories), language_codes_suffix) # Collect all collection ids so that the summary details can be retrieved # with a single get_multi() call. all_collection_ids = [] header_id_to_collection_ids = {} for group in _LIBRARY_INDEX_GROUPS: collection_ids = collection_services.search_collections( _generate_query(group['search_categories']), 8)[0] header_id_to_collection_ids[group['header_i18n_id']] = collection_ids all_collection_ids += collection_ids collection_summaries = [ summary for summary in collection_services. get_collection_summaries_matching_ids(all_collection_ids) if summary is not None ] collection_summary_dicts = { summary_dict['id']: summary_dict for summary_dict in _get_displayable_collection_summary_dicts( collection_summaries) } # Collect all exp ids so that the summary details can be retrieved with a # single get_multi() call. all_exp_ids = [] header_to_exp_ids = {} for group in _LIBRARY_INDEX_GROUPS: exp_ids = exp_services.search_explorations( _generate_query(group['search_categories']), 8)[0] header_to_exp_ids[group['header_i18n_id']] = exp_ids all_exp_ids += exp_ids exp_summaries = [ summary for summary in exp_services.get_exploration_summaries_matching_ids(all_exp_ids) if summary is not None ] exp_summary_dicts = { summary_dict['id']: summary_dict for summary_dict in get_displayable_exp_summary_dicts(exp_summaries) } results = [] for group in _LIBRARY_INDEX_GROUPS: summary_dicts = [] collection_ids_to_display = ( header_id_to_collection_ids[group['header_i18n_id']]) summary_dicts = [ collection_summary_dicts[collection_id] for collection_id in collection_ids_to_display if collection_id in collection_summary_dicts ] exp_ids_to_display = header_to_exp_ids[group['header_i18n_id']] summary_dicts += [ exp_summary_dicts[exp_id] for exp_id in exp_ids_to_display if exp_id in exp_summary_dicts ] if not summary_dicts: continue results.append({ 'header_i18n_id': group['header_i18n_id'], 'categories': group['search_categories'], 'activity_summary_dicts': summary_dicts, 'has_full_results_page': True, 'full_results_url': None, }) return results
def get_library_groups(language_codes): """Returns a list of groups for the library index page. Each group has a header and a list of dicts representing activity summaries. Args: language_codes: list(str). A list of language codes. Only explorations with these languages will be returned. Return: list(dict). A list of groups for the library index page. Each group is represented by a dict with the following keys and values: - activity_summary_dicts: list(dict). A list of dicts representing activity summaries. - categories: list(str). The list of group categories. - header_i18n_id: str. The i18n id for the header of the category. - has_full_results_page: bool. Whether the group header links to a "full results" page. This is always True for the "exploration category" groups. - full_results_url: str. The URL to the corresponding "full results" page. """ language_codes_suffix = '' if language_codes: language_codes_suffix = ' language_code=("%s")' % ( '" OR "'.join(language_codes)) def _generate_query(categories): # This assumes that 'categories' is non-empty. return 'category=("%s")%s' % ( '" OR "'.join(categories), language_codes_suffix) # Collect all collection ids so that the summary details can be retrieved # with a single get_multi() call. all_collection_ids = [] header_id_to_collection_ids = {} for group in _LIBRARY_INDEX_GROUPS: collection_ids = collection_services.search_collections( _generate_query(group['search_categories']), 8)[0] header_id_to_collection_ids[group['header_i18n_id']] = collection_ids all_collection_ids += collection_ids collection_summaries = [ summary for summary in collection_services.get_collection_summaries_matching_ids( all_collection_ids) if summary is not None] collection_summary_dicts = { summary_dict['id']: summary_dict for summary_dict in _get_displayable_collection_summary_dicts( collection_summaries) } # Collect all exp ids so that the summary details can be retrieved with a # single get_multi() call. all_exp_ids = [] header_to_exp_ids = {} for group in _LIBRARY_INDEX_GROUPS: exp_ids = exp_services.search_explorations( _generate_query(group['search_categories']), 8)[0] header_to_exp_ids[group['header_i18n_id']] = exp_ids all_exp_ids += exp_ids exp_summaries = [ summary for summary in exp_services.get_exploration_summaries_matching_ids(all_exp_ids) if summary is not None] exp_summary_dicts = { summary_dict['id']: summary_dict for summary_dict in get_displayable_exp_summary_dicts(exp_summaries) } results = [] for group in _LIBRARY_INDEX_GROUPS: summary_dicts = [] collection_ids_to_display = ( header_id_to_collection_ids[group['header_i18n_id']]) summary_dicts = [ collection_summary_dicts[collection_id] for collection_id in collection_ids_to_display if collection_id in collection_summary_dicts] exp_ids_to_display = header_to_exp_ids[group['header_i18n_id']] summary_dicts += [ exp_summary_dicts[exp_id] for exp_id in exp_ids_to_display if exp_id in exp_summary_dicts] if not summary_dicts: continue results.append({ 'header_i18n_id': group['header_i18n_id'], 'categories': group['search_categories'], 'activity_summary_dicts': summary_dicts, 'has_full_results_page': True, 'full_results_url': None, }) return results