Files
Backend/farm_ai_assistant/serializers.py
T

101 lines
4.4 KiB
Python
Raw Normal View History

2026-03-25 15:43:00 +03:30
from rest_framework import serializers
2026-03-27 18:18:31 +03:30
from .models import Message
2026-03-25 15:43:00 +03:30
2026-03-27 18:18:31 +03:30
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)
2026-04-26 01:15:01 +03:30
primaryAction = serializers.CharField(required=False, allow_blank=True)
validityPeriod = serializers.CharField(required=False, allow_blank=True)
2026-03-27 18:18:31 +03:30
expandableExplanation = serializers.CharField(required=False, allow_blank=True)
2026-03-25 15:43:00 +03:30
2026-03-27 18:18:31 +03:30
class ConversationSummarySerializer(serializers.Serializer):
id = serializers.UUIDField(source="uuid", read_only=True)
2026-04-23 15:53:59 +03:30
farm_uuid = serializers.UUIDField(source="farm.farm_uuid", read_only=True, allow_null=True)
2026-03-27 18:18:31 +03:30
message_count = serializers.IntegerField(read_only=True)
2026-03-25 15:43:00 +03:30
2026-03-27 18:18:31 +03:30
class ConversationCreateSerializer(serializers.Serializer):
2026-04-23 15:53:59 +03:30
farm_uuid = serializers.UUIDField(required=False, allow_null=True)
2026-03-27 18:18:31 +03:30
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)
2026-04-23 15:53:59 +03:30
farm_uuid = serializers.UUIDField(read_only=True, allow_null=True)
2026-03-27 18:18:31 +03:30
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)
2026-04-23 15:53:59 +03:30
farm_uuid = serializers.UUIDField(read_only=True, allow_null=True)
2026-03-27 18:18:31 +03:30
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)
2026-04-23 15:53:59 +03:30
farm_uuid = serializers.UUIDField(read_only=True, allow_null=True)
2026-03-27 18:18:31 +03:30
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)
2026-04-23 15:53:59 +03:30
farm_uuid = serializers.UUIDField(read_only=True, allow_null=True)
2026-03-25 15:43:00 +03:30
class ChatPostSerializer(serializers.Serializer):
2026-04-26 01:15:01 +03:30
farm_uuid = serializers.UUIDField(required=True)
query = serializers.CharField(required=False, allow_blank=True, default="")
history = serializers.JSONField(required=False)
image_urls = serializers.ListField(
child=serializers.CharField(),
required=False,
default=list,
)
2026-03-25 15:43:00 +03:30
images = serializers.ListField(
child=serializers.CharField(),
required=False,
default=list,
)
conversation_id = serializers.UUIDField(required=False)
2026-03-27 18:18:31 +03:30
def validate(self, attrs):
2026-04-26 01:15:01 +03:30
query = (attrs.get("query") or "").strip()
image_urls = attrs.get("image_urls") or []
2026-03-27 18:18:31 +03:30
images = attrs.get("images") or []
2026-04-26 01:15:01 +03:30
history = attrs.get("history", [])
if isinstance(history, str):
try:
history = serializers.JSONField().to_internal_value(history)
except serializers.ValidationError as exc:
raise serializers.ValidationError({"history": exc.detail}) from exc
if history in (None, ""):
history = []
if not isinstance(history, list):
raise serializers.ValidationError({"history": ["History must be an array or a valid JSON array string."]})
if not query and not image_urls and not images:
raise serializers.ValidationError({"query": ["This field may not be blank unless an image is sent."]})
attrs["query"] = query
attrs["history"] = history
2026-03-27 18:18:31 +03:30
return attrs