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