def get_playlist_focus_data(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"] = 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 = 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_visible_data(self, user_exercise_graph=None): data = dict( id=self.key().id(), title=self.title, created=self.created_on, created_ago=timesince_ago(self.created_on), updated=self.updated_on, updated_ago=timesince_ago(self.updated_on), completed=self.completed_on, abandoned=self.abandoned, ) if self.completed: data['completed_ago'] = timesince_ago(self.completed_on) td = self.completed_on - self.created_on completed_seconds = (td.seconds + td.days * 24 * 3600) data['completed_time'] = seconds_to_time_string(completed_seconds) data['objectives'] = [dict( type=obj.__class__.__name__, description=obj.description, progress=obj.progress, url=obj.url(), internal_id=obj.internal_id(), status=obj.get_status(user_exercise_graph=user_exercise_graph), ) for obj in self.objectives] return data
def video_time(self): if not self.video_point: return 0 else: return seconds_to_time_string(self.video_point.seconds_watched, False, english=True)
def get_exercise_activity_data(user_data, 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"][ exercise_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"] = 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_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"] = 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) 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_data, 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"] = 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 seconds_to_time_string(self.video_point.seconds_watched, False)
def extended_description(self): return ("Bekijk %s van een video" % templatefilters.seconds_to_time_string(self.seconds_required))
def time_watched(self): return seconds_to_time_string(self.seconds_watched, False)
def exercise_time(self): return seconds_to_time_string(self.time_taken, False)
def completed_time(self): td = self.completed_on - self.created_on s = td.seconds + td.days * 24 * 3600 if td.microseconds > 0: s += 1 return seconds_to_time_string(s)
def extended_description(self): return ("Blijf lid van iktel.nl voor %s" % templatefilters.seconds_to_time_string(self.seconds_required))
def extended_description(self): return u"ענו נכון על %s תרגילים וצפו ב%s של סרטונים ב%s" % (self.problems_required, seconds_to_time_string(self.video_seconds_required), seconds_to_time_string(self.seconds_allotted))
def extended_description(self): return "Correctly answer %s problems and watch %s of video in %s" % ( self.problems_required, templatefilters.seconds_to_time_string( self.video_seconds_required), templatefilters.seconds_to_time_string(self.seconds_allotted))
def extended_description(self): return u"היו חברים באקדמיית קהאן למשך %s" % seconds_to_time_string(self.seconds_required)
def extended_description(self): return ("Watch %s of video in a single topic" % seconds_to_time_string(self.seconds_required))
def extended_description(self): return "Watch %s of video" % seconds_to_time_string( self.seconds_required)
def extended_description(self): return u"צפו ב-%s של סרטונים" % seconds_to_time_string(self.seconds_required)
def extended_description(self): return u"צפו ב-%s סרטונים בנושא אחד" % seconds_to_time_string( self.seconds_required)
def extended_description(self): return "Beantwoord %s problemen correct en bekijk %s van een video (bestaande uit %s)" % ( self.problems_required, templatefilters.seconds_to_time_string( self.video_seconds_required), templatefilters.seconds_to_time_string(self.seconds_allotted))
def completed_time(self): td = self.completed_on - self.created_on s = td.seconds + td.days * 24 * 3600 if td.microseconds > 0: s += 1 return templatefilters.seconds_to_time_string(s)
def extended_description(self): return "Watch %s of video" % seconds_to_time_string(self.seconds_required)
def exercise_time(self): return seconds_to_time_string(self.time_taken, False, english=True)
def extended_description(self): return ("Watch %s of video" % templatefilters.seconds_to_time_string(self.seconds_required))
def extended_description(self): return u"היו חברים באקדמיית קהאן למשך %s" % seconds_to_time_string( self.seconds_required)
def extended_description(self): return "Remain a member of the Khan Academy for %s" % seconds_to_time_string(self.seconds_required)
def extended_description(self): return ("Remain a member of the Khan Academy for %s" % seconds_to_time_string(self.seconds_required))
def extended_description(self): return u"ענו נכון על %s תרגילים וצפו ב%s של סרטונים ב%s" % ( self.problems_required, seconds_to_time_string(self.video_seconds_required), seconds_to_time_string(self.seconds_allotted))