"""Reacts to an admin editing a PlaceSettings row (grid size) by: 1. Rebuilding that event's Redis canvas from history at the (possibly new) dimensions - a resize invalidates the old Redis bytes (wrong length, wrong meaning), so this keeps Redis self-healing instead of relying on the admin remembering to click "Resync canvas from DB" after every resize. 2. Pushing the new size to that event's already-connected clients. Unlike the clock app, place has no periodic heartbeat broadcast to piggyback this onto, so it's broadcast explicitly here instead. """ from asgiref.sync import async_to_sync from channels.layers import get_channel_layer from django.db.models.signals import post_save from django.dispatch import receiver from .broadcast import place_group from .canvas import rebuild_canvas_from_history from .models import PlaceSettings @receiver(post_save, sender=PlaceSettings) def on_settings_saved(sender, instance, **kwargs): rebuild_canvas_from_history(instance.event, instance.width, instance.height) channel_layer = get_channel_layer() if channel_layer is None: return async_to_sync(channel_layer.group_send)( place_group(instance.event.path), { "type": "settings_changed", "width": instance.width, "height": instance.height, }, )