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)
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)