analytics: Separate private messages from group private messages.

This makes it possible for our graphs to show the group private
message counts as separate from 1:1 private messages.

Fixes #4102.
This commit is contained in:
hollywoodno
2017-03-18 16:11:07 -07:00
committed by Tim Abbott
parent 0c0e5397c4
commit dd067c761a
6 changed files with 51 additions and 16 deletions

View File

@@ -309,7 +309,9 @@ count_message_type_by_user_query = """
(
SELECT zerver_userprofile.realm_id, zerver_userprofile.id, count(*),
CASE WHEN
zerver_recipient.type != 2 THEN 'private_message'
zerver_recipient.type = 1 THEN 'private_message'
WHEN
zerver_recipient.type = 3 THEN 'huddle_message'
WHEN
zerver_stream.invite_only = TRUE THEN 'private_stream'
ELSE 'public_stream'

View File

@@ -96,12 +96,14 @@ class Command(BaseCommand):
stat = COUNT_STATS['messages_sent:message_type:day']
user_data = {
'public_stream': self.generate_fixture_data(stat, 1.5, 1, 3, .6, 8),
'private_message': self.generate_fixture_data(stat, .5, .3, 1, .6, 8)}
'private_message': self.generate_fixture_data(stat, .5, .3, 1, .6, 8),
'huddle_message': self.generate_fixture_data(stat, .2, .2, 2, .6, 8)}
insert_fixture_data(stat, user_data, UserCount)
realm_data = {
'public_stream': self.generate_fixture_data(stat, 30, 8, 5, .6, 4),
'private_stream': self.generate_fixture_data(stat, 7, 7, 5, .6, 4),
'private_message': self.generate_fixture_data(stat, 13, 5, 5, .6, 4)}
'private_message': self.generate_fixture_data(stat, 13, 5, 5, .6, 4),
'huddle_message': self.generate_fixture_data(stat, 6, 3, 3, .6, 4)}
insert_fixture_data(stat, realm_data, RealmCount)
FillState.objects.create(property=stat.property, end_time=last_end_time,
state=FillState.DONE)

View File

@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
from django.db.backends.postgresql_psycopg2.schema import DatabaseSchemaEditor
from django.db.migrations.state import StateApps
from django.db import migrations
def clear_message_sent_by_message_type_values(apps, schema_editor):
# type: (StateApps, DatabaseSchemaEditor) -> None
UserCount = apps.get_model('analytics', 'UserCount')
StreamCount = apps.get_model('analytics', 'StreamCount')
RealmCount = apps.get_model('analytics', 'RealmCount')
InstallationCount = apps.get_model('analytics', 'InstallationCount')
FillState = apps.get_model('analytics', 'FillState')
property = 'messages_sent:message_type:day'
UserCount.objects.filter(property=property).delete()
StreamCount.objects.filter(property=property).delete()
RealmCount.objects.filter(property=property).delete()
InstallationCount.objects.filter(property=property).delete()
FillState.objects.filter(property=property).delete()
class Migration(migrations.Migration):
dependencies = [('analytics', '0009_remove_messages_to_stream_stat')]
operations = [
migrations.RunPython(clear_message_sent_by_message_type_values),
]

View File

@@ -375,16 +375,19 @@ class TestCountStats(AnalyticsTestCase):
[2, 'private_stream', user2],
[2, 'public_stream', user1],
[1, 'public_stream', user2],
[2, 'private_message', user1],
[2, 'private_message', user2],
[1, 'private_message', user1],
[1, 'private_message', user2],
[1, 'private_message', user3],
[1, 'huddle_message', user1],
[1, 'huddle_message', user2],
[1, 'public_stream', self.hourly_user],
[1, 'public_stream', self.daily_user]])
self.assertTableState(RealmCount, ['value', 'subgroup', 'realm'],
[[3, 'private_stream'], [3, 'public_stream'], [5, 'private_message'],
[2, 'public_stream', self.second_realm]])
[[3, 'private_stream'], [3, 'public_stream'], [3, 'private_message'],
[2, 'huddle_message'], [2, 'public_stream', self.second_realm]])
self.assertTableState(InstallationCount, ['value', 'subgroup'],
[[3, 'private_stream'], [5, 'public_stream'], [5, 'private_message']])
[[3, 'private_stream'], [5, 'public_stream'], [3, 'private_message'],
[2, 'huddle_message']])
self.assertTableState(StreamCount, [], [])
def test_messages_sent_to_recipients_with_same_id(self):
@@ -403,7 +406,8 @@ class TestCountStats(AnalyticsTestCase):
do_fill_count_stat_at_hour(stat, self.TIME_ZERO)
self.assertCountEquals(UserCount, 2, subgroup='private_message')
self.assertCountEquals(UserCount, 1, subgroup='private_message')
self.assertCountEquals(UserCount, 1, subgroup='huddle_message')
self.assertCountEquals(UserCount, 1, subgroup='public_stream')
def test_messages_sent_by_client(self):

View File

@@ -117,10 +117,10 @@ class TestGetChartData(ZulipTestCase):
'frequency': CountStat.DAY,
'interval': CountStat.DAY,
'realm': {'Public Streams': self.data(100), 'Private Streams': self.data(0),
'PMs & Group PMs': self.data(101)},
'Private Messages': self.data(101), 'Huddle Messages': self.data(0)},
'user': {'Public Streams': self.data(200), 'Private Streams': self.data(201),
'PMs & Group PMs': self.data(0)},
'display_order': ['PMs & Group PMs', 'Public Streams', 'Private Streams'],
'Private Messages': self.data(0), 'Huddle Messages': self.data(0)},
'display_order': ['Private Messages', 'Public Streams', 'Private Streams', 'Huddle Messages'],
'result': 'success',
})
@@ -179,9 +179,9 @@ class TestGetChartData(ZulipTestCase):
self.assert_json_success(result)
data = ujson.loads(result.content)
self.assertEqual(data['realm'], {
'Public Streams': [0], 'Private Streams': [0], 'PMs & Group PMs': [0]})
'Public Streams': [0], 'Private Streams': [0], 'Private Messages': [0], 'Huddle Messages': [0]})
self.assertEqual(data['user'], {
'Public Streams': [0], 'Private Streams': [0], 'PMs & Group PMs': [0]})
'Public Streams': [0], 'Private Streams': [0], 'Private Messages': [0], 'Huddle Messages': [0]})
FillState.objects.create(
property='messages_sent:client:day', end_time=self.end_times_day[0], state=FillState.DONE)

View File

@@ -68,8 +68,8 @@ def get_chart_data(request, user_profile, chart_name=REQ(),
elif chart_name == 'messages_sent_by_message_type':
stat = COUNT_STATS['messages_sent:message_type:day']
tables = [RealmCount, UserCount]
subgroups = ['public_stream', 'private_stream', 'private_message']
labels = ['Public Streams', 'Private Streams', 'PMs & Group PMs']
subgroups = ['public_stream', 'private_stream', 'private_message', 'huddle_message']
labels = ['Public Streams', 'Private Streams', 'Private Messages', 'Huddle Messages']
labels_sort_function = lambda data: sort_by_totals(data['realm'])
include_empty_subgroups = [True, True]
elif chart_name == 'messages_sent_by_client':