def get_playlist_focus_data(user, daily_activity_logs, dt_start_utc, dt_end_utc): total_seconds = 0 dict_playlist_seconds = {} for daily_activity_log in daily_activity_logs: activity_summary = daily_activity_log.activity_summary for hour in activity_summary.hourly_summaries: hourly_activity_summary = activity_summary.hourly_summaries[hour] # We need to filter for dates outside of our range here because we expanded our DB query # to make sure we got the entire client time zone date range if hourly_activity_summary.date < dt_start_utc or hourly_activity_summary.date > dt_end_utc: continue for video_key in hourly_activity_summary.dict_videos.keys(): hourly_activity_summary_video_item = hourly_activity_summary.dict_videos[video_key] playlist_title = "Other" if hourly_activity_summary_video_item.playlist_titles: playlist_title = hourly_activity_summary_video_item.playlist_titles[0] # Only count against the first playlist for now key_playlist = playlist_title.lower() if dict_playlist_seconds.has_key(key_playlist): dict_playlist_seconds[key_playlist]["seconds"] += hourly_activity_summary_video_item.seconds_watched else: dict_playlist_seconds[key_playlist] = {"playlist_title": playlist_title, "seconds": hourly_activity_summary_video_item.seconds_watched, "videos": {}} key_video = hourly_activity_summary_video_item.video_title.lower() if dict_playlist_seconds[key_playlist]["videos"].has_key(key_video): dict_playlist_seconds[key_playlist]["videos"][key_video]["seconds"] += hourly_activity_summary_video_item.seconds_watched else: dict_playlist_seconds[key_playlist]["videos"][key_video] = {"video_title": hourly_activity_summary_video_item.video_title, "seconds": hourly_activity_summary_video_item.seconds_watched} total_seconds += hourly_activity_summary_video_item.seconds_watched for key_playlist in dict_playlist_seconds: dict_playlist_seconds[key_playlist]["percentage"] = 0 if total_seconds > 0: dict_playlist_seconds[key_playlist]["percentage"] = int(float(dict_playlist_seconds[key_playlist]["seconds"]) / float(total_seconds) * 100.0) dict_playlist_seconds[key_playlist]["time_spent"] = util.seconds_to_time_string(dict_playlist_seconds[key_playlist]["seconds"], False) tooltip_more = "" c_videos_tooltip = 0 c_videos_tooltip_max = 8 for key_video in dict_playlist_seconds[key_playlist]["videos"]: if c_videos_tooltip < c_videos_tooltip_max: video_title = dict_playlist_seconds[key_playlist]["videos"][key_video]["video_title"] time_spent = util.seconds_to_time_string(dict_playlist_seconds[key_playlist]["videos"][key_video]["seconds"], False) tooltip_more += "<em>%s</em><br> - %s" % (video_title, time_spent) + "<br/>" elif c_videos_tooltip == c_videos_tooltip_max: tooltip_more += "<em>...and %d more</em>" % (len(dict_playlist_seconds[key_playlist]["videos"]) - c_videos_tooltip_max) c_videos_tooltip += 1 dict_playlist_seconds[key_playlist]["tooltip_more"] = tooltip_more return (total_seconds, dict_playlist_seconds)
def get_exercise_activity_data(user, bucket_list, bucket_type, daily_activity_logs, dt_start_utc, dt_end_utc, tz_offset): dict_bucket = get_empty_dict_bucket(bucket_list) for daily_activity_log in daily_activity_logs: activity_summary = daily_activity_log.activity_summary for hour in activity_summary.hourly_summaries: hourly_activity_summary = activity_summary.hourly_summaries[hour] # We need to filter for dates outside of our range here because we expanded our DB query # to make sure we got the entire client time zone date range if hourly_activity_summary.date < dt_start_utc or hourly_activity_summary.date > dt_end_utc: continue key = get_bucket_value(hourly_activity_summary.date, tz_offset, bucket_type) if not dict_bucket.has_key( key) or not hourly_activity_summary.has_exercise_activity( ): continue if not dict_bucket[key]: dict_bucket[key] = { "minutes": 0, "seconds": 0, "points": 0, "exercise_names": {} } for exercise_key in hourly_activity_summary.dict_exercises.keys(): activity_summary_exercise_item = hourly_activity_summary.dict_exercises[ exercise_key] dict_bucket[key]["minutes"] += ( activity_summary_exercise_item.time_taken / 60.0) dict_bucket[key][ "seconds"] += activity_summary_exercise_item.time_taken dict_bucket[key][ "points"] += activity_summary_exercise_item.points_earned dict_bucket[key]["exercise_names"][ models.Exercise.to_display_name( activity_summary_exercise_item.exercise)] = True for bucket in bucket_list: if dict_bucket[bucket]: dict_bucket[bucket]["time_spent"] = util.seconds_to_time_string( dict_bucket[bucket]["seconds"], False) add_bucket_html_summary(dict_bucket, "exercise_names", 5) return dict_bucket
def get_exercise_focus_data(user, user_data, daily_activity_logs, dt_start_utc, dt_end_utc): total_seconds = 0 dict_exercise_seconds = {} for daily_activity_log in daily_activity_logs: activity_summary = daily_activity_log.activity_summary for hour in activity_summary.hourly_summaries: hourly_activity_summary = activity_summary.hourly_summaries[hour] # We need to filter for dates outside of our range here because we expanded our DB query # to make sure we got the entire client time zone date range if hourly_activity_summary.date < dt_start_utc or hourly_activity_summary.date > dt_end_utc: continue for exercise_key in hourly_activity_summary.dict_exercises.keys(): hourly_activity_summary_exercise_item = hourly_activity_summary.dict_exercises[exercise_key] exid = hourly_activity_summary_exercise_item.exercise key_exercise = exid.lower() if not dict_exercise_seconds.has_key(key_exercise): dict_exercise_seconds[key_exercise] = {"exercise_title": models.Exercise.to_display_name(exid), "exid": exid, "seconds": 0, "correct": 0, "problems": 0} dict_exercise_seconds[key_exercise]["seconds"] += hourly_activity_summary_exercise_item.time_taken dict_exercise_seconds[key_exercise]["problems"] += hourly_activity_summary_exercise_item.c_problems dict_exercise_seconds[key_exercise]["correct"] += hourly_activity_summary_exercise_item.c_correct total_seconds += hourly_activity_summary_exercise_item.time_taken keys = dict_exercise_seconds.keys() for key_exercise in keys: percentage = 0 if total_seconds > 0: percentage = int(float(dict_exercise_seconds[key_exercise]["seconds"]) / float(total_seconds) * 100.0) if percentage: dict_exercise_seconds[key_exercise]["percentage"] = percentage dict_exercise_seconds[key_exercise]["time_spent"] = util.seconds_to_time_string(dict_exercise_seconds[key_exercise]["seconds"], False) correct = dict_exercise_seconds[key_exercise]["correct"] dict_exercise_seconds[key_exercise]["s_correct_problems"] = "%d correct problem%s without a hint" % (correct, pluralize(correct)) problems = dict_exercise_seconds[key_exercise]["problems"] dict_exercise_seconds[key_exercise]["s_problems"] = "%d total problem%s" % (problems, pluralize(problems)) dict_exercise_seconds[key_exercise]["proficient"] = user_data.is_proficient_at(key_exercise, user) else: # Don't bother showing 0 percentage exercises del dict_exercise_seconds[key_exercise] return (total_seconds, dict_exercise_seconds)
def get_exercise_activity_data(user, bucket_list, bucket_type, daily_activity_logs, dt_start_utc, dt_end_utc, tz_offset): dict_bucket = get_empty_dict_bucket(bucket_list) for daily_activity_log in daily_activity_logs: activity_summary = daily_activity_log.activity_summary for hour in activity_summary.hourly_summaries: hourly_activity_summary = activity_summary.hourly_summaries[hour] # We need to filter for dates outside of our range here because we expanded our DB query # to make sure we got the entire client time zone date range if hourly_activity_summary.date < dt_start_utc or hourly_activity_summary.date > dt_end_utc: continue key = get_bucket_value(hourly_activity_summary.date, tz_offset, bucket_type) if not dict_bucket.has_key(key) or not hourly_activity_summary.has_exercise_activity(): continue; if not dict_bucket[key]: dict_bucket[key] = {"minutes": 0, "seconds": 0, "points": 0, "exercise_names": {}} for exercise_key in hourly_activity_summary.dict_exercises.keys(): activity_summary_exercise_item = hourly_activity_summary.dict_exercises[exercise_key] dict_bucket[key]["minutes"] += (activity_summary_exercise_item.time_taken / 60.0) dict_bucket[key]["seconds"] += activity_summary_exercise_item.time_taken dict_bucket[key]["points"] += activity_summary_exercise_item.points_earned dict_bucket[key]["exercise_names"][models.Exercise.to_display_name(activity_summary_exercise_item.exercise)] = True for bucket in bucket_list: if dict_bucket[bucket]: dict_bucket[bucket]["time_spent"] = util.seconds_to_time_string(dict_bucket[bucket]["seconds"], False) add_bucket_html_summary(dict_bucket, "exercise_names", 5) return dict_bucket
def video_time(self): if not self.video_point: return 0 else: return util.seconds_to_time_string(self.video_point.seconds_watched, False)
def exercise_time(self): return util.seconds_to_time_string(self.time_taken, False)
def time_watched(self): return util.seconds_to_time_string(self.seconds_watched, False)
def get_exercise_focus_data(user, user_data, daily_activity_logs, dt_start_utc, dt_end_utc): total_seconds = 0 dict_exercise_seconds = {} for daily_activity_log in daily_activity_logs: activity_summary = daily_activity_log.activity_summary for hour in activity_summary.hourly_summaries: hourly_activity_summary = activity_summary.hourly_summaries[hour] # We need to filter for dates outside of our range here because we expanded our DB query # to make sure we got the entire client time zone date range if hourly_activity_summary.date < dt_start_utc or hourly_activity_summary.date > dt_end_utc: continue for exercise_key in hourly_activity_summary.dict_exercises.keys(): hourly_activity_summary_exercise_item = hourly_activity_summary.dict_exercises[ exercise_key] exid = hourly_activity_summary_exercise_item.exercise key_exercise = exid.lower() if not dict_exercise_seconds.has_key(key_exercise): dict_exercise_seconds[key_exercise] = { "exercise_title": models.Exercise.to_display_name(exid), "exid": exid, "seconds": 0, "correct": 0, "problems": 0 } dict_exercise_seconds[key_exercise][ "seconds"] += hourly_activity_summary_exercise_item.time_taken dict_exercise_seconds[key_exercise][ "problems"] += hourly_activity_summary_exercise_item.c_problems dict_exercise_seconds[key_exercise][ "correct"] += hourly_activity_summary_exercise_item.c_correct total_seconds += hourly_activity_summary_exercise_item.time_taken keys = dict_exercise_seconds.keys() for key_exercise in keys: percentage = int( float(dict_exercise_seconds[key_exercise]["seconds"]) / float(total_seconds) * 100.0) if percentage: dict_exercise_seconds[key_exercise]["percentage"] = percentage dict_exercise_seconds[key_exercise][ "time_spent"] = util.seconds_to_time_string( dict_exercise_seconds[key_exercise]["seconds"], False) correct = dict_exercise_seconds[key_exercise]["correct"] dict_exercise_seconds[key_exercise][ "s_correct_problems"] = "%d correct problem%s without a hint" % ( correct, pluralize(correct)) problems = dict_exercise_seconds[key_exercise]["problems"] dict_exercise_seconds[key_exercise][ "s_problems"] = "%d total problem%s" % (problems, pluralize(problems)) dict_exercise_seconds[key_exercise][ "proficient"] = user_data.is_proficient_at(key_exercise, user) else: # Don't bother showing 0 percentage exercises del dict_exercise_seconds[key_exercise] return (total_seconds, dict_exercise_seconds)
def get_playlist_focus_data(user, daily_activity_logs, dt_start_utc, dt_end_utc): total_seconds = 0 dict_playlist_seconds = {} for daily_activity_log in daily_activity_logs: activity_summary = daily_activity_log.activity_summary for hour in activity_summary.hourly_summaries: hourly_activity_summary = activity_summary.hourly_summaries[hour] # We need to filter for dates outside of our range here because we expanded our DB query # to make sure we got the entire client time zone date range if hourly_activity_summary.date < dt_start_utc or hourly_activity_summary.date > dt_end_utc: continue for video_key in hourly_activity_summary.dict_videos.keys(): hourly_activity_summary_video_item = hourly_activity_summary.dict_videos[ video_key] playlist_title = "Other" if hourly_activity_summary_video_item.playlist_titles: playlist_title = hourly_activity_summary_video_item.playlist_titles[ 0] # Only count against the first playlist for now key_playlist = playlist_title.lower() if dict_playlist_seconds.has_key(key_playlist): dict_playlist_seconds[key_playlist][ "seconds"] += hourly_activity_summary_video_item.seconds_watched else: dict_playlist_seconds[key_playlist] = { "playlist_title": playlist_title, "seconds": hourly_activity_summary_video_item.seconds_watched, "videos": {} } key_video = hourly_activity_summary_video_item.video_title.lower( ) if dict_playlist_seconds[key_playlist]["videos"].has_key( key_video): dict_playlist_seconds[key_playlist]["videos"][key_video][ "seconds"] += hourly_activity_summary_video_item.seconds_watched else: dict_playlist_seconds[key_playlist]["videos"][ key_video] = { "video_title": hourly_activity_summary_video_item.video_title, "seconds": hourly_activity_summary_video_item.seconds_watched } total_seconds += hourly_activity_summary_video_item.seconds_watched for key_playlist in dict_playlist_seconds: dict_playlist_seconds[key_playlist]["percentage"] = int( float(dict_playlist_seconds[key_playlist]["seconds"]) / float(total_seconds) * 100.0) dict_playlist_seconds[key_playlist][ "time_spent"] = util.seconds_to_time_string( dict_playlist_seconds[key_playlist]["seconds"], False) tooltip_more = "" c_videos_tooltip = 0 c_videos_tooltip_max = 8 for key_video in dict_playlist_seconds[key_playlist]["videos"]: if c_videos_tooltip < c_videos_tooltip_max: video_title = dict_playlist_seconds[key_playlist]["videos"][ key_video]["video_title"] time_spent = util.seconds_to_time_string( dict_playlist_seconds[key_playlist]["videos"][key_video] ["seconds"], False) tooltip_more += "<em>%s</em><br> - %s" % (video_title, time_spent) + "<br/>" elif c_videos_tooltip == c_videos_tooltip_max: tooltip_more += "<em>...and %d more</em>" % ( len(dict_playlist_seconds[key_playlist]["videos"]) - c_videos_tooltip_max) c_videos_tooltip += 1 dict_playlist_seconds[key_playlist]["tooltip_more"] = tooltip_more return (total_seconds, dict_playlist_seconds)
def extended_description(self): return "Correctly answer %s problems and watch %s of video in %s" % (self.problems_required, util.seconds_to_time_string(self.video_seconds_required), util.seconds_to_time_string(self.seconds_allotted))
def extended_description(self): return "Remain an active member of the Khan Academy for %s" % util.seconds_to_time_string( self.seconds_required)
def video_time(self): if not self.video_point: return 0 else: return util.seconds_to_time_string( self.video_point.seconds_watched, False)
def timesince_ago_short(content): if not content: return "" return append_ago(util.seconds_to_time_string(util.seconds_since(content)))
def extended_description(self): return "Remain an active member of the Khan Academy for %s" % util.seconds_to_time_string(self.seconds_required)
def extended_description(self): return "Watch %s of video in a single playlist" % util.seconds_to_time_string(self.seconds_required)