add manager for programs.Diffusion + adapt; list_by_date's date urls; website's section Log algorithm
This commit is contained in:
@ -1,9 +1,11 @@
|
||||
import json
|
||||
import datetime
|
||||
|
||||
from django.utils import timezone as tz
|
||||
from django.utils.translation import ugettext as _, ugettext_lazy
|
||||
|
||||
import aircox.programs.models as programs
|
||||
import aircox.controllers.models as controllers
|
||||
import aircox.cms.models as cms
|
||||
import aircox.cms.routes as routes
|
||||
import aircox.cms.sections as sections
|
||||
@ -30,12 +32,12 @@ class Player(sections.Section):
|
||||
|
||||
@expose
|
||||
def on_air(cl, request):
|
||||
qs = programs.Diffusion.get(
|
||||
now = True,
|
||||
now = tz.now()
|
||||
qs = programs.Diffusion.objects.get_at(now).filter(
|
||||
type = programs.Diffusion.Type.normal
|
||||
)
|
||||
|
||||
if not qs or not qs[0].is_date_in_my_range():
|
||||
if not qs or not qs[0].is_date_in_range():
|
||||
return {}
|
||||
|
||||
qs = qs[0]
|
||||
@ -214,7 +216,8 @@ class Sounds(sections.List):
|
||||
|
||||
class ListByDate(sections.List):
|
||||
"""
|
||||
List that add a navigation by date in its header.
|
||||
List that add a navigation by date in its header. It aims to be
|
||||
used with DateRoute.
|
||||
"""
|
||||
template_name = 'aircox/website/list_by_date.html'
|
||||
message_empty = ''
|
||||
@ -253,15 +256,19 @@ class ListByDate(sections.List):
|
||||
return [ first + tz.timedelta(days=i) for i in range(0, self.nav_days) ]
|
||||
|
||||
def date_or_default(self):
|
||||
"""
|
||||
Return self.date or create a date if needed, using kwargs'
|
||||
year, month, day attributes if exists (otherwise, use today)
|
||||
"""
|
||||
if self.date:
|
||||
return self.date
|
||||
return datetime.date(self.date)
|
||||
elif self.kwargs and 'year' in self.kwargs:
|
||||
return tz.datetime(year = int(self.kwargs['year']),
|
||||
month = int(self.kwargs['month']),
|
||||
day = int(self.kwargs['day']),
|
||||
hour = 0, minute = 0, second = 0,
|
||||
microsecond = 0)
|
||||
return tz.now()
|
||||
return datetime.date(
|
||||
year = int(self.kwargs['year']),
|
||||
month = int(self.kwargs['month']),
|
||||
day = int(self.kwargs['day'])
|
||||
)
|
||||
return datetime.date.today()
|
||||
|
||||
def get_context_data(self, *args, **kwargs):
|
||||
context = super().get_context_data(*args, **kwargs)
|
||||
@ -270,6 +277,7 @@ class ListByDate(sections.List):
|
||||
dates = [ (date, self.get_date_url(date))
|
||||
for date in self.nav_dates(date) ]
|
||||
|
||||
# FIXME
|
||||
next_week = dates[-1][0] + tz.timedelta(days=1)
|
||||
next_week = self.get_date_url(next_week)
|
||||
|
||||
@ -289,18 +297,22 @@ class ListByDate(sections.List):
|
||||
@staticmethod
|
||||
def get_date_url(date):
|
||||
"""
|
||||
return a url to the list for the given date
|
||||
return an url for the given date
|
||||
"""
|
||||
return self.view.website.reverse(
|
||||
model = self.model, route = routes.DateRoute,
|
||||
year = date.year, month = date.month, day = date.day,
|
||||
)
|
||||
|
||||
@property
|
||||
def url(self):
|
||||
return None
|
||||
|
||||
|
||||
class Schedule(Diffusions,ListByDate):
|
||||
"""
|
||||
Render a list of diffusions in the form of a schedule
|
||||
"""
|
||||
model = models.Diffusion
|
||||
fields = [ 'time', 'image', 'title', 'content', 'info', 'actions' ]
|
||||
truncate = 30
|
||||
|
||||
@ -310,10 +322,7 @@ class Schedule(Diffusions,ListByDate):
|
||||
|
||||
def get_object_list(self):
|
||||
date = self.date_or_default()
|
||||
diffs = routes.DateRoute.get_queryset(
|
||||
programs.Diffusion, None, date.year, date.month, date.day,
|
||||
attr = 'start'
|
||||
).order_by('start')
|
||||
diffs = programs.Diffusion.objects.get_at(date).order_by('start')
|
||||
return models.Diffusion.objects.get_for(diffs, create = True)
|
||||
|
||||
@staticmethod
|
||||
@ -329,54 +338,58 @@ class Schedule(Diffusions,ListByDate):
|
||||
|
||||
class Logs(ListByDate):
|
||||
"""
|
||||
Return a list of played stream sounds and diffusions.
|
||||
Print a list of played stream tracks and diffusions.
|
||||
Note that for the moment we don't print if the track has been
|
||||
partially hidden by a scheduled diffusion
|
||||
"""
|
||||
model = controllers.Log
|
||||
|
||||
@staticmethod
|
||||
def make_item(log):
|
||||
def make_item(item):
|
||||
"""
|
||||
Return a list of items to add to the playlist.
|
||||
Only support Log related to a Track and programs.Diffusion
|
||||
"""
|
||||
if issubclass(type(log.related), programs.Diffusion):
|
||||
diff = log.related
|
||||
post = models.Diffusion.objects.filter(related = diff).first() \
|
||||
or models.Program.objects.filter(related = diff.program).first() \
|
||||
or ListItem(title = diff.program.name)
|
||||
post.date = diff.start
|
||||
return post
|
||||
|
||||
if issubclass(type(log.related), programs.Track):
|
||||
track = log.related
|
||||
post = ListItem(
|
||||
title = '{artist} — {name}'.format(
|
||||
artist = track.artist,
|
||||
name = track.name,
|
||||
),
|
||||
date = log.date,
|
||||
content = track.info,
|
||||
info = '♫',
|
||||
if issubclass(type(item), programs.Diffusion):
|
||||
return models.Diffusion.objects.get_for(
|
||||
item, create = True, save = False
|
||||
)
|
||||
|
||||
track = log.related
|
||||
post = ListItem(
|
||||
title = '{artist} — {name}'.format(
|
||||
artist = track.artist,
|
||||
name = track.name,
|
||||
),
|
||||
date = log.date,
|
||||
content = track.info,
|
||||
info = '♫',
|
||||
)
|
||||
return post
|
||||
|
||||
@staticmethod
|
||||
def make_diff(diff):
|
||||
pass
|
||||
|
||||
def get_object_list(self):
|
||||
return []
|
||||
station = self.view.website.station
|
||||
qs = station.get_played(
|
||||
models = [ programs.Diffusion, programs.Track ],
|
||||
).filter(
|
||||
date__year = int(year), date__month = int(month),
|
||||
date__day = int(day)
|
||||
)
|
||||
# TODO for each, exclude if there is a corresponding diffusion
|
||||
# (that has not been logged)
|
||||
# if diff and diff != last_diff:
|
||||
# r.append(cl.make_item
|
||||
# return [ cl.make_item(log) for log in qs ]
|
||||
date = self.date_or_default()
|
||||
if date > datetime.date.today():
|
||||
return []
|
||||
|
||||
logs = controllers.Log.get_for(model = programs.Track) \
|
||||
.filter(date__contains = date) \
|
||||
.order_by('date')
|
||||
|
||||
diffs = programs.Diffusion.objects.get_at(date) \
|
||||
.filter(type = programs.Diffusion.Type.normal)
|
||||
|
||||
items = []
|
||||
prev_diff = None
|
||||
for diff in diffs:
|
||||
logs_ = logs.filter(date__gt = prev_diff.end,
|
||||
date__lt = diff.start) \
|
||||
if prev_diff else \
|
||||
logs.filter(date__lt = diff.start)
|
||||
prev_diff = diff
|
||||
items.extend(logs_)
|
||||
items.append(diff)
|
||||
|
||||
return list(map(self.make_item, items))
|
||||
|
||||
@staticmethod
|
||||
def get_date_url(date):
|
||||
return 'TODO'
|
||||
|
||||
|
Reference in New Issue
Block a user