views.py 3.44 KB
Newer Older
fred's avatar
fred committed
1
import csv
fred's avatar
fred committed
2
import datetime
fred's avatar
fred committed
3
from cStringIO import StringIO
fred's avatar
fred committed
4 5

from django.core.urlresolvers import reverse
fred's avatar
fred committed
6
from django.http import HttpResponse
fred's avatar
fred committed
7
from django.views.generic.base import RedirectView, TemplateView
fred's avatar
fred committed
8
from django.views.generic.dates import DayArchiveView
fred's avatar
fred committed
9
from django.views.generic.detail import DetailView
fred's avatar
fred committed
10
from django.views.generic.list import ListView
fred's avatar
fred committed
11

fred's avatar
fred committed
12
from .models import SomaLogLine, Track, Artist
fred's avatar
fred committed
13
from emissions.models import Nonstop
fred's avatar
fred committed
14 15 16 17 18 19

class SomaDayArchiveView(DayArchiveView):
    queryset = SomaLogLine.objects.all()
    date_field = "play_timestamp"
    make_object_list = True
    allow_future = False
fred's avatar
fred committed
20 21 22
    month_format = '%m'


fred's avatar
fred committed
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
class SomaDayArchiveCsvView(SomaDayArchiveView):
    def render_to_response(self, context, **response_kwargs):
        out = StringIO()
        writer = csv.writer(out)
        for line in context['object_list']:
            if line.filepath.track:
                writer.writerow([line.play_timestamp.strftime('%Y-%m-%d %H:%M'),
                    line.filepath.short.encode('utf-8', 'replace'),
                    line.filepath.track.title.encode('utf-8', 'replace'),
                    line.filepath.track.artist.name.encode('utf-8', 'replace'),
                    line.filepath.track.language,
                    line.filepath.track.instru and 'instru' or '',
                    line.filepath.track.cfwb and 'cfwb' or ''])
            else:
                writer.writerow([line.play_timestamp.strftime('%Y-%m-%d %H:%M'),
                                line.filepath.short.encode('utf-8', 'replace')])
        return HttpResponse(out.getvalue(), mimetype='text/csv; charset=utf-8')


fred's avatar
fred committed
42 43 44 45 46 47 48
class RedirectTodayView(RedirectView):
    def get_redirect_url(self, *args, **kwargs):
        today = datetime.datetime.today()
        return reverse('archive_day', kwargs={
                        'year': today.year,
                        'month': today.month,
                        'day': today.day})
fred's avatar
fred committed
49 50 51 52


class TrackDetailView(DetailView):
    model = Track
fred's avatar
fred committed
53 54 55 56


class ArtistDetailView(DetailView):
    model = Artist
fred's avatar
fred committed
57 58 59 60


class ArtistListView(ListView):
    model = Artist
fred's avatar
fred committed
61 62 63 64 65 66 67 68 69 70 71 72 73


class ZoneStats(object):
    def __init__(self, zone):
        self.zone = zone

    def count(self, **kwargs):
        return Track.objects.filter(nonstop_zones=self.zone, **kwargs).count()

    def percentage(self, **kwargs):
        total = self.count()
        if total == 0:
            return '-'
fred's avatar
fred committed
74
        return str(100 * self.count(**kwargs) / total) + '%'
fred's avatar
fred committed
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

    def instru(self):
        return self.count(instru=True)

    def instru_percentage(self):
        return self.percentage(instru=True)

    def sabam(self):
        return self.count(sabam=True)

    def sabam_percentage(self):
        return self.percentage(sabam=True)

    def cfwb(self):
        return self.count(cfwb=True)

    def cfwb_percentage(self):
        return self.percentage(cfwb=True)

fred's avatar
fred committed
94 95 96 97 98 99 100 101 102
    def french(self):
        return self.count(language='fr')

    def french_percentage(self):
        considered_tracks = self.count() - self.instru()
        if considered_tracks == 0:
            return '-'
        return str(100 * self.french() / considered_tracks)

fred's avatar
fred committed
103 104 105 106 107 108 109 110 111 112
class StatisticsView(TemplateView):
    template_name = 'nonstop/statistics.html'

    def get_context_data(self, **kwargs):
        context = super(StatisticsView, self).get_context_data(**kwargs)
        context['zones'] = Nonstop.objects.all().order_by('start')
        for zone in context['zones']:
            zone.stats = ZoneStats(zone)
        return context