from django.contrib.sites.models import Site from django.db.models.signals import post_save, post_delete from django.dispatch import receiver from asgiref.sync import async_to_sync from channels.layers import get_channel_layer from conf.utils import current_site_id @receiver(post_save) def add_current_site(sender, instance, **kwargs): """ Add the current site to a model's sites property after a save. This is required in post save because ManyToManyField fields require an existing key. TODO: Don't run this on *every* post_save. """ if hasattr(instance, "sites"): if not instance.sites.all(): instance.sites.set(Site.objects.filter(id=current_site_id())) instance.save() @receiver(post_save) def sync_clients_save(sender, instance, **kwargs): """ Use django channels to sync all our current clients. """ channel_layer = get_channel_layer() async_to_sync(channel_layer.group_send)( "sync_clients", {"type": "sync_clients.save", "model": sender.__name__} ) @receiver(post_delete) def sync_clients_delete(sender, instance, **kwargs): """ Use django channels to sync all our current clients. """ channel_layer = get_channel_layer() async_to_sync(channel_layer.group_send)( "sync_clients", {"type": "sync_clients.delete", "model": sender.__name__} )