diff --git a/cms/management/commands/programs_to_cms.py b/cms/management/commands/programs_to_cms.py index f14f481..b71bc2c 100644 --- a/cms/management/commands/programs_to_cms.py +++ b/cms/management/commands/programs_to_cms.py @@ -39,28 +39,31 @@ class Command (BaseCommand): logger.warning('no default program page for this website: skip') continue - logger.info('start syncing programs...') - + # programs + logger.info('Programs...') parent = settings.default_program_parent_page - for program in Program.objects.all(): - if program.page.count(): - continue - + qs = Program.objects.filter( + active = True, + stream__isnull = True, + page__isnull = True, + ) + for program in qs: logger.info('- ' + program.name) page = ProgramPage( program = program, title = program.name, - live = False + live = False, ) parent.add_child(instance = page) - logger.info('start syncing diffusions...') - - min_date = tz.now().date() - tz.timedelta(days = 20) - for diffusion in Diffusion.objects.filter(start__gt = min_date): - if diffusion.page.count() or diffusion.initial: - continue - + # diffusions + logger.info('Diffusions...') + qs = Diffusion.objects.filter( + start__gt = tz.now().date() - tz.timedelta(days = 20), + page__isnull = True, + initial__isnull = True + ) + for diffusion in qs: if not diffusion.program.page.count(): if not hasattr(diffusion.program, '__logged_diff_error'): logger.warning( @@ -74,7 +77,9 @@ class Command (BaseCommand): logger.info('- ' + str(diffusion)) try: - page = DiffusionPage.from_diffusion(diffusion) + page = DiffusionPage.from_diffusion( + diffusion, live = False + ) diffusion.program.page.first().add_child(instance = page) except: import sys diff --git a/cms/sections.py b/cms/sections.py index 3fdeb57..f375952 100644 --- a/cms/sections.py +++ b/cms/sections.py @@ -790,6 +790,7 @@ class SectionList(ListBase, SectionItem): context = super().get_context(request, page, *args, **kwargs) qs = self.get_queryset() + qs = qs.live() if self.focus_available: focus = qs.type(Publication).filter(focus = True).first() if focus: diff --git a/cms/wagtail_hooks.py b/cms/wagtail_hooks.py new file mode 100644 index 0000000..92207f9 --- /dev/null +++ b/cms/wagtail_hooks.py @@ -0,0 +1,103 @@ +from django.utils import timezone as tz +from django.utils.translation import ugettext_lazy as _ +from django.core.urlresolvers import reverse + +from wagtail.wagtailcore import hooks +from wagtail.wagtailadmin.menu import MenuItem, Menu, SubmenuMenuItem + +import aircox.programs.models as programs + +class GenericMenu(Menu): + last_time = None + + def __init__(self): + super().__init__('') + + def get_queryset(self): + pass + + def get_title(self, item): + pass + + def get_parent_page(self, item): + pass + + def get_page_url(self, item): + if item.page.count(): + return reverse('wagtailadmin_pages:edit', args=[item.page.first().id]) + parent_page = self.get_parent_page(item) + if not parent_page: + return '' + return reverse('wagtailadmin_pages:add_subpage', args=[parent_page.id]) + + @property + def registered_menu_items(self): + now = tz.now() + last_max = now - tz.timedelta(minutes = 10) + + if self._registered_menu_items is None or self.last_time < last_max: + qs = self.get_queryset() + self._registered_menu_items = [ + MenuItem(self.get_title(x), self.get_page_url(x)) + for x in qs + ] + self.last_time = now + return self._registered_menu_items + + +class ProgramsMenu(GenericMenu): + """ + Menu to display all active programs. + """ + def get_queryset(self): + return programs.Program.objects \ + .filter(active = True, page__isnull = False) \ + .filter(stream__isnull = True) \ + .order_by('name') + + def get_title(self, item): + return item.name + + def get_parent(self, item): + # TODO: #Station / get current site + from aircox.cms.models import WebsiteSettings + settings = WebsiteSettings.objects.first() + if not settings: + return + return settings.default_program_parent_page + + +class DiffusionsMenu(GenericMenu): + """ + Menu to display diffusions of today + """ + def get_queryset(self): + return programs.Diffusion.objects.filter( + type = programs.Diffusion.Type.normal, + start__contains = tz.now().date() + tz.timedelta(days=2), + ).order_by('start') + + def get_title(self, item): + return item.program.name + + def get_parent(self, item): + return item.program.page.first() + + +@hooks.register('register_admin_menu_item') +def register_programs_menu_item(): + return SubmenuMenuItem( + _('Programs'), ProgramsMenu(), + classnames='icon icon-folder-open-inverse', order=100 + ) + + +@hooks.register('register_admin_menu_item') +def register_programs_menu_item(): + return SubmenuMenuItem( + _('Today\'s Diffusions'), DiffusionsMenu(), + classnames='icon icon-folder-open-inverse', order=100 + ) + + +