work on pages, filters, lists

This commit is contained in:
bkfox
2019-09-09 02:47:57 +02:00
parent c68e21ee57
commit 215a6ac331
45 changed files with 424 additions and 275 deletions

View File

@ -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')

View File

@ -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')

View File

@ -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):

View File

@ -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)

View File

@ -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()