Merge pull request 'add new task for sending new messages to the chat' (#53) from behruz into main
Some checks failed
Deploy to Production / build-and-deploy (push) Failing after 48s

Reviewed-on: #53
This commit is contained in:
2026-04-17 13:15:06 +00:00
10 changed files with 154 additions and 36 deletions

View File

@@ -1,7 +1,7 @@
from rest_framework import serializers
from core.apps.chat.models import ChatmessageModel
from core.apps.chat.tasks.message import send_message_to_chat
class BaseChatmessageSerializer(serializers.ModelSerializer):
sender = serializers.SerializerMethodField()
@@ -72,4 +72,6 @@ class CreateChatmessageSerializer(serializers.ModelSerializer):
def create(self, validated_data):
validated_data["sender"] = self.context["request"].user
return super().create(validated_data)
message = super().create(validated_data)
send_message_to_chat.delay(message.id, self.context["request"])
return message

View File

@@ -7,42 +7,42 @@ 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
# @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
# 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
# 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
# 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(),
},
)
# 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")

View File

@@ -0,0 +1 @@
from .message import send_message_to_chat

View File

@@ -0,0 +1,44 @@
from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer
from celery import shared_task
from core.apps.chat.models import ChatmessageModel
@shared_task
def send_message_to_chat(message_id, request):
try:
message = ChatmessageModel.objects.get(id=message_id)
except ChatmessageModel.DoesNotExist:
return "Not found"
channel_layer = get_channel_layer()
if channel_layer is None:
return
sender_obj = message.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
file_url = request.build_absolute_uri(message.file.url) if message.file else None
async_to_sync(channel_layer.group_send)(
f"chat_room_{message.room_id}",
{
"type": "chat_message",
"id": message.id,
"message_type": message.message_type,
"text": message.text,
"file_url": file_url,
"sender": sender_data,
"created_at": message.created_at.isoformat(),
},
)

View File

@@ -1 +1,2 @@
from .settings import * # noqa
from .region import * # noqa

View File

@@ -0,0 +1,21 @@
from django.contrib import admin
from core.apps.shared.models import RegionModel, DistrictModel, VillageModel
@admin.register(RegionModel)
class RegionAdmin(admin.ModelAdmin):
list_display = ('name', 'code')
search_fields = ('name', 'code')
@admin.register(DistrictModel)
class DistrictAdmin(admin.ModelAdmin):
list_display = ('name', 'code', 'region')
search_fields = ('name', 'code')
@admin.register(VillageModel)
class VillageAdmin(admin.ModelAdmin):
list_display = ('name', 'code', 'district')
search_fields = ('name', 'code')

View File

@@ -1 +1,2 @@
from .settings import * # noqa
from .region import * # noqa

View File

@@ -0,0 +1,28 @@
from django.db import models
from django_core.models import AbstractBaseModel
class RegionModel(AbstractBaseModel):
name = models.CharField(max_length=255, unique=True)
class Meta:
verbose_name = "Region"
verbose_name_plural = "Regions"
class DistrictModel(AbstractBaseModel):
name = models.CharField(max_length=255, unique=True)
region = models.ForeignKey(RegionModel, on_delete=models.CASCADE, related_name='districts')
class Meta:
verbose_name = "District"
verbose_name_plural = "Districts"
class VillageModel(AbstractBaseModel):
name = models.CharField(max_length=255, unique=True)
district = models.ForeignKey(DistrictModel, on_delete=models.CASCADE, related_name='villages')
class Meta:
verbose_name = "Village"
verbose_name_plural = "Villages"

View File

@@ -0,0 +1,20 @@
from rest_framework import serializers
from core.apps.shared.models import RegionModel, VillageModel, DistrictModel
class DistrictSerializer(serializers.ModelSerializer):
class Meta:
model = DistrictModel
fields = ('id', 'name', 'code', 'region')
class VillageSerializer(serializers.ModelSerializer):
class Meta:
model = VillageModel
fields = ('id', 'name', 'code', 'district')
class RegionSerializer(serializers.ModelSerializer):
class Meta:
model = RegionModel
fields = ('id', 'name', 'code')