forked from rc/aircox
work on pages, filters, lists
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -2,28 +2,20 @@ from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from .page import Page, PageQuerySet
|
||||
from .program import Program, InProgramQuerySet
|
||||
|
||||
|
||||
class ArticleQuerySet(InProgramQuerySet, PageQuerySet):
|
||||
pass
|
||||
from .program import Program, ProgramChildQuerySet
|
||||
|
||||
|
||||
class Article(Page):
|
||||
detail_url_name = 'article-detail'
|
||||
|
||||
program = models.ForeignKey(
|
||||
Program, models.SET_NULL,
|
||||
verbose_name=_('program'), blank=True, null=True,
|
||||
help_text=_("publish as this program's article"),
|
||||
)
|
||||
is_static = models.BooleanField(
|
||||
_('is static'), default=False,
|
||||
help_text=_('Should this article be considered as a page '
|
||||
'instead of a blog article'),
|
||||
)
|
||||
|
||||
objects = ArticleQuerySet.as_manager()
|
||||
objects = ProgramChildQuerySet.as_manager()
|
||||
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('Article')
|
||||
|
@ -8,7 +8,7 @@ from django.utils.functional import cached_property
|
||||
|
||||
|
||||
from aircox import settings, utils
|
||||
from .program import Program, InProgramQuerySet, \
|
||||
from .program import Program, ProgramChildQuerySet, \
|
||||
BaseRerun, BaseRerunQuerySet
|
||||
from .page import Page, PageQuerySet
|
||||
|
||||
@ -16,18 +16,18 @@ from .page import Page, PageQuerySet
|
||||
__all__ = ['Episode', 'Diffusion', 'DiffusionQuerySet']
|
||||
|
||||
|
||||
class EpisodeQuerySet(PageQuerySet, InProgramQuerySet):
|
||||
pass
|
||||
|
||||
|
||||
class Episode(Page):
|
||||
program = models.ForeignKey(
|
||||
Program, models.CASCADE,
|
||||
verbose_name=_('program'),
|
||||
)
|
||||
|
||||
objects = EpisodeQuerySet.as_manager()
|
||||
objects = ProgramChildQuerySet.as_manager()
|
||||
detail_url_name = 'episode-detail'
|
||||
item_template_name = 'aircox/episode_item.html'
|
||||
|
||||
@property
|
||||
def program(self):
|
||||
return getattr(self.parent, 'program', None)
|
||||
|
||||
@program.setter
|
||||
def program(self, value):
|
||||
self.parent = value
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('Episode')
|
||||
@ -41,6 +41,8 @@ class Episode(Page):
|
||||
def save(self, *args, **kwargs):
|
||||
if self.cover is None:
|
||||
self.cover = self.program.cover
|
||||
if self.parent is None:
|
||||
raise ValueError('missing parent program')
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
@ -155,6 +157,8 @@ class Diffusion(BaseRerun):
|
||||
# help_text = _('use this input port'),
|
||||
# )
|
||||
|
||||
item_template_name = 'aircox/diffusion_item.html'
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('Diffusion')
|
||||
verbose_name_plural = _('Diffusions')
|
||||
|
@ -46,6 +46,11 @@ class PageQuerySet(InheritanceQuerySet):
|
||||
def trash(self):
|
||||
return self.filter(status=Page.STATUS_TRASH)
|
||||
|
||||
def parent(self, parent=None, id=None):
|
||||
""" Return pages having this parent. """
|
||||
return self.filter(parent=parent) if id is None else \
|
||||
self.filter(parent__id=id)
|
||||
|
||||
|
||||
class Page(models.Model):
|
||||
""" Base class for publishable content """
|
||||
@ -58,6 +63,8 @@ class Page(models.Model):
|
||||
(STATUS_TRASH, _('trash')),
|
||||
)
|
||||
|
||||
parent = models.ForeignKey('self', models.CASCADE, blank=True, null=True,
|
||||
related_name='child_set')
|
||||
title = models.CharField(max_length=128)
|
||||
slug = models.SlugField(_('slug'), blank=True, unique=True)
|
||||
status = models.PositiveSmallIntegerField(
|
||||
@ -74,7 +81,7 @@ class Page(models.Model):
|
||||
content = RichTextField(
|
||||
_('content'), blank=True, null=True,
|
||||
)
|
||||
date = models.DateTimeField(default=tz.now)
|
||||
pub_date = models.DateTimeField(blank=True, null=True)
|
||||
featured = models.BooleanField(
|
||||
_('featured'), default=False,
|
||||
)
|
||||
@ -85,17 +92,19 @@ class Page(models.Model):
|
||||
objects = PageQuerySet.as_manager()
|
||||
|
||||
detail_url_name = None
|
||||
|
||||
item_template_name = 'aircox/page_item.html'
|
||||
|
||||
def __str__(self):
|
||||
return '{}: {}'.format(self._meta.verbose_name,
|
||||
self.title or self.pk)
|
||||
return '{}'.format(self.title or self.pk)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
# TODO: ensure unique slug
|
||||
if not self.slug:
|
||||
self.slug = slugify(self.title)
|
||||
print(self.title, '--', self.slug)
|
||||
if self.is_published and self.pub_date is None:
|
||||
self.pub_date = tz.datetime.now()
|
||||
elif not self.is_published:
|
||||
self.pub_date = None
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
def get_absolute_url(self):
|
||||
|
@ -23,7 +23,8 @@ from .station import Station
|
||||
logger = logging.getLogger('aircox')
|
||||
|
||||
|
||||
__all__ = ['Program', 'ProgramQuerySet', 'Stream', 'Schedule']
|
||||
__all__ = ['Program', 'ProgramQuerySet', 'Stream', 'Schedule',
|
||||
'ProgramChildQuerySet', 'BaseRerun', 'BaseRerunQuerySet']
|
||||
|
||||
|
||||
class ProgramQuerySet(PageQuerySet):
|
||||
@ -49,15 +50,8 @@ class Program(Page):
|
||||
name if it does not exists.
|
||||
"""
|
||||
# explicit foreign key in order to avoid related name clashes
|
||||
page = models.OneToOneField(
|
||||
Page, models.CASCADE,
|
||||
parent_link=True, related_name='program_page'
|
||||
)
|
||||
station = models.ForeignKey(
|
||||
Station,
|
||||
verbose_name=_('station'),
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
station = models.ForeignKey(Station, models.CASCADE,
|
||||
verbose_name=_('station'))
|
||||
active = models.BooleanField(
|
||||
_('active'),
|
||||
default=True,
|
||||
@ -146,10 +140,17 @@ class Program(Page):
|
||||
.update(path=Concat('path', Substr(F('path'), len(path_))))
|
||||
|
||||
|
||||
class InProgramQuerySet(models.QuerySet):
|
||||
"""
|
||||
Queryset for model having a ForeignKey field "program" to `Program`.
|
||||
"""
|
||||
class ProgramChildQuerySet(PageQuerySet):
|
||||
def station(self, station=None, id=None):
|
||||
return self.filter(parent__program__station=station) if id is None else \
|
||||
self.filter(parent__program__station__id=id)
|
||||
|
||||
def program(self, program=None, id=None):
|
||||
return self.parent(program, id)
|
||||
|
||||
|
||||
class BaseRerunQuerySet(models.QuerySet):
|
||||
""" Queryset for BaseRerun (sub)classes. """
|
||||
def station(self, station=None, id=None):
|
||||
return self.filter(program__station=station) if id is None else \
|
||||
self.filter(program__station__id=id)
|
||||
@ -158,9 +159,6 @@ class InProgramQuerySet(models.QuerySet):
|
||||
return self.filter(program=program) if id is None else \
|
||||
self.filter(program__id=id)
|
||||
|
||||
|
||||
class BaseRerunQuerySet(InProgramQuerySet):
|
||||
""" Queryset for BaseRerun (sub)classes. """
|
||||
def rerun(self):
|
||||
return self.filter(initial__isnull=False)
|
||||
|
||||
|
@ -93,7 +93,7 @@ def schedule_pre_delete(sender, instance, *args, **kwargs):
|
||||
|
||||
@receiver(signals.post_delete, sender=Diffusion)
|
||||
def diffusion_post_delete(sender, instance, *args, **kwargs):
|
||||
Episode.objects.filter(diffusion__isnull=True, content_isnull=True,
|
||||
Episode.objects.filter(diffusion__isnull=True, content__isnull=True,
|
||||
sound__isnull=True) \
|
||||
.delete()
|
||||
|
||||
|
Reference in New Issue
Block a user