From ce89c64f4330173e01a1f212bca4a619d41f24dd Mon Sep 17 00:00:00 2001 From: Rishi Gupta Date: Wed, 8 Feb 2017 17:55:18 -0800 Subject: [PATCH] stats.js: Move name_map computation to the backend. --- .../commands/populate_analytics_db.py | 42 +++++++++-------- analytics/views.py | 8 +++- static/js/stats/stats.js | 45 ++++++------------- 3 files changed, 44 insertions(+), 51 deletions(-) diff --git a/analytics/management/commands/populate_analytics_db.py b/analytics/management/commands/populate_analytics_db.py index 3bcaafd1ba..eb9c5f223e 100644 --- a/analytics/management/commands/populate_analytics_db.py +++ b/analytics/management/commands/populate_analytics_db.py @@ -47,7 +47,7 @@ class Command(BaseCommand): do_drop_all_analytics_tables() # I believe this also deletes any objects with this realm as a foreign key Realm.objects.filter(string_id='analytics').delete() - Client.objects.filter(name__endswith='_').delete() + Client.objects.filter(name__startswith='_').delete() installation_time = timezone.now() - timedelta(days=self.DAYS_OF_DATA) last_end_time = floor_to_day(timezone.now()) @@ -101,29 +101,33 @@ class Command(BaseCommand): FillState.objects.create(property=stat.property, end_time=last_end_time, state=FillState.DONE) - website_ = Client.objects.create(name='website_') - API_ = Client.objects.create(name='API_') - android_ = Client.objects.create(name='android_') - iOS_ = Client.objects.create(name='iOS_') - react_native_ = Client.objects.create(name='react_native_') - electron_ = Client.objects.create(name='electron_') - barnowl_ = Client.objects.create(name='barnowl_') - plan9_ = Client.objects.create(name='plan9_') + # We use client names that start with _ to make it easy to + # drop just these data manually without affecting other data. + website = Client.objects.create(name='_Website') + old_desktop = Client.objects.create(name='_Old desktop app') + android = Client.objects.create(name='_Android app') + iOS = Client.objects.create(name='_Old iOS app') + react_native = Client.objects.create(name='_New iOS app') + API = Client.objects.create(name='_Python API') + barnowl = Client.objects.create(name='_Barnowl') + unused = Client.objects.create(name='_Unused webhook') + long_webhook = Client.objects.create(name='_Webhook with loooooooong name') stat = COUNT_STATS['messages_sent:client:day'] user_data = { - website_.id: self.generate_fixture_data(stat, 2, 1, 1.5, .6, 8), - barnowl_.id: self.generate_fixture_data(stat, 0, .3, 1.5, .6, 8)} + website.id: self.generate_fixture_data(stat, 2, 1, 1.5, .6, 8), + barnowl.id: self.generate_fixture_data(stat, 0, .3, 1.5, .6, 8)} insert_fixture_data(stat, user_data, UserCount) realm_data = { - website_.id: self.generate_fixture_data(stat, 30, 20, 5, .6, 3), - API_.id: self.generate_fixture_data(stat, 5, 5, 5, .6, 3), - android_.id: self.generate_fixture_data(stat, 5, 5, 2, .6, 3), - iOS_.id: self.generate_fixture_data(stat, 5, 5, 2, .6, 3), - react_native_.id: self.generate_fixture_data(stat, 5, 5, 10, .6, 3), - electron_.id: self.generate_fixture_data(stat, 5, 3, 8, .6, 3), - barnowl_.id: self.generate_fixture_data(stat, 1, 1, 3, .6, 3), - plan9_.id: self.generate_fixture_data(stat, 0, 0, 0, 0, 0, 0)} + website.id: self.generate_fixture_data(stat, 30, 20, 5, .6, 3), + old_desktop.id: self.generate_fixture_data(stat, 5, 3, 8, .6, 3), + android.id: self.generate_fixture_data(stat, 5, 5, 2, .6, 3), + iOS.id: self.generate_fixture_data(stat, 5, 5, 2, .6, 3), + react_native.id: self.generate_fixture_data(stat, 5, 5, 10, .6, 3), + API.id: self.generate_fixture_data(stat, 5, 5, 5, .6, 3), + barnowl.id: self.generate_fixture_data(stat, 1, 1, 3, .6, 3), + unused.id: self.generate_fixture_data(stat, 0, 0, 0, 0, 0), + long_webhook.id: self.generate_fixture_data(stat, 5, 5, 2, .6, 3)} insert_fixture_data(stat, realm_data, RealmCount) FillState.objects.create(property=stat.property, end_time=last_end_time, state=FillState.DONE) diff --git a/analytics/views.py b/analytics/views.py index dd755847c0..347503c2e6 100644 --- a/analytics/views.py +++ b/analytics/views.py @@ -1,5 +1,6 @@ from __future__ import absolute_import, division +from django.conf import settings from django.core import urlresolvers from django.db import connection from django.db.models import Sum @@ -65,12 +66,13 @@ def get_chart_data(request, user_profile, chart_name=REQ(), stat = COUNT_STATS['messages_sent:message_type:day'] tables = [RealmCount, UserCount] subgroups = ['public_stream', 'private_stream', 'private_message'] - labels = None + labels = ['Public Streams', 'Private Streams', 'Private Messages'] include_empty_subgroups = True elif chart_name == 'messages_sent_by_client': stat = COUNT_STATS['messages_sent:client:day'] tables = [RealmCount, UserCount] subgroups = [str(x) for x in Client.objects.values_list('id', flat=True).order_by('id')] + # these are further re-written by client_label_map labels = list(Client.objects.values_list('name', flat=True).order_by('id')) include_empty_subgroups = False else: @@ -134,6 +136,10 @@ def client_label_map(name): return "Python API" if name.startswith("Zulip") and name.endswith("Webhook"): return name[len("Zulip"):-len("Webhook")] + " webhook" + # Clients in dev environment autogenerated data start with _ so + # that it's easy to manually drop without affecting other data. + if settings.DEVELOPMENT and name.startswith("_"): + return name[1:] return name def rewrite_client_arrays(value_arrays): diff --git a/static/js/stats/stats.js b/static/js/stats/stats.js index c2ff57c958..9d73aedc68 100644 --- a/static/js/stats/stats.js +++ b/static/js/stats/stats.js @@ -349,7 +349,7 @@ function make_pie_trace(values, labels, text) { }; } -function compute_pie_chart_data(name_map, time_series_data, num_steps) { +function compute_pie_chart_data(time_series_data, num_steps) { var data = []; for (var key in time_series_data) { if (time_series_data[key].length < num_steps) { @@ -362,7 +362,7 @@ function compute_pie_chart_data(name_map, time_series_data, num_steps) { if (sum > 0) { data.push({ value: sum, - label: word_wrap(name_map.hasOwnProperty(key) ? name_map[key] : key, 18), + label: word_wrap(key, 18), }); } } @@ -397,17 +397,6 @@ function compute_pie_chart_data(name_map, time_series_data, num_steps) { } function populate_messages_sent_by_client(data) { - // Hardcoded names in the development environment - var name_map = { - electron_: "Electron", - barnowl_: "BarnOwl", - website_: "Website", - API_: "API", - android_: "Android", - iOS_: "iOS", - react_native_: "React Native", - }; - var layout = { margin: { l: 90, r: 0, b: 0, t: 0 }, width: 450, @@ -417,14 +406,14 @@ function populate_messages_sent_by_client(data) { var chart_data = { realm: { - cumulative: compute_pie_chart_data(name_map, data.realm, data.end_times.length), - thirty: compute_pie_chart_data(name_map, data.realm, 30), - ten: compute_pie_chart_data(name_map, data.realm, 10), + cumulative: compute_pie_chart_data(data.realm, data.end_times.length), + thirty: compute_pie_chart_data(data.realm, 30), + ten: compute_pie_chart_data(data.realm, 10), }, user: { - cumulative: compute_pie_chart_data(name_map, data.user, data.end_times.length), - thirty: compute_pie_chart_data(name_map, data.user, 30), - ten: compute_pie_chart_data(name_map, data.user, 10), + cumulative: compute_pie_chart_data(data.user, data.end_times.length), + thirty: compute_pie_chart_data(data.user, 30), + ten: compute_pie_chart_data(data.user, 10), }, }; @@ -515,12 +504,6 @@ $.get({ }); function populate_messages_sent_by_message_type(data) { - var name_map = { - public_stream: "Public Stream", - private_stream: "Private Stream", - private_message: "Private Message", - }; - var layout = { margin: { l: 90, r: 0, b: 0, t: 0 }, width: 465, @@ -530,14 +513,14 @@ function populate_messages_sent_by_message_type(data) { var chart_data = { realm: { - cumulative: compute_pie_chart_data(name_map, data.realm, data.end_times.length), - thirty: compute_pie_chart_data(name_map, data.realm, 30), - ten: compute_pie_chart_data(name_map, data.realm, 10), + cumulative: compute_pie_chart_data(data.realm, data.end_times.length), + thirty: compute_pie_chart_data(data.realm, 30), + ten: compute_pie_chart_data(data.realm, 10), }, user: { - cumulative: compute_pie_chart_data(name_map, data.user, data.end_times.length), - thirty: compute_pie_chart_data(name_map, data.user, 30), - ten: compute_pie_chart_data(name_map, data.user, 10), + cumulative: compute_pie_chart_data(data.user, data.end_times.length), + thirty: compute_pie_chart_data(data.user, 30), + ten: compute_pie_chart_data(data.user, 10), }, };