def fill_class_summaries_from_logs(user_data_coach, students_data, dt_start_utc): dt_end_utc = dt_start_utc + datetime.timedelta(days = 1) # Asynchronously grab all student data at once async_queries = [] for user_data_student in students_data: query_problem_logs = ProblemLog.get_for_user_data_between_dts(user_data_student, dt_start_utc, dt_end_utc) query_video_logs = VideoLog.get_for_user_data_between_dts(user_data_student, dt_start_utc, dt_end_utc) async_queries.append(query_problem_logs) async_queries.append(query_video_logs) # Wait for all queries to finish results = util.async_queries(async_queries, limit=10000) for i, user_data_student in enumerate(students_data): logging.info("working on student "+str(user_data_student.user)) problem_and_video_logs = [] problem_logs = results[i * 2].get_result() video_logs = results[i * 2 + 1].get_result() for problem_log in problem_logs: problem_and_video_logs.append(problem_log) for video_log in video_logs: problem_and_video_logs.append(video_log) problem_and_video_logs = sorted(problem_and_video_logs, key=lambda log: log.time_started()) if problem_and_video_logs: LogSummary.add_or_update_entry(user_data_coach, problem_and_video_logs, ClassDailyActivitySummary, LogSummaryTypes.CLASS_DAILY_ACTIVITY, 1440)
def fill_class_summaries_from_logs(user_data_coach, students_data, dt_start_utc): dt_end_utc = dt_start_utc + datetime.timedelta(days=1) # Asynchronously grab all student data at once async_queries = [] for user_data_student in students_data: query_problem_logs = ProblemLog.get_for_user_data_between_dts( user_data_student, dt_start_utc, dt_end_utc) query_video_logs = VideoLog.get_for_user_data_between_dts( user_data_student, dt_start_utc, dt_end_utc) async_queries.append(query_problem_logs) async_queries.append(query_video_logs) # Wait for all queries to finish results = util.async_queries(async_queries, limit=10000) for i, user_data_student in enumerate(students_data): logging.info("working on student " + str(user_data_student.user)) problem_and_video_logs = [] problem_logs = results[i * 2].get_result() video_logs = results[i * 2 + 1].get_result() for problem_log in problem_logs: problem_and_video_logs.append(problem_log) for video_log in video_logs: problem_and_video_logs.append(video_log) problem_and_video_logs = sorted(problem_and_video_logs, key=lambda log: log.time_started()) if problem_and_video_logs: LogSummary.add_or_update_entry( user_data_coach, problem_and_video_logs, ClassDailyActivitySummary, LogSummaryTypes.CLASS_DAILY_ACTIVITY, 1440)
def get_classtime_table_by_coach(self, user_data_coach, students_data, dt_start_utc): logging.info("getting classtime table for " + str(dt_start_utc)) #ctz will be from midnight to midnight on the day they are looking at dt_start_ctz = self.dt_to_ctz(dt_start_utc) dt_end_ctz = dt_start_ctz + datetime.timedelta(days=1) classtime_table = ClassTimeTable(dt_start_ctz, dt_end_ctz) # midnight at PST is 7AM UTC and hence the coach's day in UTC goes from 7AM to 7AM the next day, spanning two different UTC days dt_end_utc = dt_start_utc + datetime.timedelta(days=1) # find the first utc days that spans the teacher's day dt_start_utc1 = datetime.datetime(dt_start_utc.year, dt_start_utc.month, dt_start_utc.day) dt_end_utc1 = dt_start_utc1 + datetime.timedelta(days=1) # get the query to get the summary shards from the first day log_summary_query_1 = LogSummary.get_by_name( LogSummary.get_name_by_dates(user_data_coach, LogSummaryTypes.CLASS_DAILY_ACTIVITY, dt_start_utc1, dt_end_utc1)) # find the second utc day that spans the teacher's day dt_start_utc2 = dt_end_utc1 dt_end_utc2 = dt_start_utc2 + datetime.timedelta(days=1) log_summary_query_2 = LogSummary.get_by_name( LogSummary.get_name_by_dates(user_data_coach, LogSummaryTypes.CLASS_DAILY_ACTIVITY, dt_start_utc2, dt_end_utc2)) results = util.async_queries( [log_summary_query_1, log_summary_query_2], limit=10000) class_summary_shards = results[0].get_result() class_summary = None if class_summary_shards: class_summary = reduce( lambda x, y: x.merge_shard(y), map(lambda x: x.summary, class_summary_shards)) class_summary_day2_shards = results[1].get_result() class_summary_day2 = None if class_summary_day2_shards: class_summary_day2 = reduce( lambda x, y: x.merge_shard(y), map(lambda x: x.summary, class_summary_day2_shards)) if class_summary_day2 is not None: if class_summary is not None: class_summary.merge_day(class_summary_day2) else: class_summary = class_summary_day2 if not class_summary: return classtime_table rows = 0 # only consider sudents that are in the coach's currently looked at list (some students might have stopped having their current coach, or we might only be interested in a coach's student_list for i, user_data_student in enumerate(students_data): # check to see if the current student has had any activity if class_summary.student_dict.has_key(user_data_student.user): # loop over all chunks of that day for adjacent_activity_summary in class_summary.student_dict[ user_data_student.user]: # make sure the chunk falls within the day specified by the coach's timezone if adjacent_activity_summary.start > dt_start_utc and adjacent_activity_summary.start < dt_end_utc: rows += 1 adjacent_activity_summary.setTimezoneOffset( self.timezone_offset) classtime_table.drop_into_column( adjacent_activity_summary, i) logging.info("summary by coach rows=" + str(rows)) return classtime_table
def get_classtime_table_by_coach(self, user_data_coach, students_data, dt_start_utc): logging.info("getting classtime table for "+str(dt_start_utc)) #ctz will be from midnight to midnight on the day they are looking at dt_start_ctz = self.dt_to_ctz(dt_start_utc) dt_end_ctz = dt_start_ctz + datetime.timedelta(days = 1) classtime_table = ClassTimeTable(dt_start_ctz, dt_end_ctz) # midnight at PST is 7AM UTC and hence the coach's day in UTC goes from 7AM to 7AM the next day, spanning two different UTC days dt_end_utc = dt_start_utc + datetime.timedelta(days = 1) # find the first utc days that spans the teacher's day dt_start_utc1 = datetime.datetime(dt_start_utc.year, dt_start_utc.month, dt_start_utc.day) dt_end_utc1 = dt_start_utc1 + datetime.timedelta(days = 1) # get the query to get the summary shards from the first day log_summary_query_1 = LogSummary.get_by_name(LogSummary.get_name_by_dates(user_data_coach, LogSummaryTypes.CLASS_DAILY_ACTIVITY, dt_start_utc1, dt_end_utc1)) # find the second utc day that spans the teacher's day dt_start_utc2 = dt_end_utc1 dt_end_utc2 = dt_start_utc2 + datetime.timedelta(days = 1) log_summary_query_2 = LogSummary.get_by_name(LogSummary.get_name_by_dates(user_data_coach, LogSummaryTypes.CLASS_DAILY_ACTIVITY, dt_start_utc2, dt_end_utc2)) results = util.async_queries([log_summary_query_1, log_summary_query_2], limit = 10000) class_summary_shards = results[0].get_result() class_summary = None if class_summary_shards: class_summary = reduce(lambda x, y: x.merge_shard(y), map(lambda x: x.summary, class_summary_shards)) class_summary_day2_shards = results[1].get_result() class_summary_day2 = None if class_summary_day2_shards: class_summary_day2 = reduce(lambda x, y: x.merge_shard(y), map(lambda x: x.summary, class_summary_day2_shards)) if class_summary_day2 is not None: if class_summary is not None : class_summary.merge_day(class_summary_day2) else: class_summary = class_summary_day2 if not class_summary: return classtime_table rows = 0 # only consider sudents that are in the coach's currently looked at list (some students might have stopped having their current coach, or we might only be interested in a coach's student_list for i, user_data_student in enumerate(students_data): # check to see if the current student has had any activity if class_summary.student_dict.has_key(user_data_student.user): # loop over all chunks of that day for adjacent_activity_summary in class_summary.student_dict[user_data_student.user]: # make sure the chunk falls within the day specified by the coach's timezone if adjacent_activity_summary.start > dt_start_utc and adjacent_activity_summary.start < dt_end_utc: rows += 1 adjacent_activity_summary.setTimezoneOffset(self.timezone_offset) classtime_table.drop_into_column(adjacent_activity_summary, i) logging.info("summary by coach rows="+str(rows)) return classtime_table