This commit is contained in:
2026-03-27 18:18:31 +03:30
parent 50c7783920
commit bf244042a9
11 changed files with 901 additions and 159 deletions
+51 -25
View File
@@ -1,35 +1,54 @@
from rest_framework import serializers
from .models import Conversation, Message
from .models import Message
class ConversationListSerializer(serializers.ModelSerializer):
conversation_id = serializers.UUIDField(source="uuid", read_only=True)
class Meta:
model = Conversation
fields = [
"conversation_id",
"title",
"updated_at",
]
class ChatSectionSerializer(serializers.Serializer):
type = serializers.ChoiceField(choices=["text", "list", "recommendation", "warning"])
title = serializers.CharField(required=False, allow_blank=True)
content = serializers.CharField(required=False, allow_blank=True)
items = serializers.ListField(child=serializers.CharField(), required=False)
icon = serializers.CharField(required=False, allow_blank=True)
frequency = serializers.CharField(required=False, allow_blank=True)
amount = serializers.CharField(required=False, allow_blank=True)
timing = serializers.CharField(required=False, allow_blank=True)
expandableExplanation = serializers.CharField(required=False, allow_blank=True)
class MessageSerializer(serializers.ModelSerializer):
message_id = serializers.UUIDField(source="uuid", read_only=True)
conversation_id = serializers.UUIDField(source="conversation.uuid", read_only=True)
class ConversationSummarySerializer(serializers.Serializer):
id = serializers.UUIDField(source="uuid", read_only=True)
message_count = serializers.IntegerField(read_only=True)
class Meta:
model = Message
fields = [
"message_id",
"conversation_id",
"role",
"content",
"images",
"raw_response",
"created_at",
]
class ConversationCreateSerializer(serializers.Serializer):
title = serializers.CharField(required=False, allow_blank=True, max_length=255)
farm_context = serializers.JSONField(required=False)
class ChatHistoryMessageSerializer(serializers.Serializer):
message_id = serializers.UUIDField(read_only=True)
conversation_id = serializers.UUIDField(read_only=True)
role = serializers.ChoiceField(choices=Message.ROLE_CHOICES, read_only=True)
content = serializers.CharField(read_only=True, allow_blank=True)
sections = ChatSectionSerializer(many=True, read_only=True)
images = serializers.ListField(child=serializers.CharField(), read_only=True)
created_at = serializers.DateTimeField(read_only=True)
class ConversationMessagesSerializer(serializers.Serializer):
conversation_id = serializers.UUIDField(read_only=True)
messages = ChatHistoryMessageSerializer(many=True, read_only=True)
class ChatResponseDataSerializer(serializers.Serializer):
message_id = serializers.UUIDField(read_only=True)
conversation_id = serializers.UUIDField(read_only=True)
content = serializers.CharField(read_only=True, allow_blank=True)
sections = ChatSectionSerializer(many=True, read_only=True)
class ConversationDeleteSerializer(serializers.Serializer):
conversation_id = serializers.UUIDField(read_only=True)
class ChatPostSerializer(serializers.Serializer):
@@ -42,3 +61,10 @@ class ChatPostSerializer(serializers.Serializer):
conversation_id = serializers.UUIDField(required=False)
title = serializers.CharField(required=False, allow_blank=True, max_length=255)
farm_context = serializers.JSONField(required=False)
def validate(self, attrs):
content = attrs.get("content", "").strip()
images = attrs.get("images") or []
if not content and not images:
raise serializers.ValidationError("Either content or images is required.")
return attrs