84 lines
2.8 KiB
Python
84 lines
2.8 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
|
|
avatar_url = request.build_absolute_uri(self.context['request'].user.avatar.url) if self.context['request'].user.avatar else None
|
|
send_message_to_chat.delay(message.id, file_url, avatar_url)
|
|
return message
|