forked from rc/aircox
start to work on stats
This commit is contained in:
@ -1,5 +1,7 @@
|
||||
import json
|
||||
import datetime
|
||||
|
||||
from django.db.models import Count
|
||||
from django.views.generic.base import View, TemplateResponseMixin
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
from django.http import HttpResponse, Http404
|
||||
@ -82,7 +84,7 @@ class Monitor(View,TemplateResponseMixin,LoginRequiredMixin):
|
||||
stations.fetch()
|
||||
return { 'stations': stations.stations }
|
||||
|
||||
def get (self, request = None, **kwargs):
|
||||
def get(self, request = None, **kwargs):
|
||||
if not request.user.is_active:
|
||||
return Http404()
|
||||
|
||||
@ -90,7 +92,7 @@ class Monitor(View,TemplateResponseMixin,LoginRequiredMixin):
|
||||
context = self.get_context_data(**kwargs)
|
||||
return render(request, self.template_name, context)
|
||||
|
||||
def post (self, request = None, **kwargs):
|
||||
def post(self, request = None, **kwargs):
|
||||
if not request.user.is_active:
|
||||
return Http404()
|
||||
|
||||
@ -121,6 +123,92 @@ class Monitor(View,TemplateResponseMixin,LoginRequiredMixin):
|
||||
return HttpResponse('')
|
||||
|
||||
|
||||
class StatisticsView(View,TemplateResponseMixin,LoginRequiredMixin):
|
||||
template_name = 'aircox/controllers/stats.html'
|
||||
|
||||
class Stats:
|
||||
station = None
|
||||
date = None
|
||||
items = None
|
||||
"""
|
||||
Log or Diffusion object that has been diffused by date. These
|
||||
objects have extra fields:
|
||||
- tags: [ (tag_name, tag_count), ...]
|
||||
- tracks_count: total count of tracks
|
||||
"""
|
||||
tags = None
|
||||
"""
|
||||
Total of played track's tags: [(tag_name, tag_count, tag_average), ...]
|
||||
on the station for the given date. Note: tag_average is in %
|
||||
"""
|
||||
tracks_count = 0
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
self.items = []
|
||||
self.tags = []
|
||||
self.__dict__.update(kwargs)
|
||||
|
||||
def get_stats(self, station, date):
|
||||
"""
|
||||
Return statistics for the given station and date.
|
||||
"""
|
||||
items = station.on_air(date)
|
||||
stats = self.Stats(station = station, items = items, date = date)
|
||||
|
||||
sums = {}
|
||||
total = 0
|
||||
|
||||
for item in items:
|
||||
qs = models.Track.objects.get_for(item)
|
||||
item.tracks = qs
|
||||
item.tracks_count = qs.count()
|
||||
|
||||
qs = qs.values('tags__name').annotate(count = Count('tags__name')) \
|
||||
.order_by('tags__name')
|
||||
item.tags = [
|
||||
(q['tags__name'], q['count'])
|
||||
for q in qs if q['tags__name']
|
||||
]
|
||||
for name, count in item.tags:
|
||||
sums[name] = (sums.get(name) or 0) + count
|
||||
|
||||
total += item.tracks_count
|
||||
|
||||
stats.tracks_count = total
|
||||
stats.tags = [
|
||||
(name, count, count / total * 100)
|
||||
for name, count in sums.items()
|
||||
]
|
||||
stats.tags.sort(key=lambda s: s[0])
|
||||
return stats
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = {}
|
||||
date = datetime.date.today()
|
||||
|
||||
try:
|
||||
GET = self.request.GET
|
||||
year = int(GET["year"]) if 'year' in GET else date.year
|
||||
month = int(GET["month"]) if 'month' in GET else date.month
|
||||
day = int(GET["day"]) if 'day' in GET else date.day
|
||||
date = datetime.date(year, month, day)
|
||||
except:
|
||||
pass
|
||||
|
||||
context["statistics"] = [
|
||||
self.get_stats(station, date)
|
||||
for station in models.Station.objects.all()
|
||||
]
|
||||
|
||||
return context
|
||||
|
||||
def get(self, request = None, **kwargs):
|
||||
if not request.user.is_active:
|
||||
return Http404()
|
||||
|
||||
self.request = request
|
||||
context = self.get_context_data(**kwargs)
|
||||
return render(request, self.template_name, context)
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user