1
0
Fork 0

Merge pull request #109 from ppapadeas/statistics

Statistics page
pull/112/head
Nikos Roussos 2016-11-26 16:48:09 +02:00 committed by GitHub
commit 0c144e55b5
9 changed files with 248 additions and 5 deletions

View File

@ -9,6 +9,7 @@
"bootstrap": "3.3.x",
"underscore": "1.8.x",
"backbone": "1.3.x",
"d3": "3.5.x"
"d3": "3.5.x",
"chart.js": "^2.4.0"
}
}

View File

@ -9,5 +9,7 @@ base_urlpatterns = ([
url(r'^faq/$', views.faq, name='faq'),
url(r'^satellite/(?P<norad>[0-9]+)/$', views.satellite, name='satellite'),
url(r'^suggestion/$', views.suggestion, name='suggestion'),
url(r'^statistics/$', views.statistics, name='statistics'),
url(r'^stats/$', views.stats, name='stats'),
url(r'^robots\.txt$', views.robots, name='robots'),
])

View File

@ -6,7 +6,7 @@ from django.views.decorators.http import require_POST
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.core.urlresolvers import reverse
from django.http import HttpResponseNotFound, HttpResponseServerError, HttpResponse
from django.http import HttpResponseNotFound, HttpResponseServerError, HttpResponse, JsonResponse
from django.conf import settings
from django.contrib.sites.shortcuts import get_current_site
from django.template.loader import render_to_string
@ -114,3 +114,104 @@ def about(request):
def faq(request):
"""View to render faq page."""
return render(request, 'base/faq.html')
def stats(request):
"""View to render stats page."""
return render(request, 'base/stats.html')
def statistics(request):
"""View to create statistics endpoint."""
satellites = Satellite.objects.all()
transmitters = Transmitter.objects.all()
modes = Mode.objects.all()
total_satellites = satellites.count()
total_transmitters = transmitters.count()
alive_transmitters = transmitters.filter(alive=True).count()
alive_transmitters_percentage = '{0}%'.format(round((float(alive_transmitters) /
float(total_transmitters)) * 100, 2))
mode_label = []
mode_data = []
for mode in modes:
tr = transmitters.filter(mode=mode).count()
mode_label.append(mode.name)
mode_data.append(tr)
band_label = []
band_data = []
# <30.000.000 - HF
filtered = transmitters.filter(downlink_low__lt=30000000).count()
band_label.append('HF')
band_data.append(filtered)
# 30.000.000 ~ 300.000.000 - VHF
filtered = transmitters.filter(downlink_low__gte=30000000,
downlink_low__lt=300000000).count()
band_label.append('VHF')
band_data.append(filtered)
# 300.000.000 ~ 1.000.000.000 - UHF
filtered = transmitters.filter(downlink_low__gte=300000000,
downlink_low__lt=1000000000).count()
band_label.append('UHF')
band_data.append(filtered)
# 1G ~ 2G - L
filtered = transmitters.filter(downlink_low__gte=1000000000,
downlink_low__lt=2000000000).count()
band_label.append('L')
band_data.append(filtered)
# 2G ~ 4G - S
filtered = transmitters.filter(downlink_low__gte=2000000000,
downlink_low__lt=4000000000).count()
band_label.append('S')
band_data.append(filtered)
# 4G ~ 8G - C
filtered = transmitters.filter(downlink_low__gte=4000000000,
downlink_low__lt=8000000000).count()
band_label.append('C')
band_data.append(filtered)
# 8G ~ 12G - X
filtered = transmitters.filter(downlink_low__gte=8000000000,
downlink_low__lt=12000000000).count()
band_label.append('X')
band_data.append(filtered)
# 12G ~ 18G - Ku
filtered = transmitters.filter(downlink_low__gte=12000000000,
downlink_low__lt=18000000000).count()
band_label.append('Ku')
band_data.append(filtered)
# 18G ~ 27G - K
filtered = transmitters.filter(downlink_low__gte=18000000000,
downlink_low__lt=27000000000).count()
band_label.append('K')
band_data.append(filtered)
# 27G ~ 40G - Ka
filtered = transmitters.filter(downlink_low__gte=27000000000,
downlink_low__lt=40000000000).count()
band_label.append('Ka')
band_data.append(filtered)
mode_data_sorted, mode_label_sorted = zip(*sorted(zip(mode_data, mode_label), reverse=True))
band_data_sorted, band_label_sorted = zip(*sorted(zip(band_data, band_label), reverse=True))
statistics = {
'total_satellites': total_satellites,
'transmitters': total_transmitters,
'transmitters_alive': alive_transmitters_percentage,
'mode_label': mode_label_sorted,
'mode_data': mode_data_sorted,
'band_label': band_label_sorted,
'band_data': band_data_sorted
}
return JsonResponse(statistics, safe=False)

View File

@ -255,3 +255,20 @@ footer {
.stage-notice a {
color: #ffff00;
}
/* Statistics page
==================== */
.stats {
padding-top: 20px;
padding-bottom: 20px;
}
.stats-hud {
padding: 15px;
}
.stats-hud-num {
display: block;
font-size: 2em;
font-weight: bold;
}

View File

@ -0,0 +1,74 @@
$.getJSON( "/statistics/", function( data ) {
var i, r, g, b, a;
// Create colors for Mode Chart
var mode_colors = [];
for (i = 0; i < data.mode_label.length; i++) {
r = Math.floor(data.mode_data[i]* 10);
b = Math.floor(0.3 * 255);
g = Math.floor(data.mode_data[i]* 10);
a = 0.5;
color = "rgba(" + r + "," + g + "," + b + "," + a + ")";
mode_colors.push(color);
}
// Create colors for Band Chart
var band_colors = [];
for (i = 0; i < data.band_label.length; i++) {
b = Math.floor(0.1 * 255);
g = Math.floor(data.band_data[i]);
r = Math.floor(data.band_data[i]);
a = 0.5;
color = "rgba(" + r + "," + g + "," + b + "," + a + ")";
band_colors.push(color);
}
// Global chart configuration
Chart.defaults.global.legend.display = false;
Chart.defaults.global.title.display = true;
Chart.defaults.global.title.fontSize = 16;
Chart.defaults.global.title.fontColor= '#444';
//Mode Chart
var mode_c = document.getElementById("modes");
var modeChart = new Chart(mode_c, {
type: 'doughnut',
data: {
labels: data.mode_label,
datasets: [{
backgroundColor: mode_colors,
data: data.mode_data,
borderWidth: 1
}]
},
options: {
title : {
text: data.mode_data.length + ' Modes'
}
}
});
//Band Chart
var band_c = document.getElementById("bands");
var bandChart = new Chart(band_c, {
type: 'doughnut',
data: {
labels: data.band_label,
datasets: [{
backgroundColor: band_colors,
data: data.band_data,
borderWidth: 1
}]
},
options: {
title : {
text: data.band_data.length + ' Bands'
}
}
});
//HUD Stats
$('#stats-alive').html(data.transmitters_alive);
$('#stats-transmitters').html(data.transmitters);
$('#stats-satellites').html(data.total_satellites);
});

View File

@ -41,6 +41,7 @@
<ul class="nav navbar-nav">
<li class="{% active request 'home' %}"><a href="{% url 'home' %}">Home</a></li>
<li class="{% active request 'about' %}"><a href="{% url 'about' %}">About</a></li>
<li class="{% active request 'stats' %}"><a href="{% url 'stats' %}">Statistics</a></li>
<li class="{% active request 'faq' %}"><a href="{% url 'faq' %}">FAQ</a></li>
<li><a href="https://community.satnogs.org/" target="_blank">Community</a></li>
</ul>

View File

@ -0,0 +1,47 @@
{% extends "base.html" %}
{% load tags %}
{% load staticfiles %}
{% block title %} - Stats{% endblock %}
{% block content %}
<div class="row text">
<div class="col-md-12">
<h2>Statistics</h2>
</div>
</div>
<div class="row stats">
<div class="col-md-4">
<canvas id="modes" width="300" height="300"></canvas>
</div>
<div class="col-md-4">
<canvas id="bands" width="300" height="300"></canvas>
</div>
<div class="col-md-4">
<div class="row">
<p class="stats-hud">
Total satellites
<span class="stats-hud-num" id="stats-satellites">120</span>
</p>
</div>
<div class="row">
<p class="stats-hud">
Total transmitters
<span class="stats-hud-num" id="stats-transmitters">230</span>
</p>
</div>
<div class="row">
<p class="stats-hud">
Alive transmitters
<span class="stats-hud-num" id="stats-alive"></span>
</p>
</div>
</div>
</div>
{% endblock %}
{% block javascript %}
<script src="{% static 'lib/chart.js/dist/Chart.min.js' %}"></script>
<script src="{% static 'js/stats.js' %}"></script>
{% endblock %}

View File

@ -18,14 +18,14 @@ django-braces==1.10.0
django-secure==1.0.1
# Users
django-allauth==0.28.0
django-allauth==0.29.0
django-crispy-forms==1.6.1
# Images
Pillow==3.4.2
# API
djangorestframework==3.5.2
djangorestframework==3.5.3
markdown==2.6.7
django-filter==0.15.3

View File

@ -3,4 +3,4 @@
# Debug & Testing
factory-boy==2.7.0
flake8==3.0.4
flake8==3.2.1