def test_unresolved_answers_count_when_answers_marked_as_resolved(self): exp_1 = self._create_and_update_fake_exploration('eid1') self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {}) event_services.AnswerSubmissionEventHandler.record( 'eid1', 1, exp_1.init_state_name, self.DEFAULT_RULESPEC_STR, 'a1') event_services.AnswerSubmissionEventHandler.record( 'eid1', 1, exp_1.init_state_name, self.DEFAULT_RULESPEC_STR, 'a2') self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {'eid1': 2}) event_services.DefaultRuleAnswerResolutionEventHandler.record( 'eid1', exp_1.init_state_name, ['a1']) self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {'eid1': 1}) exp_2 = self._create_and_update_fake_exploration('eid2') event_services.AnswerSubmissionEventHandler.record( 'eid2', 1, exp_2.init_state_name, self.DEFAULT_RULESPEC_STR, 'a1') event_services.DefaultRuleAnswerResolutionEventHandler.record( 'eid1', exp_1.init_state_name, ['a2']) event_services.DefaultRuleAnswerResolutionEventHandler.record( 'eid2', exp_1.init_state_name, ['a1']) self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1', 'eid2']), {})
def test_unresolved_answers_count_when_answers_marked_as_resolved(self): exp_1 = self._create_and_update_fake_exploration('eid1') self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {}) event_services.AnswerSubmissionEventHandler.record( 'eid1', 1, exp_1.init_state_name, self.DEFAULT_RULESPEC_STR, 'a1') event_services.AnswerSubmissionEventHandler.record( 'eid1', 1, exp_1.init_state_name, self.DEFAULT_RULESPEC_STR, 'a2') self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {'eid1': 2}) event_services.DefaultRuleAnswerResolutionEventHandler.record( 'eid1', exp_1.init_state_name, ['a1']) self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {'eid1': 1}) exp_2 = self._create_and_update_fake_exploration('eid2') event_services.AnswerSubmissionEventHandler.record( 'eid2', 1, exp_2.init_state_name, self.DEFAULT_RULESPEC_STR, 'a1') event_services.DefaultRuleAnswerResolutionEventHandler.record( 'eid1', exp_1.init_state_name, ['a2']) event_services.DefaultRuleAnswerResolutionEventHandler.record( 'eid2', exp_1.init_state_name, ['a1']) self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1', 'eid2']), {})
def test_unresolved_answers_count_for_single_exploration(self): exp_1 = self._create_and_update_fake_exploration('eid1') self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {}) event_services.AnswerSubmissionEventHandler.record( 'eid1', 1, exp_1.init_state_name, self.DEFAULT_RULESPEC_STR, 'a1') self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {'eid1': 1})
def test_unresolved_answers_count_for_single_exploration(self): exp_1 = self._create_and_update_fake_exploration('eid1') self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {}) event_services.AnswerSubmissionEventHandler.record( 'eid1', 1, exp_1.init_state_name, self.DEFAULT_RULESPEC_STR, 'a1') self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {'eid1': 1})
def test_unresolved_answers_count_for_non_default_rules(self): exp_1 = self._create_and_update_fake_exploration('eid1') self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {}) event_services.AnswerSubmissionEventHandler.record( 'eid1', 1, exp_1.init_state_name, self.CLASSIFIER_RULESPEC_STR, 'a1' ) event_services.AnswerSubmissionEventHandler.record( 'eid1', 1, self.STATE_2_NAME, self.CLASSIFIER_RULESPEC_STR, 'a1') self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {})
def test_unresolved_answers_count_for_non_default_rules(self): exp_1 = self._create_and_update_fake_exploration('eid1') self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {}) event_services.AnswerSubmissionEventHandler.record( 'eid1', 1, exp_1.init_state_name, self.CLASSIFIER_RULESPEC_STR, 'a1') event_services.AnswerSubmissionEventHandler.record( 'eid1', 1, self.STATE_2_NAME, self.CLASSIFIER_RULESPEC_STR, 'a1') self.assertEquals( stats_services.get_exps_unresolved_answers_count_for_default_rule( ['eid1']), {})
def get(self): """Handles GET requests.""" if self.user_id is None: raise self.PageNotFoundException def _get_intro_card_color(category): return ( feconf.CATEGORIES_TO_COLORS[category] if category in feconf.CATEGORIES_TO_COLORS else feconf.DEFAULT_COLOR) def _round_average_ratings(rating): return round(rating, feconf.AVERAGE_RATINGS_DASHBOARD_PRECISION) exploration_ids_subscribed_to = ( subscription_services.get_exploration_ids_subscribed_to( self.user_id)) subscribed_exploration_summaries = filter(None, ( exp_services.get_exploration_summaries_matching_ids( exploration_ids_subscribed_to))) subscribed_collection_summaries = filter(None, ( collection_services.get_collection_summaries_matching_ids( subscription_services.get_collection_ids_subscribed_to( self.user_id)))) exp_summary_list = summary_services.get_displayable_exp_summary_dicts( subscribed_exploration_summaries) collection_summary_list = [] feedback_thread_analytics = ( feedback_services.get_thread_analytics_multi( exploration_ids_subscribed_to)) unresolved_answers_dict = ( stats_services.get_exps_unresolved_answers_count_for_default_rule( exploration_ids_subscribed_to)) for ind, exploration in enumerate(exp_summary_list): exploration.update(feedback_thread_analytics[ind].to_dict()) exploration.update({ 'num_unresolved_answers': ( unresolved_answers_dict[exploration['id']] if exploration['id'] in unresolved_answers_dict else 0 ) }) exp_summary_list = sorted( exp_summary_list, key=lambda x: (x['num_open_threads'], x['last_updated_msec']), reverse=True) if (self.username in config_domain.WHITELISTED_COLLECTION_EDITOR_USERNAMES.value): for collection_summary in subscribed_collection_summaries: # TODO(sll): Reuse _get_displayable_collection_summary_dicts() # in summary_services, instead of replicating it like this. collection_summary_list.append({ 'id': collection_summary.id, 'title': collection_summary.title, 'category': collection_summary.category, 'objective': collection_summary.objective, 'language_code': collection_summary.language_code, 'last_updated': utils.get_time_in_millisecs( collection_summary.collection_model_last_updated), 'created_on': utils.get_time_in_millisecs( collection_summary.collection_model_created_on), 'status': collection_summary.status, 'community_owned': collection_summary.community_owned, 'thumbnail_icon_url': ( utils.get_thumbnail_icon_url_for_category( collection_summary.category)), 'thumbnail_bg_color': utils.get_hex_color_for_category( collection_summary.category), }) dashboard_stats = ( user_jobs_continuous.UserStatsAggregator.get_dashboard_stats( self.user_id)) dashboard_stats.update({ 'total_open_feedback': feedback_services.get_total_open_threads( feedback_thread_analytics) }) if dashboard_stats and dashboard_stats.get('average_ratings'): dashboard_stats['average_ratings'] = ( _round_average_ratings(dashboard_stats['average_ratings'])) last_week_stats = ( user_services.get_last_week_dashboard_stats(self.user_id)) if last_week_stats and last_week_stats.get('average_ratings'): last_week_stats['average_ratings'] = ( _round_average_ratings(last_week_stats['average_ratings'])) self.values.update({ 'explorations_list': exp_summary_list, 'collections_list': collection_summary_list, 'dashboard_stats': dashboard_stats, 'last_week_stats': last_week_stats }) self.render_json(self.values)
def get(self): """Handles GET requests.""" if self.user_id is None: raise self.PageNotFoundException def _get_intro_card_color(category): return (feconf.CATEGORIES_TO_COLORS[category] if category in feconf.CATEGORIES_TO_COLORS else feconf.DEFAULT_COLOR) def _round_average_ratings(rating): return round(rating, feconf.AVERAGE_RATINGS_DASHBOARD_PRECISION) exploration_ids_subscribed_to = ( subscription_services.get_exploration_ids_subscribed_to( self.user_id)) subscribed_exploration_summaries = filter( None, (exp_services.get_exploration_summaries_matching_ids( exploration_ids_subscribed_to))) subscribed_collection_summaries = filter( None, (collection_services.get_collection_summaries_matching_ids( subscription_services.get_collection_ids_subscribed_to( self.user_id)))) exp_summary_list = summary_services.get_displayable_exp_summary_dicts( subscribed_exploration_summaries) collection_summary_list = [] feedback_thread_analytics = ( feedback_services.get_thread_analytics_multi( exploration_ids_subscribed_to)) unresolved_answers_dict = ( stats_services.get_exps_unresolved_answers_count_for_default_rule( exploration_ids_subscribed_to)) for ind, exploration in enumerate(exp_summary_list): exploration.update(feedback_thread_analytics[ind].to_dict()) exploration.update({ 'num_unresolved_answers': (unresolved_answers_dict[exploration['id']] if exploration['id'] in unresolved_answers_dict else 0) }) exp_summary_list = sorted( exp_summary_list, key=lambda x: (x['num_open_threads'], x['last_updated_msec']), reverse=True) if (self.username in config_domain.WHITELISTED_COLLECTION_EDITOR_USERNAMES.value): for collection_summary in subscribed_collection_summaries: # TODO(sll): Reuse _get_displayable_collection_summary_dicts() # in summary_services, instead of replicating it like this. collection_summary_list.append({ 'id': collection_summary.id, 'title': collection_summary.title, 'category': collection_summary.category, 'objective': collection_summary.objective, 'language_code': collection_summary.language_code, 'last_updated': utils.get_time_in_millisecs( collection_summary.collection_model_last_updated), 'created_on': utils.get_time_in_millisecs( collection_summary.collection_model_created_on), 'status': collection_summary.status, 'community_owned': collection_summary.community_owned, 'thumbnail_icon_url': (utils.get_thumbnail_icon_url_for_category( collection_summary.category)), 'thumbnail_bg_color': utils.get_hex_color_for_category( collection_summary.category), }) dashboard_stats = ( user_jobs_continuous.UserStatsAggregator.get_dashboard_stats( self.user_id)) dashboard_stats.update({ 'total_open_feedback': feedback_services.get_total_open_threads(feedback_thread_analytics) }) if dashboard_stats and dashboard_stats.get('average_ratings'): dashboard_stats['average_ratings'] = (_round_average_ratings( dashboard_stats['average_ratings'])) last_week_stats = (user_services.get_last_week_dashboard_stats( self.user_id)) if last_week_stats and last_week_stats.get('average_ratings'): last_week_stats['average_ratings'] = (_round_average_ratings( last_week_stats['average_ratings'])) self.values.update({ 'explorations_list': exp_summary_list, 'collections_list': collection_summary_list, 'dashboard_stats': dashboard_stats, 'last_week_stats': last_week_stats }) self.render_json(self.values)