From 505c33a5540b76cd023f269f34ceb0a5e345e0eb Mon Sep 17 00:00:00 2001 From: xoliqberdiyev Date: Fri, 17 Apr 2026 18:14:24 +0500 Subject: [PATCH] add new task for sending new messages to the chat --- .../apps/chat/serializers/chat/ChatMessage.py | 6 +- core/apps/chat/signals/chat.py | 64 +++++++++---------- core/apps/chat/tasks/__init__.py | 1 + core/apps/chat/tasks/message.py | 44 +++++++++++++ core/apps/shared/admin/__init__.py | 3 +- core/apps/shared/admin/region.py | 21 ++++++ core/apps/shared/models/__init__.py | 3 +- core/apps/shared/models/region.py | 28 ++++++++ .../shared/serializers/region/district.py | 20 ++++++ core/apps/shared/serializers/region/region.py | 0 10 files changed, 154 insertions(+), 36 deletions(-) create mode 100644 core/apps/chat/tasks/__init__.py create mode 100644 core/apps/chat/tasks/message.py create mode 100644 core/apps/shared/admin/region.py create mode 100644 core/apps/shared/models/region.py create mode 100644 core/apps/shared/serializers/region/district.py create mode 100644 core/apps/shared/serializers/region/region.py diff --git a/core/apps/chat/serializers/chat/ChatMessage.py b/core/apps/chat/serializers/chat/ChatMessage.py index 72e0d75..196be95 100644 --- a/core/apps/chat/serializers/chat/ChatMessage.py +++ b/core/apps/chat/serializers/chat/ChatMessage.py @@ -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 diff --git a/core/apps/chat/signals/chat.py b/core/apps/chat/signals/chat.py index b578ba1..ae4bdd4 100644 --- a/core/apps/chat/signals/chat.py +++ b/core/apps/chat/signals/chat.py @@ -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") diff --git a/core/apps/chat/tasks/__init__.py b/core/apps/chat/tasks/__init__.py new file mode 100644 index 0000000..2c4ba34 --- /dev/null +++ b/core/apps/chat/tasks/__init__.py @@ -0,0 +1 @@ +from .message import send_message_to_chat diff --git a/core/apps/chat/tasks/message.py b/core/apps/chat/tasks/message.py new file mode 100644 index 0000000..62f631a --- /dev/null +++ b/core/apps/chat/tasks/message.py @@ -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(), + }, + ) diff --git a/core/apps/shared/admin/__init__.py b/core/apps/shared/admin/__init__.py index 134e613..7833122 100644 --- a/core/apps/shared/admin/__init__.py +++ b/core/apps/shared/admin/__init__.py @@ -1 +1,2 @@ -from .settings import * # noqa \ No newline at end of file +from .settings import * # noqa +from .region import * # noqa diff --git a/core/apps/shared/admin/region.py b/core/apps/shared/admin/region.py new file mode 100644 index 0000000..97665ef --- /dev/null +++ b/core/apps/shared/admin/region.py @@ -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') diff --git a/core/apps/shared/models/__init__.py b/core/apps/shared/models/__init__.py index 134e613..7833122 100644 --- a/core/apps/shared/models/__init__.py +++ b/core/apps/shared/models/__init__.py @@ -1 +1,2 @@ -from .settings import * # noqa \ No newline at end of file +from .settings import * # noqa +from .region import * # noqa diff --git a/core/apps/shared/models/region.py b/core/apps/shared/models/region.py new file mode 100644 index 0000000..31d095b --- /dev/null +++ b/core/apps/shared/models/region.py @@ -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" diff --git a/core/apps/shared/serializers/region/district.py b/core/apps/shared/serializers/region/district.py new file mode 100644 index 0000000..8da5943 --- /dev/null +++ b/core/apps/shared/serializers/region/district.py @@ -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') diff --git a/core/apps/shared/serializers/region/region.py b/core/apps/shared/serializers/region/region.py new file mode 100644 index 0000000..e69de29