import json from django.db.models.signals import post_save from django.dispatch import receiver from asgiref.sync import async_to_sync from channels.layers import get_channel_layer from submissions.models import Submission, SubmissionFile, ImageCrop from submissions.schemas import SubmissionOut, SubmissionFileOut, ImageCropOut channel_layer = get_channel_layer() @receiver(post_save, sender=Submission) def broadcast_submission_update(sender, instance, created, **kwargs): if not instance.user: return user_group_name = f"submissions_user_{instance.user.id}" schema = SubmissionOut.model_validate(instance) submission_data = schema.model_dump(mode="json") async_to_sync(channel_layer.group_send)( user_group_name, { "type": "submission.updated", "submission": submission_data, } ) @receiver(post_save, sender=SubmissionFile) def broadcast_submission_file_update(sender, instance, created, **kwargs): submission = instance.submission if not submission.user: return user_group_name = f"submissions_user_{submission.user.id}" schema = SubmissionFileOut.model_validate(instance) file_data = schema.model_dump(mode="json") async_to_sync(channel_layer.group_send)( user_group_name, { "type": "submission.file.updated", "file": file_data, } ) @receiver(post_save, sender=ImageCrop) def broadcast_image_crop_update(sender, instance, created, **kwargs): submission = instance.submission_file.submission if not submission.user: return user_group_name = f"submissions_user_{submission.user.id}" schema = ImageCropOut.model_validate(instance) crop_data = schema.model_dump(mode="json") async_to_sync(channel_layer.group_send)( user_group_name, { "type": "submission.crop.updated", "crop": crop_data, } )