commit
0c144e55b5
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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'),
|
||||
])
|
||||
|
|
103
db/base/views.py
103
db/base/views.py
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
});
|
|
@ -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>
|
||||
|
|
|
@ -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 %}
|
|
@ -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
|
||||
|
||||
|
|
|
@ -3,4 +3,4 @@
|
|||
|
||||
# Debug & Testing
|
||||
factory-boy==2.7.0
|
||||
flake8==3.0.4
|
||||
flake8==3.2.1
|
||||
|
|
Loading…
Reference in New Issue