allow only one program or diffusion for pages;

in cms.signals, manage cases when Diffusion.initial is set/changed &
clean up;

fix bug in loglist nav when max_age is 0 (no limit);

work on design for date lists;

fix bug in player on item removal;
This commit is contained in:
bkfox
2017-06-19 00:21:22 +02:00
parent 5fbac07829
commit f6e0d8d956
9 changed files with 123 additions and 44 deletions

View File

@ -1,3 +1,4 @@
from django.db.models import Q
from django.db.models.signals import post_save, pre_delete
from django.dispatch import receiver
from django.utils.translation import ugettext as _, ugettext_lazy
@ -142,17 +143,49 @@ def program_post_saved(sender, instance, created, *args, **kwargs):
parent.add_child(instance = page)
def void_pages_of(page_set):
"""
Return a queryset from page_set that select only empty pages. If
`inverse` is True, select only pages that are not empty.
Empty is defined on theses parameters:
- `numchild = 0` => no children
- no headline
- no body
"""
if not page_set.count():
return
page_set = page_set.filter(numchild = 0)
# as publications
page_set = models.Publication.objects.filter(
page_ptr_id__in = page_set.values('pk')
)
# only empty
q = (Q(headline__isnull = True) | Q(headline = '')) & \
(Q(body__isnull = True) | Q(body = ''))
return page_set.filter(q)
@receiver(pre_delete, sender=aircox.Program)
def program_post_deleted(sender, instance, *args, **kwargs):
for page in instance.page.all():
if page.specific.body or Page.objects.descendant_of(page).count():
continue
page.delete()
void_pages_of(instance.page).delete()
@receiver(post_save, sender=aircox.Diffusion)
def diffusion_post_saved(sender, instance, created, *args, **kwargs):
if not created or instance.page.count():
initial = instance.initial
if initial:
if not created and hasattr(instance, 'page'):
# fuck it
page = instance.page
page.diffusion = None
page.save()
return
if instance.page:
return
page = models.DiffusionPage.from_diffusion(
@ -164,9 +197,5 @@ def diffusion_post_saved(sender, instance, created, *args, **kwargs):
@receiver(pre_delete, sender=aircox.Diffusion)
def diffusion_pre_deleted(sender, instance, *args, **kwargs):
for page in instance.page.all():
if page.specific.body or Page.objects.descendant_of(page).count():
continue
page.delete()
void_pages_of(instance.page).delete()