forked from rc/aircox
cfr #121 Co-authored-by: Christophe Siraut <d@tobald.eu.org> Co-authored-by: bkfox <thomas bkfox net> Co-authored-by: Thomas Kairos <thomas@bkfox.net> Reviewed-on: rc/aircox#131 Co-authored-by: Chris Tactic <ctactic@noreply.git.radiocampus.be> Co-committed-by: Chris Tactic <ctactic@noreply.git.radiocampus.be>
This commit is contained in:
@@ -6,45 +6,43 @@ from django.views.decorators.cache import cache_page
|
||||
from django.views.generic import ListView
|
||||
from rest_framework.generics import ListAPIView
|
||||
|
||||
from ..models import Diffusion, Log, StaticPage
|
||||
from ..models import Diffusion, Log
|
||||
from ..serializers import LogInfo, LogInfoSerializer
|
||||
from .base import BaseAPIView, BaseView
|
||||
from .mixins import AttachedToMixin, GetDateMixin
|
||||
|
||||
__all__ = ["LogListMixin", "LogListView"]
|
||||
__all__ = ("LogListMixin", "LogListView", "LogListAPIView")
|
||||
|
||||
|
||||
class LogListMixin(GetDateMixin):
|
||||
model = Log
|
||||
min_date = None
|
||||
max_date = None
|
||||
|
||||
def get_date(self):
|
||||
date = super().get_date()
|
||||
def get_date(self, param):
|
||||
date = super().get_date(param)
|
||||
if date is not None and not self.request.user.is_staff:
|
||||
return min(date, datetime.date.today())
|
||||
return date
|
||||
|
||||
def filter_qs(self, query):
|
||||
if self.min_date:
|
||||
query = query.after(self.min_date)
|
||||
if self.max_date:
|
||||
query = query.before(self.max_date)
|
||||
if not self.min_date and not self.max_date and self.date:
|
||||
return query.date(self.date)
|
||||
return query
|
||||
|
||||
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.date(self.date)
|
||||
if self.date is not None
|
||||
else qs.after(self.min_date)
|
||||
if self.min_date is not None
|
||||
else qs
|
||||
)
|
||||
query = super().get_queryset().on_air().filter(track__isnull=False).filter(date__lte=tz.now())
|
||||
return self.filter_qs(query)
|
||||
|
||||
def get_diffusions_queryset(self):
|
||||
qs = Diffusion.objects.station(self.station).on_air().filter(start__lte=tz.now())
|
||||
return (
|
||||
qs.date(self.date)
|
||||
if self.date is not None
|
||||
else qs.after(self.min_date)
|
||||
if self.min_date is not None
|
||||
else qs
|
||||
)
|
||||
query = Diffusion.objects.station(self.station).on_air().filter(start__lte=tz.now()).before()
|
||||
return self.filter_qs(query)
|
||||
|
||||
def get_object_list(self, logs, full=False):
|
||||
"""Return diffusions merged to the provided logs iterable.
|
||||
@@ -62,13 +60,31 @@ class LogListView(AttachedToMixin, BaseView, LogListMixin, ListView):
|
||||
`request.GET`, defaults to today)."""
|
||||
|
||||
redirect_date_url = "log-list"
|
||||
has_filters = True
|
||||
attach_to_value = StaticPage.ATTACH_TO_LOGS
|
||||
date_delta = tz.timedelta(days=7)
|
||||
|
||||
def get_date(self):
|
||||
date = super().get_date()
|
||||
def get_date(self, param):
|
||||
date = super().get_date(param)
|
||||
return datetime.date.today() if date is None else date
|
||||
|
||||
def get(self, request, **kwargs):
|
||||
min_date = self.get_date("min_date")
|
||||
max_date = self.get_date("max_date")
|
||||
|
||||
# ensure right values for min and max
|
||||
min_date, max_date = min(min_date, max_date), max(min_date, max_date)
|
||||
|
||||
# limit logs list size using date delta
|
||||
if min_date and max_date:
|
||||
max_date = min(min_date + self.date_delta, max_date)
|
||||
elif min_date:
|
||||
max_date = min_date + self.date_delta
|
||||
elif max_date:
|
||||
min_date = max_date - self.date_delta
|
||||
|
||||
self.min_date = min_date
|
||||
self.max_date = max_date
|
||||
return super().get(request, **kwargs)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
today = datetime.date.today()
|
||||
# `super()...` must be called before updating kwargs, in order
|
||||
@@ -76,6 +92,9 @@ class LogListView(AttachedToMixin, BaseView, LogListMixin, ListView):
|
||||
kwargs = super().get_context_data(**kwargs)
|
||||
kwargs.update(
|
||||
{
|
||||
"min_date": self.min_date or today,
|
||||
"max_date": self.max_date or today,
|
||||
"today": datetime.date.today(),
|
||||
"date": self.date,
|
||||
"dates": (today - datetime.timedelta(days=i) for i in range(0, 7)),
|
||||
"object_list": self.get_object_list(self.object_list),
|
||||
@@ -101,8 +120,8 @@ class LogListAPIView(LogListMixin, BaseAPIView, ListAPIView):
|
||||
def list(self, *args, **kwargs):
|
||||
return super().list(*args, **kwargs)
|
||||
|
||||
def get_date(self):
|
||||
date = super().get_date()
|
||||
def get_date(self, param):
|
||||
date = super().get_date(param)
|
||||
if date is None:
|
||||
self.min_date = tz.now() - tz.timedelta(minutes=30)
|
||||
return date
|
||||
|
||||
Reference in New Issue
Block a user