forked from rc/aircox
182 lines
4.8 KiB
Python
Executable File
182 lines
4.8 KiB
Python
Executable File
from django.utils import timezone as tz
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from django.core.urlresolvers import reverse
|
|
from django.contrib.staticfiles.templatetags.staticfiles import static
|
|
from django.utils.html import format_html
|
|
|
|
from wagtail.wagtailcore import hooks
|
|
from wagtail.wagtailadmin.menu import MenuItem, Menu, SubmenuMenuItem
|
|
|
|
from wagtail.contrib.modeladmin.options import \
|
|
ModelAdmin, ModelAdminGroup, modeladmin_register
|
|
|
|
|
|
import aircox.models
|
|
import aircox_cms.models as models
|
|
|
|
|
|
class ProgramAdmin(ModelAdmin):
|
|
model = aircox.models.Program
|
|
menu_label = _('Programs')
|
|
menu_icon = 'pick'
|
|
menu_order = 200
|
|
list_display = ('name', 'active')
|
|
search_fields = ('name',)
|
|
|
|
class DiffusionAdmin(ModelAdmin):
|
|
model = aircox.models.Diffusion
|
|
menu_label = _('Diffusions')
|
|
menu_icon = 'date'
|
|
menu_order = 200
|
|
list_display = ('program', 'start', 'end', 'frequency', 'initial')
|
|
list_filter = ('frequency', 'start', 'program')
|
|
|
|
class ScheduleAdmin(ModelAdmin):
|
|
model = aircox.models.Schedule
|
|
menu_label = _('Schedules')
|
|
menu_icon = 'time'
|
|
menu_order = 200
|
|
list_display = ('program', 'frequency', 'duration', 'initial')
|
|
list_filter = ('frequency', 'date', 'duration', 'program')
|
|
|
|
class StreamAdmin(ModelAdmin):
|
|
model = aircox.models.Stream
|
|
menu_label = _('Streams')
|
|
menu_icon = 'time'
|
|
menu_order = 200
|
|
list_display = ('program', 'delay', 'begin', 'end')
|
|
list_filter = ('program', 'delay', 'begin', 'end')
|
|
|
|
class AdvancedAdminGroup(ModelAdminGroup):
|
|
menu_label = _("Advanced")
|
|
menu_icon = 'plus-inverse'
|
|
items = (ProgramAdmin, DiffusionAdmin, ScheduleAdmin, StreamAdmin)
|
|
|
|
modeladmin_register(AdvancedAdminGroup)
|
|
|
|
|
|
class SoundAdmin(ModelAdmin):
|
|
model = aircox.models.Sound
|
|
menu_label = _('Sounds')
|
|
menu_icon = 'media'
|
|
menu_order = 350
|
|
list_display = ('name', 'duration', 'type', 'path', 'good_quality', 'public')
|
|
list_filter = ('type', 'good_quality', 'public')
|
|
search_fields = ('name', 'path')
|
|
|
|
modeladmin_register(SoundAdmin)
|
|
|
|
|
|
## Hooks
|
|
|
|
@hooks.register('insert_editor_css')
|
|
def editor_css():
|
|
return format_html(
|
|
'<link rel="stylesheet" href="{}">',
|
|
static('aircox_cms/css/cms.css')
|
|
)
|
|
|
|
|
|
class GenericMenu(Menu):
|
|
page_model = models.Publication
|
|
|
|
def __init__(self):
|
|
super().__init__('')
|
|
|
|
def get_queryset(self):
|
|
pass
|
|
|
|
def get_title(self, item):
|
|
pass
|
|
|
|
def get_parent(self, item):
|
|
pass
|
|
|
|
def get_page_url(self, page_model, item):
|
|
if item.page.count():
|
|
return reverse('wagtailadmin_pages:edit', args=[item.page.first().id])
|
|
|
|
parent_page = self.get_parent(item)
|
|
if not parent_page:
|
|
return ''
|
|
|
|
return reverse(
|
|
'wagtailadmin_pages:add', args= [
|
|
page_model._meta.app_label, page_model._meta.model_name,
|
|
parent_page.id
|
|
]
|
|
)
|
|
|
|
@property
|
|
def registered_menu_items(self):
|
|
now = tz.now()
|
|
last_max = now - tz.timedelta(minutes = 10)
|
|
|
|
qs = self.get_queryset()
|
|
return [
|
|
MenuItem(self.get_title(x), self.get_page_url(self.page_model, x))
|
|
for x in qs
|
|
]
|
|
|
|
|
|
class DiffusionsMenu(GenericMenu):
|
|
"""
|
|
Menu to display diffusions of today
|
|
"""
|
|
page_model = models.DiffusionPage
|
|
|
|
def get_queryset(self):
|
|
return aircox.models.Diffusion.objects.filter(
|
|
type = aircox.models.Diffusion.Type.normal,
|
|
start__contains = tz.now().date(),
|
|
initial__isnull = True,
|
|
).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(
|
|
_('Today\'s Diffusions'), DiffusionsMenu(),
|
|
classnames='icon icon-folder-open-inverse', order=101
|
|
)
|
|
|
|
|
|
class ProgramsMenu(GenericMenu):
|
|
"""
|
|
Menu to display all active programs
|
|
"""
|
|
page_model = models.DiffusionPage
|
|
|
|
def get_queryset(self):
|
|
return aircox.models.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
|
|
|
|
|
|
@hooks.register('register_admin_menu_item')
|
|
def register_programs_menu_item():
|
|
return SubmenuMenuItem(
|
|
_('Programs'), ProgramsMenu(),
|
|
classnames='icon icon-folder-open-inverse', order=102
|
|
)
|
|
|
|
|