Files
backend-v1/core/apps/chat/serializers/chat/ChatMessage.py
2026-04-18 16:24:02 +05:00

83 lines
2.6 KiB
Python

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()
file_url = serializers.SerializerMethodField()
def get_sender(self, obj):
if obj.sender is None:
return None
full_name = obj.sender.get_full_name().strip()
if not full_name:
full_name = str(obj.sender.phone)
request = self.context.get("request")
return {
"id": obj.sender.id,
"full_name": full_name,
"role": obj.sender.role,
"phone": obj.sender.phone,
"avatar": request.build_absolute_uri(obj.sender.avatar.url) if obj.sender.avatar else None,
}
def get_file_url(self, obj):
if not obj.file:
return None
request = self.context.get("request")
if request:
return request.build_absolute_uri(obj.file.url)
return obj.file.url
class Meta:
model = ChatmessageModel
fields = [
"id",
"room",
"sender",
"message_type",
"text",
"file_url",
"is_read",
"created_at",
]
class ListChatmessageSerializer(BaseChatmessageSerializer):
class Meta(BaseChatmessageSerializer.Meta): ...
class RetrieveChatmessageSerializer(BaseChatmessageSerializer):
class Meta(BaseChatmessageSerializer.Meta): ...
class CreateChatmessageSerializer(serializers.ModelSerializer):
class Meta:
model = ChatmessageModel
fields = [
"room",
"message_type",
"text",
"file",
]
def validate(self, attrs):
message_type = attrs.get("message_type", "text")
text = attrs.get("text", "").strip() if attrs.get("text") else ""
file = attrs.get("file")
if message_type == "text" and not text:
raise serializers.ValidationError({"text": "Matn xabari uchun text majburiy."})
if message_type != "text" and not file:
raise serializers.ValidationError({"file": f"{message_type} xabari uchun fayl majburiy."})
return attrs
def create(self, validated_data):
validated_data["sender"] = self.context["request"].user
request = self.context["request"]
message = super().create(validated_data)
file_url = request.build_absolute_uri(message.file.url) if message.file else None
send_message_to_chat.delay(message.id, file_url)
return message