blob: 00aa5701117eb565c0d964f3e3a7085a3d4ce221 [file] [log] [blame]
{# Load the tag library #}
{% load bootstrap3 %}
<!DOCTYPE html>
{# Load CSS and JavaScript #}
{% bootstrap_css %}
<script src="/static/crashreports/jquery-latest.min.js"></script>
{% bootstrap_javascript %}
<!-- Material Design fonts -->
<link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Roboto:300,400,500,700">
<link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="/static/crashreports/css/bootstrap-material-design.min.css" charset="utf-8" >
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/ripples.min.css">
<link rel="stylesheet" type="text/css" href="/static/crashreports/css/ripples.min.css" charset="utf-8" >
<!-- Bootstrap -->
<link rel="stylesheet" type="text/css" href="/static/crashreports/style.css" charset="utf-8" >
<script src="/static/crashreports/js/material.js"></script>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
{# Display django.contrib.messages as Bootstrap alerts #}
{% bootstrap_messages %}
<div class="container">
<div class="navbar navbar-warning">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-responsive-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="javascript:void(0)">Hiccup</a>
</div>
<div class="navbar-collapse collapse navbar-responsive-collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="javascript:void(0)">Statistics</a></li>
<li><a href="/hiccup/admin/">Admin Area</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="bootstrap-elements.html" data-target="#" class="dropdown-toggle" data-toggle="dropdown">{{ request.user }}
<b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/hiccup/admin/logout/">Logout</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
<h1> 1.7.1 Beta/Office Stats </h1>
<div class="row" style="height:300px">
<div class="col-md-4">
<div id = "probable_crashes" class="panel chart"> </div>
</div>
<div class="col-md-4">
<div id = "fingerprints" class="panel chart"> </div>
</div>
<div class="col-md-4">
<div id = "SMPL" class="panel chart"> </div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="panel">
<div id = "reports_per_day" class="line_chart"> </div>
</div>
</div>
<script>
$.material.init()
// Load the Visualization API and the corechart package.
google.charts.load('current', {'packages':['corechart','line']});
// Set a callback to run when the Google Visualization API is loaded.
google.charts.setOnLoadCallback(drawChart);
function aggregate_build_fingerprints(data) {
totals = {}
data = filter_1_7_1(data)
for (var entry in data) {
key = data[entry].build_fingerprint
if (!totals[key]) {
totals[key] = 0;
}
totals[key] += 1;
}
ret = []
for (var entry in totals) {
ret.push([entry, totals[entry]])
}
return ret;
}
function aggregate_uuid(data) {
data = filter_1_7_1(data)
totals = {}
for (var entry in data) {
if (!totals[data[entry].uuid]) {
console.log(data[entry].uuid);
totals[data[entry].uuid] = 0;
}
totals[data[entry].uuid] += 1;
}
ret = []
for (var entry in totals) {
ret.push([entry, totals[entry]])
}
return ret;
}
function aggregate_uuid(data) {
data = filter_1_7_1(data)
totals = {}
for (var entry in data) {
if (!totals[data[entry].uuid]) {
totals[data[entry].uuid] = 0;
}
totals[data[entry].uuid] += 1;
}
ret = []
for (var entry in totals) {
ret.push([entry, totals[entry]])
}
return ret;
}
function get_distribution(data) {
data = filter_1_7_1(data)
totals = {}
fingerprint_count = {}
for (var entry in data) {
if (!totals[data[entry].uuid]) {
fingerprint = data[entry].build_fingerprint
totals[data[entry].uuid] = 0;
console.log(data[entry].uuid)
if (!fingerprint_count[fingerprint]) {
fingerprint_count[fingerprint] = 0;
}
fingerprint_count[fingerprint] += 1;
}
totals[data[entry].uuid] += 1;
}
ret = []
for (var entry in fingerprint_count) {
ret.push([entry, fingerprint_count[entry]])
}
console.log(ret);
return ret;
}
function filter_1_7_1(data) {
ret = {}
for (var entry in data) {
if (!data[entry].build_fingerprint.startsWith('Fairphone/FP2/FP2:5.1/FP2/r4275.1_FP2_gms65_HICCUP_1.7.1')) {
continue;
}
if (data[entry].build_fingerprint.includes("a:user")) {
data[entry].build_fingerprint = "1.7.1a";
} else {
data[entry].build_fingerprint = "1.7.1"
}
ret[entry]=data[entry];
}
return ret;
}
function filter_ping_reports(data) {
ret = {}
for (var entry in data) {
if (!data[entry].report_type=="CRASH_REPORT") {
continue;
}
ret[entry]=data[entry];
}
return ret;
}
function aggregate_SMPL(data) {
totals = {}
data = filter_1_7_1(data)
for (var entry in data) {
key = ""
if (data[entry].power_on_reason.includes("SMPL")) {
key = "SMPL";
} else if (data[entry].boot_reason.includes("keyboard")) {
key = "Crash";
} else {
continue;
}
if (!totals[key]) {
console.log(data[entry].build_fingerprint);
totals[key] = 0;
}
totals[key] += 1;
}
ret = []
for (var entry in totals) {
ret.push([entry, totals[entry]])
}
return ret;
}
function drawChart() {
drawChartFromDate("2016-09-09","");
}
function drawChartFromDate(startDate,endDate) {
drawChartReportPerDay("/hiccup/crashreports_per_day/","Reports per Day", 'reports_per_day')
drawChartFingerprints("/hiccup/crashreports/?format=json&report_type=CRASH_REPORT&start_date="+startDate+"&end_date="+endDate+"&boot_reason=keyboard+power+on", "Probable Crashes", 'probable_crashes', aggregate_build_fingerprints);
drawChartFingerprints("/hiccup/crashreports/?format=json&start_date="+startDate+"&end_date="+endDate, "Build Distribution", 'fingerprints', get_distribution);
drawChartFingerprints("/hiccup/crashreports/?format=json&report_type=CRASH_REPORT&start_date="+startDate+"&end_date="+endDate, "SMPL or Crash", 'SMPL', aggregate_SMPL);
}
function drawChartReportPerDay(url, title, element) {
$.getJSON( url, function( json_response ) {
var options = {
title: title,
curveType: 'function',
legend: { position: 'bottom' },
};
var chart = new google.charts.Line(document.getElementById(element));
var data = new google.visualization.DataTable();
reformated_array = json_response.map(function(obj){
return [new Date(obj.date), obj.count];
})
data.addColumn('date', 'Date');
data.addColumn('number', 'Number of Crashreports');
data.addRows(reformated_array);
chart.draw(data, google.charts.Line.convertOptions(options));
});
}
function drawChartFingerprints(url, title, element, aggregate_function) {
$.getJSON( url, function( data ) {
var totals_fingerprint = aggregate_function(data);
var options = {
title: title,
pieHole: 0.4,
legend: { position: 'bottom' }
};
var chart = new google.visualization.PieChart(document.getElementById(element));
var data = new google.visualization.DataTable();
data.addColumn('string', 'Build Fingerprint');
data.addColumn('number', 'Number of Crashreports');
data.addRows(totals_fingerprint);
chart.draw(data, options);
});
}
function drawUuidHistogram(url, title, element) {
$.getJSON( url, function( data ) {
var totals_fingerprint = aggregate_uuid(data);
var options = {
title: title,
pieHole: 0.4,
legend: { position: 'bottom' }
};
var chart = new google.visualization.Histogram(document.getElementById(element));
var data = new google.visualization.DataTable();
data.addColumn('string', 'Build Fingerprint');
data.addColumn('number', 'Number of Crashreports');
data.addRows(totals_fingerprint);
chart.draw(data, options);
});
}
</script>