diff --git a/aircox/management/commands/streamer.py b/aircox/management/commands/streamer.py index 5fd9e07..5f5552b 100755 --- a/aircox/management/commands/streamer.py +++ b/aircox/management/commands/streamer.py @@ -21,7 +21,7 @@ from aircox.models import Station, Diffusion, Track, Sound, Log #, DiffusionLog, # force using UTC import pytz -timezone.activate(pytz.UTC) +tz.activate(pytz.UTC) class Tracer: @@ -140,26 +140,32 @@ class Monitor: log = self.get_last_log(models.Q(diffusion__isnull = False) | models.Q(sound__isnull = False)) - # check if sound on air changed - try: - on_air = current_source.metadata and \ - current_source.metadata.get('on_air') - on_air = tz.datetime.strptime(on_air, "%Y/%m/%d %H:%M:%S") - on_air = tz.make_aware(on_air) + if log: + # check if sound on air changed compared to logged one + try: + # FIXME: TO-check liquidsoap ensure we have utc time + on_air = current_source.metadata and \ + current_source.metadata.get('on_air') + on_air = tz.datetime.strptime(on_air, "%Y/%m/%d %H:%M:%S") + on_air = tz.make_aware(on_air) - is_diff = log.date != on_air - except: - on_air = None - is_diff = log.source != current_source.id or \ - (log.sound and log.sound.path != current_sound) + is_diff = log.date != on_air + except: + on_air = None + is_diff = log.source != current_source.id or \ + (log.sound and log.sound.path != current_sound) + else: + # no log: sound is different + is_diff = True if is_diff: sound = Sound.objects.filter(path = current_sound).first() - # find an eventual diff + # find an eventual diffusion associated to current sound + # => check using last (started) diffusion's archives last_diff = self.last_diff_start diff = None - if not last_diff.is_expired(): + if last_diff and not last_diff.is_expired(): archives = last_diff.diffusion.get_archives() if archives.filter(pk = sound.pk).exists(): diff = last_diff.diffusion @@ -344,8 +350,8 @@ class Monitor: # enable dealer if not source.active: source.active = True - last_start = self.last_start - if last_start.diffusion_id != diff.pk: + last_start = self.last_diff_start + if not last_start or last_start.diffusion_id != diff.pk: # log triggered diffusion self.log(type = Log.Type.start, source = source.id, diffusion = diff, date = date) diff --git a/aircox/models.py b/aircox/models.py index 64d5845..06de4dc 100755 --- a/aircox/models.py +++ b/aircox/models.py @@ -991,6 +991,7 @@ class Sound(Nameable): .replace('.', r'\.') + ')$', recursive = True, blank = True, null = True, + unique = True, max_length = 256 ) embed = models.TextField( diff --git a/aircox_cms/models.py b/aircox_cms/models.py index fc449b3..effa0f4 100755 --- a/aircox_cms/models.py +++ b/aircox_cms/models.py @@ -286,6 +286,13 @@ class BasePage(Page): ).order_by('-date') # methods + def get_list_page(self): + """ + Return the page that should be used for lists related to this + page. If None is returned, use a default one. + """ + return None + def get_context(self, request, *args, **kwargs): from aircox_cms.forms import CommentForm @@ -659,14 +666,24 @@ class DiffusionPage(Publication): # class CategoryPage(BasePage, BaseList): + # TODO: hide related in panels? content_panels = BasePage.content_panels + BaseList.panels + def get_list_page(self): + return self + def get_context(self, request, *args, **kwargs): context = super().get_context(request, *args, **kwargs) context.update(BaseList.get_context(self, request, paginate = True)) context['view'] = 'list' return context + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # we force related attribute + if not self.related: + self.related = self + class DynamicListPage(BasePage): """ diff --git a/aircox_cms/sections.py b/aircox_cms/sections.py index a1ba898..f2d13bf 100755 --- a/aircox_cms/sections.py +++ b/aircox_cms/sections.py @@ -300,6 +300,8 @@ class BaseList(models.Model): Get queryset based on the arguments. This class is intended to be reusable by other classes if needed. """ + # FIXME: check if related is published + from aircox_cms.models import Publication # model if self.model: @@ -359,12 +361,7 @@ class BaseList(models.Model): # keep empty queryset context['object_list'] = qs context['list_url_args'] = self.to_url(full_url = False) - #context['list_selector'] = { - # attr: getattr(self, attr) for attr in ( - # 'asc', 'date_filter', 'model', 'related', 'relation', - # 'tags', 'search', - # ) - #} + context['list_selector'] = self return context def paginate(self, request, qs): @@ -381,12 +378,12 @@ class BaseList(models.Model): 'object_list': qs } - def to_url(self, page = None, full_url = True, **kwargs): + def to_url(self, page = None, **kwargs): """ Return a url to a given page with GET corresponding to this list's parameters. @param page: if given use it to prepend url with page's url instead of giving only - GET parameters + GET parameters @param **kwargs: override list parameters If there is related field use it to get the page, otherwise use @@ -403,21 +400,14 @@ class BaseList(models.Model): params.update(kwargs) if self.related: - params['related'] = True + params['related'] = self.related.pk params = '&'.join([ key if value == True else '{}={}'.format(key, value) for key, value in params.items() if value ]) - if not full_url: - return params - - page = page or self.page if not page: - raise ValueError( - "full_url = True requires either list.related or " - "method's argument `page` to be given" - ) + return params return page.url + '?' + params @classmethod @@ -438,18 +428,26 @@ class BaseList(models.Model): * date_filter: one of DateFilter attribute's key. * model: ['program','diffusion','event'] type of the publication * relation: one of RelationFilter attribute's key - * related: list is related to the method's argument `related` + * related: list is related to the method's argument `related`. + It can be a page id. * tag: tag to search for * search: query to search in the publications * page: page number """ - # FIXME: page argument to select a page - # FIXME: related date_filter = request.GET.get('date_filter') model = request.GET.get('model') relation = request.GET.get('relation') + related_= request.GET.get('related') + if related_: + try: + related_ = int(related_) + related_ = Page.objects.filter(pk = related_).first() + related_ = related_ and related_.specific + except: + related_ = None + kwargs = { 'asc': 'asc' in request.GET, 'date_filter': @@ -460,7 +458,7 @@ class BaseList(models.Model): ProgramPage if model == 'program' else DiffusionPage if model == 'diffusion' else EventPage if model == 'event' else None, - 'related': 'related' in request.GET and related, + 'related': related_, 'relation': int(getattr(cl.RelationFilter, relation)) if relation and hasattr(cl.RelationFilter, relation) @@ -908,7 +906,8 @@ class SectionList(BaseList, SectionRelativeItem): def get_context(self, request, page): import aircox_cms.models as cms - if self.is_related: + if self.is_related and not self.related: + # set current page if there is not yet a related page only self.related = page context = BaseList.get_context(self, request, paginate = False) @@ -917,10 +916,15 @@ class SectionList(BaseList, SectionRelativeItem): context.update(SectionRelativeItem.get_context(self, request, page)) if self.url_text: - if not self.is_related or not page: + self.related = self.related.specific + target = None + if self.related and hasattr(self.related, 'get_list_page'): + target = self.related.get_list_page() + + if not target: settings = cms.WebsiteSettings.for_site(request.site) - page = settings.list_page - context['url'] = self.to_url(page = page) + '&view=list' + target = settings.list_page + context['url'] = self.to_url(page = target) + '&view=list' return context SectionList._meta.get_field('count').default = 5 diff --git a/aircox_cms/template.py b/aircox_cms/template.py index 89f69b1..9381d21 100644 --- a/aircox_cms/template.py +++ b/aircox_cms/template.py @@ -31,7 +31,7 @@ class TemplateMixin(models.Model): from django.template.loader import get_template get_template(cl.template_name) except TemplateDoesNotExist: - cl.template = 'aircox_cms/sections/section_item.html' + cl.template_name = 'aircox_cms/sections/section_item.html' return cl.template_name def get_context(self, request, page): diff --git a/aircox_cms/templates/aircox_cms/dynamic_list_page.html b/aircox_cms/templates/aircox_cms/dynamic_list_page.html index fff1a25..a2ac2ab 100755 --- a/aircox_cms/templates/aircox_cms/dynamic_list_page.html +++ b/aircox_cms/templates/aircox_cms/dynamic_list_page.html @@ -14,9 +14,9 @@ {% blocktrans with terms=list_selector.terms trimmed %} Search in publications for {{ terms }} {% endblocktrans %} -{% elif list_selector.filter_related %} +{% elif list_selector.related %} {# should never happen #} - {% blocktrans with title=list_selector.filter_related.title url=list_selector.filter_related.url trimmed %} + {% blocktrans with title=list_selector.related.title url=list_selector.related.url trimmed %} Related to {{ title }} {% endblocktrans %} {% else %} @@ -27,7 +27,8 @@ {% block content %} -{% with related=list_selector.filter_related %} +{# if there is a related, print related content, otherwise use dynpage #} +{% with related=list_selector.related %} {% if related %}