add manager for Related class; rename get_on_air as on_air + can retrieve by last logs instead of date

This commit is contained in:
bkfox
2016-07-25 15:03:54 +02:00
parent 62380c054d
commit 960fcab65d
7 changed files with 127 additions and 62 deletions

View File

@ -150,7 +150,7 @@ class Station(programs.Nameable):
* archive: if false, exclude log of diffusion's archives from
the queryset;
"""
qs = Log.get_for(model = models) \
qs = Log.objects.get_for(model = models) \
.filter(station = self, type = Log.Type.play)
if not archives and self.dealer:
qs = qs.exclude(
@ -161,45 +161,66 @@ class Station(programs.Nameable):
)
return qs.order_by('date')
def get_on_air(self, date = None):
@staticmethod
def __mix_logs_and_diff(diffs, logs, count = 0):
"""
Return a list of what should have normally been on air at the
given date, ordered descending on the diffusion time
Mix together logs and diffusion items ordering by their date.
Diffs and Logs are assumed to be ordered by -date, and so is
the resulting list
"""
# we fill a list with diff and retrieve logs that happened between
# each to put them too there
items = []
diff_ = None
for diff in diffs:
logs_ = \
logs.filter(date__gt = diff.end, date__lt = diff_.start) \
if diff_ else logs.filter(date__gt = diff.end)
diff_ = diff
items.extends(logs_)
items.append(diff)
if count and len(items) >= count:
break
if diff_ and not count or len(items) <= count:
logs_ = logs.filter(date__lt = diff_.end)
items.extend(logs_)
return items[:count] if count else items
def on_air(self, date = None, count = 0):
"""
Return a list of what happened on air, based on logs and
diffusions informations. The list is sorted by -date.
* date: only for what happened on this date;
* count: number of items to retrieve if not zero;
Be careful with what you which for: the result is a plain list.
The list contains:
- track logs: for the streamed programs;
- diffusion: for the scheduled diffusions;
* track logs: for the streamed programs;
* diffusion: for the scheduled diffusions;
"""
# TODO: argument to get sound instead of tracks
# FIXME: as an iterator?
# TODO argument to get sound instead of tracks
# TODO #Station
date = date or tz.now().date()
if date > datetime.date.today():
return []
logs = 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) \
.order_by('start')
# mix up
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)
# last logs
if prev_diff:
logs_ = logs.filter(date__gt = prev_diff.end)
items.extend(logs_)
return reversed(items)
logs = Log.objects.get_for(model = programs.Track) \
.filter(station = self) \
.order_by('-date')
diffs = programs.Diffusion.objects \
.filter(type = Diffusion.Type.normal) \
.order_by('-date')
if date:
logs = logs.filter(date__contains = date)
diffs = diffs.get_at(date)
return self.__mix_logs_and_diff(diffs, logs, count)
def save(self, make_sources = True, *args, **kwargs):

View File

@ -66,7 +66,7 @@ class Monitor:
if not current_sound or not current_source:
return
log = Log.get_for(model = programs.Sound) \
log = Log.objects.get_for(model = programs.Sound) \
.filter(station = self.station).order_by('date').last()
# only streamed
@ -92,11 +92,11 @@ class Monitor:
Log tracks for the given sound (for streamed programs); Called by
self.trace
"""
logs = Log.get_for(model = programs.Track) \
logs = Log.objects.get_for(model = programs.Track) \
.filter(pk__gt = log.pk)
logs = [ log.related_id for log in logs ]
tracks = programs.Track.get_for(object = log.related) \
tracks = programs.Track.objects.get_for(object = log.related) \
.filter(in_seconds = True)
if tracks and len(tracks) == len(logs):
return