from rest_framework import serializers from core.apps.chat.models import ChatmessageModel 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) return { "id": obj.sender.id, "full_name": full_name, "role": obj.sender.role, } 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 return super().create(validated_data)