aircox-radiocampus/aircox/signals.py

96 lines
3.1 KiB
Python
Executable File

from django.db.models.signals import post_save, pre_save, pre_delete, m2m_changed
from django.contrib.auth.models import User, Group, Permission
from django.dispatch import receiver
from django.utils.translation import ugettext as _, ugettext_lazy
from django.contrib.contenttypes.models import ContentType
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):
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)
# FIXME: avoid copy of the code in schedule_post_saved and
# schedule_pre_delete
@receiver(post_save, sender=models.Schedule)
def schedule_post_saved(sender, instance, created, *args, **kwargs):
# TODO: case instance.program has changed
if not instance.program.sync:
return
initial = instance._Schedule__initial
if not initial or not instance.changed(['date','duration', 'frequency']):
return
if not initial.get('date') or not initial.get('duration') or not initial.get('frequency'):
return
# old schedule and timedelta
old_sched = models.Schedule(
program = instance.program,
date = initial['date'],
duration = initial['duration'],
frequency = initial['frequency'],
)
delta = instance.date - old_sched.date
# update diffusions...
qs = models.Diffusion.objects.after(
instance.program.station,
program = instance.program
)
for diff in qs:
if not old_sched.match(diff.date):
continue
diff.start += delta
diff.end = diff.start + utils.to_timedelta(instance.duration)
diff.save()
@receiver(pre_delete, sender=models.Schedule)
def schedule_pre_delete(sender, instance, *args, **kwargs):
if not instance.program.sync:
return
initial = instance._Schedule__initial
if not initial or not instance.changed(['date','duration', 'frequency']):
return
old_sched = models.Schedule(
date = initial['date'],
duration = initial['duration'],
frequency = initial['frequency'],
)
qs = models.Diffusion.objects.after(instance.program.station).filter(
program = instance.program
)
for diff in qs:
if not old_sched.match(diff.date):
continue
diff.delete()