Exemple #1
0
    def insert_data(self, stat, realm_subgroups, user_subgroups):
        # type: (CountStat, List[Optional[str]], List[str]) -> None
        if stat.frequency == CountStat.HOUR:
            insert_time = self.end_times_hour[2]
            fill_time = self.end_times_hour[-1]
        if stat.frequency == CountStat.DAY:
            insert_time = self.end_times_day[2]
            fill_time = self.end_times_day[-1]

        RealmCount.objects.bulk_create([
            RealmCount(property=stat.property,
                       subgroup=subgroup,
                       end_time=insert_time,
                       value=100 + i,
                       realm=self.realm)
            for i, subgroup in enumerate(realm_subgroups)
        ])
        UserCount.objects.bulk_create([
            UserCount(property=stat.property,
                      subgroup=subgroup,
                      end_time=insert_time,
                      value=200 + i,
                      realm=self.realm,
                      user=self.user)
            for i, subgroup in enumerate(user_subgroups)
        ])
        FillState.objects.create(property=stat.property,
                                 end_time=fill_time,
                                 state=FillState.DONE)
Exemple #2
0
def do_pull_minutes_active(property: str,
                           start_time: datetime,
                           end_time: datetime,
                           realm: Optional[Realm] = None) -> int:
    user_activity_intervals = UserActivityInterval.objects.filter(
        end__gt=start_time,
        start__lt=end_time,
    ).select_related('user_profile', ).values_list('user_profile_id',
                                                   'user_profile__realm_id',
                                                   'start', 'end')

    seconds_active: Dict[Tuple[int, int], float] = defaultdict(float)
    for user_id, realm_id, interval_start, interval_end in user_activity_intervals:
        if realm is None or realm.id == realm_id:
            start = max(start_time, interval_start)
            end = min(end_time, interval_end)
            seconds_active[(user_id,
                            realm_id)] += (end - start).total_seconds()

    rows = [
        UserCount(user_id=ids[0],
                  realm_id=ids[1],
                  property=property,
                  end_time=end_time,
                  value=int(seconds // 60))
        for ids, seconds in seconds_active.items() if seconds >= 60
    ]
    UserCount.objects.bulk_create(rows)
    return len(rows)