diff --git a/aircox_cms/models.py b/aircox_cms/models.py index c8dd9a4..c5a1c55 100644 --- a/aircox_cms/models.py +++ b/aircox_cms/models.py @@ -384,6 +384,7 @@ class ProgramPage(Publication): verbose_name = _('program'), related_name = 'page', on_delete=models.SET_NULL, + unique = True, blank=True, null=True, ) # rss = models.URLField() @@ -469,8 +470,11 @@ class DiffusionPage(Publication): aircox.models.Diffusion, verbose_name = _('diffusion'), related_name = 'page', - on_delete=models.SET_NULL, + unique = True, null=True, + # not blank because we enforce the connection to a diffusion + # (still users always tend to break sth) + on_delete=models.SET_NULL, limit_choices_to = { 'initial__isnull': True, }, diff --git a/aircox_cms/signals.py b/aircox_cms/signals.py index 49bc113..d28c2a1 100644 --- a/aircox_cms/signals.py +++ b/aircox_cms/signals.py @@ -1,4 +1,4 @@ -from django.db.models.signals import post_save +from django.db.models.signals import post_save, pre_delete from django.dispatch import receiver from django.utils.translation import ugettext as _, ugettext_lazy from django.contrib.contenttypes.models import ContentType @@ -131,4 +131,35 @@ def program_post_saved(sender, instance, created, *args, **kwargs): ) parent.add_child(instance = page) +@receiver(pre_delete, sender=aircox.Program) +def program_post_deleted(sender, instance, *args, **kwargs): + if not instance.page or ( + instance.page.first().body or + Page.objects.descendant_of(instance).count() + ): + return + instance.page.delete() + + +@receiver(post_save, sender=aircox.Diffusion) +def diffusion_post_saved(sender, instance, created, *args, **kwargs): + import aircox_cms.models as models + # TODO/FIXME: what about confirmed/unconfirmed; + # what about delete when not confirmed? + if not created or instance.page.count(): + return + + page = models.DiffusionPage.from_diffusion( + instance, live = False + ) + instance.program.page.first().add_child( + instance = page + ) + +@receiver(pre_delete, sender=aircox.Program) +def diffusion_post_deleted(sender, instance, *args, **kwargs): + if not instance.page or instance.page.first().body: + return + instance.page.delete() +