work on logs, timetable, stats

This commit is contained in:
bkfox
2019-09-08 01:39:40 +02:00
parent 2d21ab2434
commit c68e21ee57
71 changed files with 19683 additions and 710 deletions

View File

@ -5,56 +5,61 @@ from django.views.generic import ListView
from ..models import Diffusion, Log
from .base import BaseView
from .mixins import GetDateMixin
__all__ = ['BaseLogListView', 'LogListView']
__all__ = ['LogListMixin', 'LogListView']
class BaseLogListView:
class LogListMixin(GetDateMixin):
model = Log
date = None
def get_date(self):
date, today = super().get_date(), datetime.date.today()
if date is not None and not self.request.user.is_staff:
return min(date, today)
return date
def get_queryset(self):
# only get logs for tracks: log for diffusion will be retrieved
# by the diffusions' queryset.
return super().get_queryset().on_air().filter(track__isnull=False)
qs = super().get_queryset().on_air().filter(track__isnull=False)
return qs.today(self.date) if self.date is not None else \
qs.after(self.min_date) if self.min_date is not None else qs
def get_diffusions_queryset(self):
return Diffusion.objects.station(self.station).on_air()
qs = Diffusion.objects.station(self.station).on_air()
return qs.today(self.date) if self.date is not None else \
qs.after(self.min_date) if self.min_date is not None else qs
def get_object_list(self, logs, full=False):
"""
Return diffusions merged to the provided logs queryset. If
`full`, sort items by date without merging.
"""
diffs = self.get_diffusions_queryset()
if self.request.user.is_staff and full:
return sorted(list(logs) + list(diffs), key=lambda obj: obj.start)
return Log.merge_diffusions(logs, diffs)
class LogListView(BaseView, BaseLogListView, ListView):
date = None
max_age = 10
min_date = None
def get(self, request, *args, **kwargs):
today = datetime.date.today()
self.min_date = today - datetime.timedelta(days=self.max_age)
self.date = min(max(self.min_date, self.kwargs['date']), today) \
if 'date' in self.kwargs else today
return super().get(request, *args, **kwargs)
def get_queryset(self):
return super().get_queryset().today(self.date)
def get_diffusions_queryset(self):
return super().get_diffusions_queryset().today(self.date)
class LogListView(BaseView, LogListMixin, ListView):
"""
Return list of logs for the provided date (from `kwargs` or
`request.GET`, defaults to today).
"""
def get_date(self):
date, today = super().get_date(), datetime.date.today()
return today if date is None else min(date, today)
def get_context_data(self, **kwargs):
today = datetime.date.today()
max_date = min(max(self.date + datetime.timedelta(days=3),
self.min_date + datetime.timedelta(days=6)), today)
return super().get_context_data(
date=self.date,
min_date=self.min_date,
dates=(date for date in (
max_date - datetime.timedelta(days=i)
for i in range(0, 7)) if date >= self.min_date),
object_list=Log.merge_diffusions(self.object_list,
self.get_diffusions_queryset()),
**kwargs
)
kwargs.update({
'date': self.date,
'dates': ((today - datetime.timedelta(days=i), None)
for i in range(0, 7)),
'object_list': self.get_object_list(self.object_list),
})
return super().get_context_data(**kwargs)