stats.js: Move name_map computation to the backend.

This commit is contained in:
Rishi Gupta
2017-02-08 17:55:18 -08:00
committed by Tim Abbott
parent 8ad7c96382
commit ce89c64f43
3 changed files with 44 additions and 51 deletions

View File

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

View File

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

View File

@@ -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),
},
};