application_chat_link.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. """
  2. @project: MaxKB
  3. @Author: niu
  4. @file: application_chat_link.py
  5. @date: 2026/2/9 10:50
  6. @desc:
  7. """
  8. from django.utils.translation import gettext_lazy as _
  9. from rest_framework import serializers
  10. from application.models import Chat, ChatShareLink, ShareLinkType, ChatRecord
  11. from common.exception.app_exception import AppApiException
  12. from common.utils.chat_link_code import UUIDEncoder
  13. import uuid_utils.compat as uuid
  14. class ShareChatRecordModelSerializer(serializers.ModelSerializer):
  15. class Meta:
  16. model = ChatRecord
  17. fields = ['id', 'problem_text', 'answer_text', 'answer_text_list', 'create_time']
  18. class ChatRecordShareLinkRequestSerializer(serializers.Serializer):
  19. chat_record_ids = serializers.ListSerializer(
  20. child=serializers.UUIDField(),
  21. required=False,
  22. allow_empty=False,
  23. label=_("Chat record IDs")
  24. )
  25. is_current_all = serializers.BooleanField(required=False, default=False)
  26. def validate(self, attrs):
  27. if not attrs.get('is_current_all') and not attrs.get('chat_record_ids'):
  28. raise serializers.ValidationError(_('Chat record ids can not be empty'))
  29. return attrs
  30. class ChatRecordShareLinkSerializer(serializers.Serializer):
  31. chat_id = serializers.UUIDField(required=True, label=_("Conversation ID"))
  32. application_id = serializers.UUIDField(required=True, label=_("Application ID"))
  33. user_id = serializers.UUIDField(required=False, label=_("User ID"))
  34. def is_valid(self, *, raise_exception=False):
  35. super().is_valid(raise_exception=True)
  36. chat_id = self.data.get('chat_id')
  37. application_id = self.data.get('application_id')
  38. chat_query_set = Chat.objects.filter(id=chat_id, application_id=application_id, is_deleted=False)
  39. if not chat_query_set.exists():
  40. raise AppApiException(500, _('Chat id does not exist'))
  41. def generate_link(self, instance, with_valid=True):
  42. if with_valid:
  43. request_serializer = ChatRecordShareLinkRequestSerializer(data=instance)
  44. request_serializer.is_valid(raise_exception=True)
  45. self.is_valid(raise_exception=True)
  46. if not instance.get('is_current_all', False):
  47. chat_record_ids: list[str] = instance.get('chat_record_ids')
  48. record_count = ChatRecord.objects.filter(id__in=chat_record_ids, chat_id=self.data.get('chat_id')).count()
  49. if record_count != len(chat_record_ids):
  50. raise AppApiException(500, _('Invalid chat record ids'))
  51. chat_id = self.data.get('chat_id')
  52. application_id = self.data.get('application_id')
  53. user_id = self.data.get('user_id')
  54. is_current_all = instance.get('is_current_all', False)
  55. if is_current_all:
  56. sorted_ids = list(
  57. ChatRecord.objects.filter(chat_id=chat_id).order_by('create_time').values_list('id',flat=True)
  58. )
  59. else:
  60. chat_record_ids: list[str] = instance.get('chat_record_ids')
  61. sorted_ids = list(ChatRecord.objects.filter(id__in=chat_record_ids).order_by('create_time').values_list('id',flat=True))
  62. existing = ChatShareLink.objects.filter(
  63. chat_id=chat_id, application_id=application_id,
  64. share_type=ShareLinkType.PUBLIC,
  65. user_id=user_id,
  66. chat_record_ids=sorted_ids
  67. ).first()
  68. if existing:
  69. return {'link': UUIDEncoder.encode(existing.id)}
  70. chat_share_link_model = ChatShareLink(
  71. id=uuid.uuid7(),
  72. chat_id=chat_id,
  73. application_id=application_id,
  74. share_type=ShareLinkType.PUBLIC,
  75. user_id=user_id,
  76. chat_record_ids=sorted_ids
  77. )
  78. chat_share_link_model.save()
  79. link = UUIDEncoder.encode(chat_share_link_model.id)
  80. return {'link': link}
  81. class ChatShareLinkDetailSerializer(serializers.Serializer):
  82. link = serializers.CharField(required=True, label=_("Link"))
  83. def is_valid(self, *, raise_exception=False):
  84. super().is_valid(raise_exception=True)
  85. link = self.data.get('link')
  86. share_link_id = UUIDEncoder.decode_to_str(link)
  87. share_link_query_set = ChatShareLink.objects.filter(id=share_link_id).first()
  88. if not share_link_query_set:
  89. raise AppApiException(500, _('Share link does not exist'))
  90. if share_link_query_set.chat.is_deleted:
  91. raise AppApiException(500, _('Chat has been deleted'))
  92. return share_link_query_set
  93. def get_record_list(self):
  94. share_link_model = self.is_valid(raise_exception=True)
  95. chat_record_model_list = ChatRecord.objects.filter(id__in=share_link_model.chat_record_ids,
  96. chat_id=share_link_model.chat_id).order_by('create_time')
  97. abstract = Chat.objects.filter(
  98. id=share_link_model.chat_id
  99. ).values_list('abstract', flat=True).first()
  100. chat_record_list = ShareChatRecordModelSerializer(chat_record_model_list, many=True).data
  101. return {
  102. 'abstract': abstract,
  103. 'chat_record_list': chat_record_list
  104. }