sounds_monitor can matches diffusion by time -- based on local timezone

This commit is contained in:
bkfox 2017-08-31 16:07:45 +02:00
parent 81318e5bd8
commit 28dab0185a
4 changed files with 74 additions and 35 deletions

View File

@ -105,14 +105,18 @@ class DiffusionAdmin(admin.ModelAdmin):
return obj.conflicts.count() return obj.conflicts.count()
return '' return ''
def end_time(self, obj): def start_date(self, obj):
return obj.end.strftime('%H:%M') return obj.local_date.strftime('%Y/%m/%d %H:%M')
end_time.short_description = _('end') start_date.short_description = _('start')
def end_date(self, obj):
return obj.local_end.strftime('%H:%M')
end_date.short_description = _('end')
def first(self, obj): def first(self, obj):
return obj.initial.start if obj.initial else '' return obj.initial.start if obj.initial else ''
list_display = ('id', 'program', 'start', 'end_time', 'type', 'first', 'archives', 'conflicts_') list_display = ('id', 'program', 'start_date', 'end_date', 'type', 'first', 'archives', 'conflicts_')
list_filter = ('type', 'start', 'program') list_filter = ('type', 'start', 'program')
list_editable = ('type',) list_editable = ('type',)
ordering = ('-start', 'id') ordering = ('-start', 'id')

View File

@ -21,18 +21,20 @@ To check quality of files, call the command sound_quality_check using the
parameters given by the setting AIRCOX_SOUND_QUALITY. This script requires parameters given by the setting AIRCOX_SOUND_QUALITY. This script requires
Sox (and soxi). Sox (and soxi).
""" """
import os
import time
import re
import logging
import subprocess
from argparse import RawTextHelpFormatter from argparse import RawTextHelpFormatter
import atexit import atexit
import logging
import os
import re
import subprocess
import time
from watchdog.observers import Observer from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler, FileModifiedEvent from watchdog.events import PatternMatchingEventHandler, FileModifiedEvent
from django.conf import settings as main_settings
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from django.utils import timezone as tz
from aircox.models import * from aircox.models import *
import aircox.settings as settings import aircox.settings as settings
@ -162,21 +164,19 @@ class SoundInfo:
if self.year == None or not self.sound or self.sound.diffusion: if self.year == None or not self.sound or self.sound.diffusion:
return; return;
diffusion = Diffusion.objects.filter( if self.hour is None:
date = datetime.date(self.year, self.month, self.day)
else:
date = datetime.datetime(self.year, self.month, self.day,
self.hour or 0, self.minute or 0)
date = tz.get_current_timezone().localize(date)
diffusion = Diffusion.objects.after(
program.station,
date,
program = program, program = program,
initial__isnull = True, initial__isnull = True,
start__year = self.year, ).first()
start__month = self.month,
start__day = self.day,
)
if self.hour is not None:
diffusion = diffusion.filter(
hour = self.hour,
minute = self.minute
)
diffusion = diffusion.first()
if not diffusion: if not diffusion:
return return

View File

@ -772,26 +772,23 @@ class DiffusionManager(models.Manager):
qs = qs.filter(filters, **kwargs) qs = qs.filter(filters, **kwargs)
return self.station(station, qs).order_by('start').distinct() return self.station(station, qs).order_by('start').distinct()
def after(self, station, date = None, qs = None): def after(self, station, date = None, **kwargs):
""" """
Return a queryset of diffusions that happen after the given Return a queryset of diffusions that happen after the given
date. date.
""" """
date = utils.date_or_default(date) date = utils.date_or_default(date, keep_type = True)
return self.station(station, qs).filter( return self.station(station, start__gte = date, **kwargs)\
start__gte = date, .order_by('start')
).order_by('start')
def before(self, station, date = None, qs = None): def before(self, station, date = None, **kwargs):
""" """
Return a queryset of diffusions that finish before the given Return a queryset of diffusions that finish before the given
date. date.
""" """
date = utils.date_or_default(date) date = utils.date_or_default(date)
qs = self if qs is None else qs return self.station(station, end__lte = date, **kwargs) \
return self.station(station, qs).filter( .order_by('start')
end__lte = date,
).order_by('start')
class Diffusion(models.Model): class Diffusion(models.Model):
@ -861,8 +858,34 @@ class Diffusion(models.Model):
@property @property
def date(self): def date(self):
"""
Alias to self.start
"""
return self.start return self.start
@property
def local_date(self):
"""
Return a version of self.date that is localized to self.timezone;
This is needed since datetime are stored as UTC date and we want
to get it as local time.
"""
if not hasattr(self, '_local_date'):
self._local_date = tz.localtime(self.date, tz.get_current_timezone())
return self._local_date
@property
def local_end(self):
"""
Return a version of self.date that is localized to self.timezone;
This is needed since datetime are stored as UTC date and we want
to get it as local time.
"""
if not hasattr(self, '_local_end'):
self._local_end = tz.localtime(self.end, tz.get_current_timezone())
return self._local_end
@property @property
def playlist(self): def playlist(self):
""" """
@ -943,7 +966,7 @@ class Diffusion(models.Model):
def __str__(self): def __str__(self):
return '{self.program.name} {date} #{self.pk}'.format( return '{self.program.name} {date} #{self.pk}'.format(
self=self, date=self.date.strftime('%Y-%m-%d %H:%M') self=self, date=self.local_date.strftime('%Y/%m/%d %H:%M%z')
) )
class Meta: class Meta:
@ -1487,6 +1510,17 @@ class Log(models.Model):
def related(self): def related(self):
return self.diffusion or self.sound or self.track return self.diffusion or self.sound or self.track
@property
def local_date(self):
"""
Return a version of self.date that is localized to self.timezone;
This is needed since datetime are stored as UTC date and we want
to get it as local time.
"""
if not hasattr(self, '_local_date'):
self._local_date = tz.localtime(self.date, tz.get_current_timezone())
return self._local_date
def is_expired(self, date = None): def is_expired(self, date = None):
""" """
Return True if the log is expired. Note that it only check Return True if the log is expired. Note that it only check
@ -1522,7 +1556,7 @@ class Log(models.Model):
self.pk, self.pk,
self.get_type_display(), self.get_type_display(),
self.source, self.source,
self.date.strftime('%Y/%m/%d %H:%M'), self.local_date.strftime('%Y/%m/%d %H:%M%z'),
) )
def save(self, *args, **kwargs): def save(self, *args, **kwargs):

View File

@ -59,7 +59,8 @@ def schedule_post_saved(sender, instance, created, *args, **kwargs):
delta = instance.date - old_sched.date delta = instance.date - old_sched.date
# update diffusions... # update diffusions...
qs = models.Diffusion.objects.after(instance.program.station).filter( qs = models.Diffusion.objects.after(
instance.program.station,
program = instance.program program = instance.program
) )
for diff in qs: for diff in qs: