aircox-radiocampus/aircox/signals.py

93 lines
3.0 KiB
Python
Executable File

import pytz
from django.contrib.auth.models import User, Group, Permission
from django.contrib.contenttypes.models import ContentType
from django.db.models import F
from django.db.models.signals import post_save, pre_save, pre_delete, m2m_changed
from django.dispatch import receiver, Signal
from django.utils import timezone as tz
from django.utils.translation import ugettext as _, ugettext_lazy
import aircox.models as models
import aircox.utils as utils
import aircox.settings as settings
# Add a default group to a user when it is created. It also assigns a list
# of permissions to the group if it is created.
#
# - group name: settings.AIRCOX_DEFAULT_USER_GROUP
# - group permissions: settings.AIRCOX_DEFAULT_USER_GROUP_PERMS
#
@receiver(post_save, sender=User)
def user_default_groups(sender, instance, created, *args, **kwargs):
"""
Set users to different default groups
"""
if not created or instance.is_superuser:
return
for groupName, permissions in settings.AIRCOX_DEFAULT_USER_GROUPS.items():
if instance.groups.filter(name = groupName).count():
continue
group, created = Group.objects.get_or_create(name = groupName)
if created and permissions:
for codename in permissions:
permission = Permission.objects.filter(codename = codename).first()
if permission:
group.permissions.add(permission)
group.save()
instance.groups.add(group)
@receiver(post_save, sender=models.Program)
def program_post_save(sender, instance, created, *args, **kwargs):
"""
Clean-up later diffusions when a program becomes inactive
"""
if not program.active:
program.diffusion_set.after().delete()
@receiver(post_save, sender=models.Schedule)
def schedule_post_save(sender, instance, created, *args, **kwargs):
"""
Handles Schedule's time, duration and timezone changes and update
corresponding diffusions accordingly.
"""
if created or not instance.program.sync or \
not instance.changed(['time','duration','timezone']):
return
initial = instance._Schedule__initial
initial = models.Schedule(**{ k: v
for k, v in instance._Schedule__initial.items()
if not k.startswith('_')
})
today = tz.datetime.today()
delta = instance.normalize(today) - \
initial.normalize(today)
qs = models.Diffusion.objects.program(instance.program).after()
pks = [ d.pk for d in qs if initial.match(d.date) ]
qs.filter(pk__in = pks).update(
start = F('start') + delta,
end = F('start') + delta + utils.to_timedelta(instance.duration)
)
@receiver(pre_delete, sender=models.Schedule)
def schedule_pre_delete(sender, instance, *args, **kwargs):
"""
Delete later corresponding diffusion to a changed schedule.
"""
if not instance.program.sync:
return
qs = models.Diffusion.objects.program(instance.program).after()
pks = [ d.pk for d in qs if instance.match(d.date) ]
qs.filter(pk__in = pks).delete()