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}" submission_data = SubmissionOut.from_orm(instance).dict() 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}" file_data = SubmissionFileOut.from_orm(instance).dict() 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}" crop_data = ImageCropOut.from_orm(instance).dict() async_to_sync(channel_layer.group_send)( user_group_name, { "type": "submission.crop.updated", "crop": crop_data, }, )