68 lines
1.9 KiB
Python
68 lines
1.9 KiB
Python
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,
|
|
}
|
|
)
|