def analyze_activity(options: Dict[str, Any]) -> None: day_start = datetime.datetime.strptime( options["date"], "%Y-%m-%d").replace(tzinfo=datetime.timezone.utc) day_end = day_start + datetime.timedelta(days=options["duration"]) user_profile_query = UserProfile.objects.all() if options["realm"]: user_profile_query = user_profile_query.filter( realm__string_id=options["realm"]) print("Per-user online duration:\n") total_duration = datetime.timedelta(0) for user_profile in user_profile_query: duration = seconds_usage_between(user_profile, day_start, day_end) if duration == datetime.timedelta(0): continue total_duration += duration print("%-*s%s" % ( 37, user_profile.email, duration, )) print("\nTotal Duration: %s" % (total_duration, )) print("\nTotal Duration in minutes: %s" % (total_duration.total_seconds() / 60., )) print("Total Duration amortized to a month: %s" % (total_duration.total_seconds() * 30. / 60., ))
def analyze_activity(options: Dict[str, Any]) -> None: day_start = datetime.datetime.strptime(options["date"], "%Y-%m-%d").replace(tzinfo=utc) day_end = day_start + datetime.timedelta(days=options["duration"]) user_profile_query = UserProfile.objects.all() if options["realm"]: user_profile_query = user_profile_query.filter(realm__string_id=options["realm"]) print("Per-user online duration:\n") total_duration = datetime.timedelta(0) for user_profile in user_profile_query: duration = seconds_usage_between(user_profile, day_start, day_end) if duration == datetime.timedelta(0): continue total_duration += duration print("%-*s%s" % (37, user_profile.email, duration,)) print("\nTotal Duration: %s" % (total_duration,)) print("\nTotal Duration in minutes: %s" % (total_duration.total_seconds() / 60.,)) print("Total Duration amortized to a month: %s" % (total_duration.total_seconds() * 30. / 60.,))
def test_new_user_input(self) -> None: """Mostly a test for UserActivityInterval""" user_profile = self.example_user("hamlet") self.login(self.example_email("hamlet")) self.assertEqual( UserActivityInterval.objects.filter( user_profile=user_profile).count(), 0) time_zero = timezone_now().replace(microsecond=0) with mock.patch('zerver.views.presence.timezone_now', return_value=time_zero): result = self.client_post("/json/users/me/presence", { 'status': 'active', 'new_user_input': 'true' }) self.assert_json_success(result) self.assertEqual( UserActivityInterval.objects.filter( user_profile=user_profile).count(), 1) interval = UserActivityInterval.objects.get(user_profile=user_profile) self.assertEqual(interval.start, time_zero) self.assertEqual(interval.end, time_zero + UserActivityInterval.MIN_INTERVAL_LENGTH) second_time = time_zero + timedelta(seconds=600) # Extent the interval with mock.patch('zerver.views.presence.timezone_now', return_value=second_time): result = self.client_post("/json/users/me/presence", { 'status': 'active', 'new_user_input': 'true' }) self.assert_json_success(result) self.assertEqual( UserActivityInterval.objects.filter( user_profile=user_profile).count(), 1) interval = UserActivityInterval.objects.get(user_profile=user_profile) self.assertEqual(interval.start, time_zero) self.assertEqual( interval.end, second_time + UserActivityInterval.MIN_INTERVAL_LENGTH) third_time = time_zero + timedelta(seconds=6000) with mock.patch('zerver.views.presence.timezone_now', return_value=third_time): result = self.client_post("/json/users/me/presence", { 'status': 'active', 'new_user_input': 'true' }) self.assert_json_success(result) self.assertEqual( UserActivityInterval.objects.filter( user_profile=user_profile).count(), 2) interval = UserActivityInterval.objects.filter( user_profile=user_profile).order_by('start')[0] self.assertEqual(interval.start, time_zero) self.assertEqual( interval.end, second_time + UserActivityInterval.MIN_INTERVAL_LENGTH) interval = UserActivityInterval.objects.filter( user_profile=user_profile).order_by('start')[1] self.assertEqual(interval.start, third_time) self.assertEqual(interval.end, third_time + UserActivityInterval.MIN_INTERVAL_LENGTH) self.assertEqual( seconds_usage_between(user_profile, time_zero, third_time).total_seconds(), 1500) self.assertEqual( seconds_usage_between(user_profile, time_zero, third_time + timedelta(seconds=10)).total_seconds(), 1510) self.assertEqual( seconds_usage_between(user_profile, time_zero, third_time + timedelta(seconds=1000)).total_seconds(), 2400) self.assertEqual( seconds_usage_between(user_profile, time_zero, third_time - timedelta(seconds=100)).total_seconds(), 1500) self.assertEqual( seconds_usage_between( user_profile, time_zero + timedelta(seconds=100), third_time - timedelta(seconds=100)).total_seconds(), 1400) self.assertEqual( seconds_usage_between( user_profile, time_zero + timedelta(seconds=1200), third_time - timedelta(seconds=100)).total_seconds(), 300) # Now test /activity with actual data user_profile.is_staff = True user_profile.save() result = self.client_get('/activity') self.assertEqual(result.status_code, 200)
def test_new_user_input(self) -> None: """Mostly a test for UserActivityInterval""" user_profile = self.example_user("hamlet") self.login(self.example_email("hamlet")) self.assertEqual(UserActivityInterval.objects.filter(user_profile=user_profile).count(), 0) time_zero = timezone_now().replace(microsecond=0) with mock.patch('zerver.views.presence.timezone_now', return_value=time_zero): result = self.client_post("/json/users/me/presence", {'status': 'active', 'new_user_input': 'true'}) self.assert_json_success(result) self.assertEqual(UserActivityInterval.objects.filter(user_profile=user_profile).count(), 1) interval = UserActivityInterval.objects.get(user_profile=user_profile) self.assertEqual(interval.start, time_zero) self.assertEqual(interval.end, time_zero + UserActivityInterval.MIN_INTERVAL_LENGTH) second_time = time_zero + timedelta(seconds=600) # Extent the interval with mock.patch('zerver.views.presence.timezone_now', return_value=second_time): result = self.client_post("/json/users/me/presence", {'status': 'active', 'new_user_input': 'true'}) self.assert_json_success(result) self.assertEqual(UserActivityInterval.objects.filter(user_profile=user_profile).count(), 1) interval = UserActivityInterval.objects.get(user_profile=user_profile) self.assertEqual(interval.start, time_zero) self.assertEqual(interval.end, second_time + UserActivityInterval.MIN_INTERVAL_LENGTH) third_time = time_zero + timedelta(seconds=6000) with mock.patch('zerver.views.presence.timezone_now', return_value=third_time): result = self.client_post("/json/users/me/presence", {'status': 'active', 'new_user_input': 'true'}) self.assert_json_success(result) self.assertEqual(UserActivityInterval.objects.filter(user_profile=user_profile).count(), 2) interval = UserActivityInterval.objects.filter(user_profile=user_profile).order_by('start')[0] self.assertEqual(interval.start, time_zero) self.assertEqual(interval.end, second_time + UserActivityInterval.MIN_INTERVAL_LENGTH) interval = UserActivityInterval.objects.filter(user_profile=user_profile).order_by('start')[1] self.assertEqual(interval.start, third_time) self.assertEqual(interval.end, third_time + UserActivityInterval.MIN_INTERVAL_LENGTH) self.assertEqual( seconds_usage_between( user_profile, time_zero, third_time).total_seconds(), 1500) self.assertEqual( seconds_usage_between( user_profile, time_zero, third_time+timedelta(seconds=10)).total_seconds(), 1510) self.assertEqual( seconds_usage_between( user_profile, time_zero, third_time+timedelta(seconds=1000)).total_seconds(), 2400) self.assertEqual( seconds_usage_between( user_profile, time_zero, third_time - timedelta(seconds=100)).total_seconds(), 1500) self.assertEqual( seconds_usage_between( user_profile, time_zero + timedelta(seconds=100), third_time - timedelta(seconds=100)).total_seconds(), 1400) self.assertEqual( seconds_usage_between( user_profile, time_zero + timedelta(seconds=1200), third_time - timedelta(seconds=100)).total_seconds(), 300) # Now test /activity with actual data user_profile.is_staff = True user_profile.save() result = self.client_get('/activity') self.assertEqual(result.status_code, 200)