mirror of https://github.com/zulip/zulip.git
analytics: Wrap some longer lines.
This commit is contained in:
parent
d1689b5884
commit
a0cfe45150
|
@ -8,7 +8,8 @@ from zerver.lib.timestamp import floor_to_day, floor_to_hour, verify_UTC
|
||||||
# If min_length is greater than 0, pads the list to the left.
|
# If min_length is greater than 0, pads the list to the left.
|
||||||
# So informally, time_range(Sep 20, Sep 22, day, None) returns [Sep 20, Sep 21, Sep 22],
|
# So informally, time_range(Sep 20, Sep 22, day, None) returns [Sep 20, Sep 21, Sep 22],
|
||||||
# and time_range(Sep 20, Sep 22, day, 5) returns [Sep 18, Sep 19, Sep 20, Sep 21, Sep 22]
|
# and time_range(Sep 20, Sep 22, day, 5) returns [Sep 18, Sep 19, Sep 20, Sep 21, Sep 22]
|
||||||
def time_range(start: datetime, end: datetime, frequency: str, min_length: Optional[int]) -> List[datetime]:
|
def time_range(start: datetime, end: datetime, frequency: str,
|
||||||
|
min_length: Optional[int]) -> List[datetime]:
|
||||||
verify_UTC(start)
|
verify_UTC(start)
|
||||||
verify_UTC(end)
|
verify_UTC(end)
|
||||||
if frequency == CountStat.HOUR:
|
if frequency == CountStat.HOUR:
|
||||||
|
|
|
@ -103,7 +103,8 @@ class AnalyticsTestCase(TestCase):
|
||||||
queryset = queryset.filter(subgroup=subgroup)
|
queryset = queryset.filter(subgroup=subgroup)
|
||||||
self.assertEqual(queryset.values_list('value', flat=True)[0], value)
|
self.assertEqual(queryset.values_list('value', flat=True)[0], value)
|
||||||
|
|
||||||
def assertTableState(self, table: Type[BaseCount], arg_keys: List[str], arg_values: List[List[object]]) -> None:
|
def assertTableState(self, table: Type[BaseCount], arg_keys: List[str],
|
||||||
|
arg_values: List[List[object]]) -> None:
|
||||||
"""Assert that the state of a *Count table is what it should be.
|
"""Assert that the state of a *Count table is what it should be.
|
||||||
|
|
||||||
Example usage:
|
Example usage:
|
||||||
|
@ -153,7 +154,8 @@ class TestProcessCountStat(AnalyticsTestCase):
|
||||||
VALUES (%s, 1, '%s', %%%%(time_end)s)""" % (self.default_realm.id, property)
|
VALUES (%s, 1, '%s', %%%%(time_end)s)""" % (self.default_realm.id, property)
|
||||||
return CountStat(property, sql_data_collector(RealmCount, query, None), CountStat.HOUR)
|
return CountStat(property, sql_data_collector(RealmCount, query, None), CountStat.HOUR)
|
||||||
|
|
||||||
def assertFillStateEquals(self, stat: CountStat, end_time: datetime, state: int=FillState.DONE) -> None:
|
def assertFillStateEquals(self, stat: CountStat, end_time: datetime,
|
||||||
|
state: int=FillState.DONE) -> None:
|
||||||
fill_state = FillState.objects.filter(property=stat.property).first()
|
fill_state = FillState.objects.filter(property=stat.property).first()
|
||||||
self.assertEqual(fill_state.end_time, end_time)
|
self.assertEqual(fill_state.end_time, end_time)
|
||||||
self.assertEqual(fill_state.state, state)
|
self.assertEqual(fill_state.state, state)
|
||||||
|
@ -216,9 +218,13 @@ class TestProcessCountStat(AnalyticsTestCase):
|
||||||
self.assertTableState(UserCount, ['property', 'value'], [[user_stat.property, 5]])
|
self.assertTableState(UserCount, ['property', 'value'], [[user_stat.property, 5]])
|
||||||
self.assertTableState(StreamCount, ['property', 'value'], [[stream_stat.property, 5]])
|
self.assertTableState(StreamCount, ['property', 'value'], [[stream_stat.property, 5]])
|
||||||
self.assertTableState(RealmCount, ['property', 'value'],
|
self.assertTableState(RealmCount, ['property', 'value'],
|
||||||
[[user_stat.property, 5], [stream_stat.property, 5], [realm_stat.property, 5]])
|
[[user_stat.property, 5],
|
||||||
|
[stream_stat.property, 5],
|
||||||
|
[realm_stat.property, 5]])
|
||||||
self.assertTableState(InstallationCount, ['property', 'value'],
|
self.assertTableState(InstallationCount, ['property', 'value'],
|
||||||
[[user_stat.property, 5], [stream_stat.property, 5], [realm_stat.property, 5]])
|
[[user_stat.property, 5],
|
||||||
|
[stream_stat.property, 5],
|
||||||
|
[realm_stat.property, 5]])
|
||||||
|
|
||||||
# Change the logged data and mark FillState as dirty
|
# Change the logged data and mark FillState as dirty
|
||||||
UserCount.objects.update(value=6)
|
UserCount.objects.update(value=6)
|
||||||
|
@ -232,16 +238,21 @@ class TestProcessCountStat(AnalyticsTestCase):
|
||||||
self.assertTableState(UserCount, ['property', 'value'], [[user_stat.property, 6]])
|
self.assertTableState(UserCount, ['property', 'value'], [[user_stat.property, 6]])
|
||||||
self.assertTableState(StreamCount, ['property', 'value'], [[stream_stat.property, 6]])
|
self.assertTableState(StreamCount, ['property', 'value'], [[stream_stat.property, 6]])
|
||||||
self.assertTableState(RealmCount, ['property', 'value'],
|
self.assertTableState(RealmCount, ['property', 'value'],
|
||||||
[[user_stat.property, 6], [stream_stat.property, 6], [realm_stat.property, 6]])
|
[[user_stat.property, 6],
|
||||||
|
[stream_stat.property, 6],
|
||||||
|
[realm_stat.property, 6]])
|
||||||
self.assertTableState(InstallationCount, ['property', 'value'],
|
self.assertTableState(InstallationCount, ['property', 'value'],
|
||||||
[[user_stat.property, 6], [stream_stat.property, 6], [realm_stat.property, 6]])
|
[[user_stat.property, 6],
|
||||||
|
[stream_stat.property, 6],
|
||||||
|
[realm_stat.property, 6]])
|
||||||
|
|
||||||
def test_process_dependent_stat(self) -> None:
|
def test_process_dependent_stat(self) -> None:
|
||||||
stat1 = self.make_dummy_count_stat('stat1')
|
stat1 = self.make_dummy_count_stat('stat1')
|
||||||
stat2 = self.make_dummy_count_stat('stat2')
|
stat2 = self.make_dummy_count_stat('stat2')
|
||||||
query = """INSERT INTO analytics_realmcount (realm_id, value, property, end_time)
|
query = """INSERT INTO analytics_realmcount (realm_id, value, property, end_time)
|
||||||
VALUES (%s, 1, '%s', %%%%(time_end)s)""" % (self.default_realm.id, 'stat3')
|
VALUES (%s, 1, '%s', %%%%(time_end)s)""" % (self.default_realm.id, 'stat3')
|
||||||
stat3 = DependentCountStat('stat3', sql_data_collector(RealmCount, query, None), CountStat.HOUR,
|
stat3 = DependentCountStat('stat3', sql_data_collector(RealmCount, query, None),
|
||||||
|
CountStat.HOUR,
|
||||||
dependencies=['stat1', 'stat2'])
|
dependencies=['stat1', 'stat2'])
|
||||||
hour = [installation_epoch() + i*self.HOUR for i in range(5)]
|
hour = [installation_epoch() + i*self.HOUR for i in range(5)]
|
||||||
|
|
||||||
|
@ -274,7 +285,8 @@ class TestProcessCountStat(AnalyticsTestCase):
|
||||||
# test daily dependent stat with hourly dependencies
|
# test daily dependent stat with hourly dependencies
|
||||||
query = """INSERT INTO analytics_realmcount (realm_id, value, property, end_time)
|
query = """INSERT INTO analytics_realmcount (realm_id, value, property, end_time)
|
||||||
VALUES (%s, 1, '%s', %%%%(time_end)s)""" % (self.default_realm.id, 'stat4')
|
VALUES (%s, 1, '%s', %%%%(time_end)s)""" % (self.default_realm.id, 'stat4')
|
||||||
stat4 = DependentCountStat('stat4', sql_data_collector(RealmCount, query, None), CountStat.DAY,
|
stat4 = DependentCountStat('stat4', sql_data_collector(RealmCount, query, None),
|
||||||
|
CountStat.DAY,
|
||||||
dependencies=['stat1', 'stat2'])
|
dependencies=['stat1', 'stat2'])
|
||||||
hour24 = installation_epoch() + 24*self.HOUR
|
hour24 = installation_epoch() + 24*self.HOUR
|
||||||
hour25 = installation_epoch() + 25*self.HOUR
|
hour25 = installation_epoch() + 25*self.HOUR
|
||||||
|
@ -332,7 +344,9 @@ class TestCountStats(AnalyticsTestCase):
|
||||||
[[2, 'true'], [1, 'false'],
|
[[2, 'true'], [1, 'false'],
|
||||||
[3, 'false', self.second_realm],
|
[3, 'false', self.second_realm],
|
||||||
[1, 'false', self.no_message_realm]])
|
[1, 'false', self.no_message_realm]])
|
||||||
self.assertTableState(InstallationCount, ['value', 'subgroup'], [[2, 'true'], [5, 'false']])
|
self.assertTableState(InstallationCount,
|
||||||
|
['value', 'subgroup'],
|
||||||
|
[[2, 'true'], [5, 'false']])
|
||||||
self.assertTableState(UserCount, [], [])
|
self.assertTableState(UserCount, [], [])
|
||||||
self.assertTableState(StreamCount, [], [])
|
self.assertTableState(StreamCount, [], [])
|
||||||
|
|
||||||
|
@ -343,7 +357,8 @@ class TestCountStats(AnalyticsTestCase):
|
||||||
bot = self.create_user(is_bot=True)
|
bot = self.create_user(is_bot=True)
|
||||||
human1 = self.create_user()
|
human1 = self.create_user()
|
||||||
human2 = self.create_user()
|
human2 = self.create_user()
|
||||||
recipient_human1 = Recipient.objects.create(type_id=human1.id, type=Recipient.PERSONAL)
|
recipient_human1 = Recipient.objects.create(type_id=human1.id,
|
||||||
|
type=Recipient.PERSONAL)
|
||||||
|
|
||||||
recipient_stream = self.create_stream_with_recipient()[1]
|
recipient_stream = self.create_stream_with_recipient()[1]
|
||||||
recipient_huddle = self.create_huddle_with_recipient()[1]
|
recipient_huddle = self.create_huddle_with_recipient()[1]
|
||||||
|
@ -517,7 +532,8 @@ class TestCountStats(AnalyticsTestCase):
|
||||||
self.assertTableState(InstallationCount, ['value', 'subgroup'], [[5, 'false'], [2, 'true']])
|
self.assertTableState(InstallationCount, ['value', 'subgroup'], [[5, 'false'], [2, 'true']])
|
||||||
self.assertTableState(UserCount, [], [])
|
self.assertTableState(UserCount, [], [])
|
||||||
|
|
||||||
def create_interval(self, user: UserProfile, start_offset: timedelta, end_offset: timedelta) -> None:
|
def create_interval(self, user: UserProfile, start_offset: timedelta,
|
||||||
|
end_offset: timedelta) -> None:
|
||||||
UserActivityInterval.objects.create(
|
UserActivityInterval.objects.create(
|
||||||
user_profile=user, start=self.TIME_ZERO-start_offset,
|
user_profile=user, start=self.TIME_ZERO-start_offset,
|
||||||
end=self.TIME_ZERO-end_offset)
|
end=self.TIME_ZERO-end_offset)
|
||||||
|
@ -786,7 +802,8 @@ class TestActiveUsersAudit(AnalyticsTestCase):
|
||||||
self.stat = COUNT_STATS['active_users_audit:is_bot:day']
|
self.stat = COUNT_STATS['active_users_audit:is_bot:day']
|
||||||
self.current_property = self.stat.property
|
self.current_property = self.stat.property
|
||||||
|
|
||||||
def add_event(self, event_type: str, days_offset: float, user: Optional[UserProfile]=None) -> None:
|
def add_event(self, event_type: str, days_offset: float,
|
||||||
|
user: Optional[UserProfile]=None) -> None:
|
||||||
hours_offset = int(24*days_offset)
|
hours_offset = int(24*days_offset)
|
||||||
if user is None:
|
if user is None:
|
||||||
user = self.user
|
user = self.user
|
||||||
|
|
|
@ -37,7 +37,8 @@ class TestGetChartData(ZulipTestCase):
|
||||||
def data(self, i: int) -> List[int]:
|
def data(self, i: int) -> List[int]:
|
||||||
return [0, 0, i, 0]
|
return [0, 0, i, 0]
|
||||||
|
|
||||||
def insert_data(self, stat: CountStat, realm_subgroups: List[Optional[str]], user_subgroups: List[str]) -> None:
|
def insert_data(self, stat: CountStat, realm_subgroups: List[Optional[str]],
|
||||||
|
user_subgroups: List[str]) -> None:
|
||||||
if stat.frequency == CountStat.HOUR:
|
if stat.frequency == CountStat.HOUR:
|
||||||
insert_time = self.end_times_hour[2]
|
insert_time = self.end_times_hour[2]
|
||||||
fill_time = self.end_times_hour[-1]
|
fill_time = self.end_times_hour[-1]
|
||||||
|
@ -133,7 +134,8 @@ class TestGetChartData(ZulipTestCase):
|
||||||
|
|
||||||
def test_include_empty_subgroups(self) -> None:
|
def test_include_empty_subgroups(self) -> None:
|
||||||
FillState.objects.create(
|
FillState.objects.create(
|
||||||
property='realm_active_humans::day', end_time=self.end_times_day[0], state=FillState.DONE)
|
property='realm_active_humans::day', end_time=self.end_times_day[0],
|
||||||
|
state=FillState.DONE)
|
||||||
result = self.client_get('/json/analytics/chart_data',
|
result = self.client_get('/json/analytics/chart_data',
|
||||||
{'chart_name': 'number_of_humans'})
|
{'chart_name': 'number_of_humans'})
|
||||||
self.assert_json_success(result)
|
self.assert_json_success(result)
|
||||||
|
@ -142,7 +144,8 @@ class TestGetChartData(ZulipTestCase):
|
||||||
self.assertFalse('user' in data)
|
self.assertFalse('user' in data)
|
||||||
|
|
||||||
FillState.objects.create(
|
FillState.objects.create(
|
||||||
property='messages_sent:is_bot:hour', end_time=self.end_times_hour[0], state=FillState.DONE)
|
property='messages_sent:is_bot:hour', end_time=self.end_times_hour[0],
|
||||||
|
state=FillState.DONE)
|
||||||
result = self.client_get('/json/analytics/chart_data',
|
result = self.client_get('/json/analytics/chart_data',
|
||||||
{'chart_name': 'messages_sent_over_time'})
|
{'chart_name': 'messages_sent_over_time'})
|
||||||
self.assert_json_success(result)
|
self.assert_json_success(result)
|
||||||
|
@ -151,18 +154,22 @@ class TestGetChartData(ZulipTestCase):
|
||||||
self.assertEqual(data['user'], {'human': [0], 'bot': [0]})
|
self.assertEqual(data['user'], {'human': [0], 'bot': [0]})
|
||||||
|
|
||||||
FillState.objects.create(
|
FillState.objects.create(
|
||||||
property='messages_sent:message_type:day', end_time=self.end_times_day[0], state=FillState.DONE)
|
property='messages_sent:message_type:day', end_time=self.end_times_day[0],
|
||||||
|
state=FillState.DONE)
|
||||||
result = self.client_get('/json/analytics/chart_data',
|
result = self.client_get('/json/analytics/chart_data',
|
||||||
{'chart_name': 'messages_sent_by_message_type'})
|
{'chart_name': 'messages_sent_by_message_type'})
|
||||||
self.assert_json_success(result)
|
self.assert_json_success(result)
|
||||||
data = result.json()
|
data = result.json()
|
||||||
self.assertEqual(data['realm'], {
|
self.assertEqual(data['realm'], {
|
||||||
'Public streams': [0], 'Private streams': [0], 'Private messages': [0], 'Group private messages': [0]})
|
'Public streams': [0], 'Private streams': [0],
|
||||||
|
'Private messages': [0], 'Group private messages': [0]})
|
||||||
self.assertEqual(data['user'], {
|
self.assertEqual(data['user'], {
|
||||||
'Public streams': [0], 'Private streams': [0], 'Private messages': [0], 'Group private messages': [0]})
|
'Public streams': [0], 'Private streams': [0],
|
||||||
|
'Private messages': [0], 'Group private messages': [0]})
|
||||||
|
|
||||||
FillState.objects.create(
|
FillState.objects.create(
|
||||||
property='messages_sent:client:day', end_time=self.end_times_day[0], state=FillState.DONE)
|
property='messages_sent:client:day', end_time=self.end_times_day[0],
|
||||||
|
state=FillState.DONE)
|
||||||
result = self.client_get('/json/analytics/chart_data',
|
result = self.client_get('/json/analytics/chart_data',
|
||||||
{'chart_name': 'messages_sent_by_client'})
|
{'chart_name': 'messages_sent_by_client'})
|
||||||
self.assert_json_success(result)
|
self.assert_json_success(result)
|
||||||
|
|
Loading…
Reference in New Issue