import csv import datetime from cStringIO import StringIO from django.core.urlresolvers import reverse from django.http import HttpResponse from django.views.generic.base import RedirectView, TemplateView from django.views.generic.dates import DayArchiveView from django.views.generic.detail import DetailView from django.views.generic.list import ListView from .models import SomaLogLine, Track, Artist from emissions.models import Nonstop class SomaDayArchiveView(DayArchiveView): queryset = SomaLogLine.objects.all() date_field = "play_timestamp" make_object_list = True allow_future = False month_format = '%m' 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') 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}) class TrackDetailView(DetailView): model = Track class ArtistDetailView(DetailView): model = Artist class ArtistListView(ListView): model = Artist 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 '-' return '%.2f%%' % (100. * self.count(**kwargs) / total) 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) def french(self): return self.count(language='fr') def french_percentage(self): considered_tracks = self.count() - self.instru() if considered_tracks == 0: return '-' return '%.2f%%' % (100. * self.french() / considered_tracks) 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