forked from rc/aircox
103 lines
3.5 KiB
Python
103 lines
3.5 KiB
Python
from collections import deque
|
|
import datetime
|
|
|
|
from django.views.generic import ListView
|
|
from django.utils import timezone as tz
|
|
|
|
from rest_framework.generics import ListAPIView
|
|
from rest_framework import viewsets
|
|
from rest_framework.decorators import action
|
|
|
|
from ..models import Diffusion, Log
|
|
from ..serializers import LogInfo, LogInfoSerializer
|
|
from .base import BaseView, BaseAPIView
|
|
from .mixins import GetDateMixin
|
|
|
|
|
|
__all__ = ['LogListMixin', 'LogListView']
|
|
|
|
|
|
class LogListMixin(GetDateMixin):
|
|
model = Log
|
|
|
|
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.
|
|
qs = super().get_queryset().on_air().filter(track__isnull=False) \
|
|
.filter(date__lte=tz.now())
|
|
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):
|
|
qs = Diffusion.objects.station(self.station).on_air() \
|
|
.filter(start__lte=tz.now())
|
|
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, LogListMixin, ListView):
|
|
"""
|
|
Return list of logs for the provided date (from `kwargs` or
|
|
`request.GET`, defaults to today).
|
|
"""
|
|
redirect_date_url = 'log-list'
|
|
has_filters = True
|
|
|
|
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()
|
|
kwargs.update({
|
|
'date': self.date,
|
|
'dates': (today - datetime.timedelta(days=i) for i in range(0, 7)),
|
|
'object_list': self.get_object_list(self.object_list),
|
|
})
|
|
return super().get_context_data(**kwargs)
|
|
|
|
|
|
# Logs are accessible through API only with this list view
|
|
class LogListAPIView(LogListMixin, BaseAPIView, ListAPIView):
|
|
"""
|
|
Return logs list, including diffusions. By default return logs of
|
|
the last 30 minutes.
|
|
|
|
Available GET parameters:
|
|
- "date": return logs for a specified date (
|
|
- "full": (staff user only) don't merge diffusion and logs
|
|
"""
|
|
serializer_class = LogInfoSerializer
|
|
queryset = Log.objects.all()
|
|
|
|
def get(self, *args, **kwargs):
|
|
self.date = self.get_date()
|
|
if self.date is None:
|
|
self.min_date = tz.now() - tz.timedelta(minutes=30)
|
|
return super().get(*args, **kwargs)
|
|
|
|
def get_object_list(self, logs, full):
|
|
return [LogInfo(obj) for obj in super().get_object_list(logs, full)]
|
|
|
|
def get_serializer(self, queryset, *args, **kwargs):
|
|
full = bool(self.request.GET.get('full'))
|
|
return super().get_serializer(self.get_object_list(queryset, full),
|
|
*args, **kwargs)
|
|
|