56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
from asgiref.sync import async_to_sync
|
|
from channels.layers import get_channel_layer
|
|
from django.conf import settings
|
|
from django.db.models.signals import post_save
|
|
from django.dispatch import receiver
|
|
|
|
from core.apps.chat.models import ChatmessageModel, ChatroomModel
|
|
|
|
|
|
@receiver(post_save, sender=ChatmessageModel)
|
|
def broadcast_new_message(sender, instance, created, **kwargs):
|
|
"""Yangi xabar saqlanganda xonadagi barcha WS ulanishlariga yuboradi."""
|
|
if not created:
|
|
return
|
|
|
|
channel_layer = get_channel_layer()
|
|
if channel_layer is None:
|
|
return
|
|
|
|
sender_obj = instance.sender
|
|
if sender_obj:
|
|
full_name = sender_obj.get_full_name().strip() or str(sender_obj.phone)
|
|
sender_data = {
|
|
"id": sender_obj.id,
|
|
"full_name": full_name,
|
|
"role": sender_obj.role,
|
|
}
|
|
else:
|
|
sender_data = None
|
|
|
|
site_url = getattr(settings, "SITE_URL", "").rstrip("/")
|
|
file_url = (site_url + instance.file.url) if instance.file else None
|
|
|
|
async_to_sync(channel_layer.group_send)(
|
|
f"chat_room_{instance.room_id}",
|
|
{
|
|
"type": "chat_message",
|
|
"id": instance.id,
|
|
"message_type": instance.message_type,
|
|
"text": instance.text,
|
|
"file_url": file_url,
|
|
"sender": sender_data,
|
|
"created_at": instance.created_at.isoformat(),
|
|
},
|
|
)
|
|
|
|
|
|
@receiver(post_save, sender="evaluation.AutoEvaluationModel")
|
|
def auto_create_chatroom(sender, instance, created, **kwargs):
|
|
"""AutoEvaluation yaratilganda avtomatik chat xonasi ochiladi."""
|
|
if created:
|
|
ChatroomModel.objects.get_or_create(
|
|
auto_evaluation=instance,
|
|
defaults={"type": "auto_evaluation"},
|
|
)
|