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
Some checks failed
Deploy to Production / build-and-deploy (push) Failing after 48s
Reviewed-on: #53
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from core.apps.chat.models import ChatmessageModel
|
from core.apps.chat.models import ChatmessageModel
|
||||||
|
from core.apps.chat.tasks.message import send_message_to_chat
|
||||||
|
|
||||||
class BaseChatmessageSerializer(serializers.ModelSerializer):
|
class BaseChatmessageSerializer(serializers.ModelSerializer):
|
||||||
sender = serializers.SerializerMethodField()
|
sender = serializers.SerializerMethodField()
|
||||||
@@ -72,4 +72,6 @@ class CreateChatmessageSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
validated_data["sender"] = self.context["request"].user
|
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
|
||||||
|
|||||||
@@ -7,42 +7,42 @@ from django.dispatch import receiver
|
|||||||
from core.apps.chat.models import ChatmessageModel, ChatroomModel
|
from core.apps.chat.models import ChatmessageModel, ChatroomModel
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender=ChatmessageModel)
|
# @receiver(post_save, sender=ChatmessageModel)
|
||||||
def broadcast_new_message(sender, instance, created, **kwargs):
|
# def broadcast_new_message(sender, instance, created, **kwargs):
|
||||||
"""Yangi xabar saqlanganda xonadagi barcha WS ulanishlariga yuboradi."""
|
# """Yangi xabar saqlanganda xonadagi barcha WS ulanishlariga yuboradi."""
|
||||||
if not created:
|
# if not created:
|
||||||
return
|
# return
|
||||||
|
|
||||||
channel_layer = get_channel_layer()
|
# channel_layer = get_channel_layer()
|
||||||
if channel_layer is None:
|
# if channel_layer is None:
|
||||||
return
|
# return
|
||||||
|
|
||||||
sender_obj = instance.sender
|
# sender_obj = instance.sender
|
||||||
if sender_obj:
|
# if sender_obj:
|
||||||
full_name = sender_obj.get_full_name().strip() or str(sender_obj.phone)
|
# full_name = sender_obj.get_full_name().strip() or str(sender_obj.phone)
|
||||||
sender_data = {
|
# sender_data = {
|
||||||
"id": sender_obj.id,
|
# "id": sender_obj.id,
|
||||||
"full_name": full_name,
|
# "full_name": full_name,
|
||||||
"role": sender_obj.role,
|
# "role": sender_obj.role,
|
||||||
}
|
# }
|
||||||
else:
|
# else:
|
||||||
sender_data = None
|
# sender_data = None
|
||||||
|
|
||||||
site_url = getattr(settings, "SITE_URL", "").rstrip("/")
|
# site_url = getattr(settings, "SITE_URL", "").rstrip("/")
|
||||||
file_url = (site_url + instance.file.url) if instance.file else None
|
# file_url = (site_url + instance.file.url) if instance.file else None
|
||||||
|
|
||||||
async_to_sync(channel_layer.group_send)(
|
# async_to_sync(channel_layer.group_send)(
|
||||||
f"chat_room_{instance.room_id}",
|
# f"chat_room_{instance.room_id}",
|
||||||
{
|
# {
|
||||||
"type": "chat_message",
|
# "type": "chat_message",
|
||||||
"id": instance.id,
|
# "id": instance.id,
|
||||||
"message_type": instance.message_type,
|
# "message_type": instance.message_type,
|
||||||
"text": instance.text,
|
# "text": instance.text,
|
||||||
"file_url": file_url,
|
# "file_url": file_url,
|
||||||
"sender": sender_data,
|
# "sender": sender_data,
|
||||||
"created_at": instance.created_at.isoformat(),
|
# "created_at": instance.created_at.isoformat(),
|
||||||
},
|
# },
|
||||||
)
|
# )
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender="evaluation.AutoEvaluationModel")
|
@receiver(post_save, sender="evaluation.AutoEvaluationModel")
|
||||||
|
|||||||
1
core/apps/chat/tasks/__init__.py
Normal file
1
core/apps/chat/tasks/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from .message import send_message_to_chat
|
||||||
44
core/apps/chat/tasks/message.py
Normal file
44
core/apps/chat/tasks/message.py
Normal 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(),
|
||||||
|
},
|
||||||
|
)
|
||||||
@@ -1 +1,2 @@
|
|||||||
from .settings import * # noqa
|
from .settings import * # noqa
|
||||||
|
from .region import * # noqa
|
||||||
|
|||||||
21
core/apps/shared/admin/region.py
Normal file
21
core/apps/shared/admin/region.py
Normal 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')
|
||||||
@@ -1 +1,2 @@
|
|||||||
from .settings import * # noqa
|
from .settings import * # noqa
|
||||||
|
from .region import * # noqa
|
||||||
|
|||||||
28
core/apps/shared/models/region.py
Normal file
28
core/apps/shared/models/region.py
Normal 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"
|
||||||
20
core/apps/shared/serializers/region/district.py
Normal file
20
core/apps/shared/serializers/region/district.py
Normal 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')
|
||||||
0
core/apps/shared/serializers/region/region.py
Normal file
0
core/apps/shared/serializers/region/region.py
Normal file
Reference in New Issue
Block a user