def test_get_multi_summaries(self): topic_summaries = topic_fetchers.get_multi_topic_summaries( [self.TOPIC_ID, 'invalid_id']) self.assertEqual(len(topic_summaries), 2) self.assertEqual(topic_summaries[0].name, 'Name') self.assertEqual(topic_summaries[0].description, 'Description') self.assertEqual(topic_summaries[0].canonical_story_count, 0) self.assertEqual(topic_summaries[0].additional_story_count, 0) self.assertEqual(topic_summaries[0].total_skill_count, 2) self.assertEqual(topic_summaries[0].uncategorized_skill_count, 2) self.assertEqual(topic_summaries[0].subtopic_count, 1) self.assertIsNone(topic_summaries[1])
def _get_complete_translation_contribution_stats( self, translation_contribution_stats): """Returns translation contribution stats dicts with all the necessary information for the frontend. Args: translation_contribution_stats: list(TranslationContributionStats). TranslationContributionStats domain objects. Returns: list(dict(TranslationContributionStats)). Dict representations of TranslationContributionStats domain objects with additional keys: language: str. Language description. topic_name: str. Topic name. contribution_months: str. Unique translation contribution months of format: "%b %Y", e.g. "Jan 2021". Unnecessary keys language_code, topic_id, contribution_dates, contributor_user_id are consequently deleted. """ translation_contribution_stats_dicts = [ stats.to_dict() for stats in translation_contribution_stats ] topic_ids = [ stats_dict['topic_id'] for stats_dict in translation_contribution_stats_dicts ] topic_summaries = topic_fetchers.get_multi_topic_summaries(topic_ids) topic_name_by_topic_id = {} for topic_summary in topic_summaries: if topic_summary is None: continue topic_name_by_topic_id[topic_summary.id] = topic_summary.name for stats_dict in translation_contribution_stats_dicts: stats_dict['topic_name'] = topic_name_by_topic_id.get( stats_dict['topic_id'], 'UNKNOWN') stats_dict['contribution_months'] = list({ contribution_date.strftime('%b %Y') for contribution_date in stats_dict['contribution_dates'] }) stats_dict['language'] = ( utils.get_supported_audio_language_description( stats_dict['language_code']) ) del stats_dict['topic_id'] del stats_dict['language_code'] del stats_dict['contribution_dates'] del stats_dict['contributor_user_id'] return translation_contribution_stats_dicts
def test_get_multi_summaries(self) -> None: topic_summaries: List[Optional[topic_domain.TopicSummary]] = ( topic_fetchers.get_multi_topic_summaries( [self.TOPIC_ID, 'invalid_id'])) # Ruling out the possibility of None for mypy type checking. assert topic_summaries[0] is not None self.assertEqual(len(topic_summaries), 2) self.assertEqual(topic_summaries[0].name, 'Name') self.assertEqual(topic_summaries[0].description, 'Description') self.assertEqual(topic_summaries[0].canonical_story_count, 0) self.assertEqual(topic_summaries[0].additional_story_count, 0) self.assertEqual(topic_summaries[0].total_skill_count, 2) self.assertEqual(topic_summaries[0].uncategorized_skill_count, 2) self.assertEqual(topic_summaries[0].subtopic_count, 1) self.assertIsNone(topic_summaries[1])
def get(self, classroom_url_fragment): """Handles GET requests.""" classroom = classroom_services.get_classroom_by_url_fragment( classroom_url_fragment) topic_ids = classroom.topic_ids topic_summaries = topic_fetchers.get_multi_topic_summaries(topic_ids) topic_rights = topic_fetchers.get_multi_topic_rights(topic_ids) topic_summary_dicts = [] for index, summary in enumerate(topic_summaries): if summary is not None: topic_summary_dict = summary.to_dict() topic_summary_dict['is_published'] = ( topic_rights[index].topic_is_published) topic_summary_dicts.append(topic_summary_dict) self.values.update({ 'topic_summary_dicts': topic_summary_dicts, 'topic_list_intro': classroom.topic_list_intro, 'course_details': classroom.course_details, 'name': classroom.name }) self.render_json(self.values)