Added player averages for each week day.

This commit is contained in:
A. Svensson 2015-03-08 17:59:11 +01:00
parent fa49c0b829
commit 581195ebae
4 changed files with 70 additions and 1 deletions

View File

@ -1,5 +1,6 @@
from datetime import timedelta from datetime import timedelta
import calendar
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
@ -41,6 +42,23 @@ class Server(models.Model):
models.Max('players'), models.Max('players'),
) )
def weekday_averages(self):
weekdays = []
for i, day in enumerate(calendar.day_name):
# HACK: do some number juggling to convert from calendar to django,
# because SOMEONE didn't bother to follow THE FUCKING STANDARD
#
# calendar is zero indexed, first day of week defaults to monday
# (monday = 0, tuesday = 1 etc.)
#
# django isn't zero indexed, first day of week defaults to sunday
# (sunday = 1, monday = 2 etc.)
i += 2
if i > 7: i = 1
tmp = ServerHistory.objects.filter(server=self, created__week_day=i)
avg = tmp.aggregate(models.Avg('players'))['players__avg']
weekdays.append((day, int(avg)))
return weekdays
class ServerHistory(models.Model): class ServerHistory(models.Model):
server = models.ForeignKey(Server) server = models.ForeignKey(Server)

View File

@ -2,7 +2,7 @@
from django.shortcuts import render from django.shortcuts import render
from django.views import generic from django.views import generic
from .models import Server, ServerHistory from .models import Server
class ServerListView(generic.ListView): class ServerListView(generic.ListView):
model = Server model = Server
@ -29,5 +29,7 @@ class ServerDetailView(generic.DetailView):
context['monthly_average'] = stats['players__avg'] context['monthly_average'] = stats['players__avg']
context['monthly_min'] = stats['players__min'] context['monthly_min'] = stats['players__min']
context['monthly_max'] = stats['players__max'] context['monthly_max'] = stats['players__max']
context['weekday_averages'] = server.weekday_averages()
return context return context

View File

@ -68,6 +68,11 @@ body {
height:200px; height:200px;
} }
#weekday_averages {
width:800px;
height:200px;
}
#tooltip { #tooltip {
position: absolute; position: absolute;
display: none; display: none;

View File

@ -56,6 +56,7 @@
</tr> </tr>
</table> </table>
<h3>Players, last week</h3>
<div id="chart"></div> <div id="chart"></div>
<div id="tooltip"></div> <div id="tooltip"></div>
<script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script> <script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script>
@ -102,5 +103,48 @@
}); });
}); });
</script> </script>
<h3>Players, average per day</h3>
<div id="weekday_averages"></div>
<script type="text/javascript" src="{% static 'js/jquery.flot.categories.js' %}"></script>
<script type="text/javascript">
$(function() {
var series = [
{% for day, players in weekday_averages %}
["{{day}}", {{players}}],
{% endfor %}
];
var options = {
xaxis: {
mode: "categories",
},
bars: {
show: true,
barWidth: 0.75,
align: "center",
},
grid: {
hoverable: true,
borderWidth: 0,
},
};
$.plot("#weekday_averages", [series], options);
$("#weekday_averages").bind("plothover", function (event, pos, item) {
if (item) {
var players = item.datapoint[1];
$("#tooltip")
.html(players + " players")
.css({top: item.pageY+5, left: item.pageX+5})
.fadeIn(200);
} else {
$("#tooltip").hide();
}
});
});
</script>
{% endblock %} {% endblock %}