예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
    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
예제 #4
0
    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