i_application_node.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. # coding=utf-8
  2. from typing import Type
  3. from rest_framework import serializers
  4. from application.flow.common import WorkflowMode
  5. from application.flow.i_step_node import INode, NodeResult
  6. from django.utils.translation import gettext_lazy as _
  7. from application.models import ChatSourceChoices
  8. class ApplicationNodeSerializer(serializers.Serializer):
  9. application_id = serializers.CharField(required=True, label=_("Application ID"))
  10. question_reference_address = serializers.ListField(required=True,
  11. label=_("User Questions"))
  12. api_input_field_list = serializers.ListField(required=False, label=_("API Input Fields"))
  13. user_input_field_list = serializers.ListField(required=False,
  14. label=_("User Input Fields"))
  15. image_list = serializers.ListField(required=False, label=_("picture"))
  16. document_list = serializers.ListField(required=False, label=_("document"))
  17. audio_list = serializers.ListField(required=False, label=_("Audio"))
  18. video_list = serializers.ListField(required=False, label=_("Video"))
  19. child_node = serializers.DictField(required=False, allow_null=True,
  20. label=_("Child Nodes"))
  21. node_data = serializers.DictField(required=False, allow_null=True, label=_("Form Data"))
  22. class IApplicationNode(INode):
  23. type = 'application-node'
  24. support = [WorkflowMode.APPLICATION, WorkflowMode.APPLICATION_LOOP]
  25. def get_node_params_serializer_class(self) -> Type[serializers.Serializer]:
  26. return ApplicationNodeSerializer
  27. def _run(self):
  28. question = self.workflow_manage.get_reference_field(
  29. self.node_params_serializer.data.get('question_reference_address')[0],
  30. self.node_params_serializer.data.get('question_reference_address')[1:])
  31. kwargs = {}
  32. for api_input_field in self.node_params_serializer.data.get('api_input_field_list', []):
  33. value = api_input_field.get('value', [''])[0] if api_input_field.get('value') else ''
  34. kwargs[api_input_field['variable']] = self.workflow_manage.get_reference_field(value,
  35. api_input_field['value'][
  36. 1:]) if value != '' else ''
  37. for user_input_field in self.node_params_serializer.data.get('user_input_field_list', []):
  38. value = user_input_field.get('value', [''])[0] if user_input_field.get('value') else ''
  39. kwargs[user_input_field['field']] = self.workflow_manage.get_reference_field(value,
  40. user_input_field['value'][
  41. 1:]) if value != '' else ''
  42. # 判断是否包含这个属性
  43. app_document_list = self.node_params_serializer.data.get('document_list', [])
  44. if app_document_list and len(app_document_list) > 0:
  45. app_document_list = self.workflow_manage.get_reference_field(
  46. app_document_list[0],
  47. app_document_list[1:])
  48. for document in app_document_list:
  49. if 'file_id' not in document:
  50. raise ValueError(
  51. _("Parameter value error: The uploaded document lacks file_id, and the document upload fails"))
  52. app_image_list = self.node_params_serializer.data.get('image_list', [])
  53. if app_image_list and len(app_image_list) > 0:
  54. app_image_list = self.workflow_manage.get_reference_field(
  55. app_image_list[0],
  56. app_image_list[1:])
  57. for image in app_image_list:
  58. if 'file_id' not in image:
  59. raise ValueError(
  60. _("Parameter value error: The uploaded image lacks file_id, and the image upload fails"))
  61. app_audio_list = self.node_params_serializer.data.get('audio_list', [])
  62. if app_audio_list and len(app_audio_list) > 0:
  63. app_audio_list = self.workflow_manage.get_reference_field(
  64. app_audio_list[0],
  65. app_audio_list[1:])
  66. for audio in app_audio_list:
  67. if 'file_id' not in audio:
  68. raise ValueError(
  69. _("Parameter value error: The uploaded audio lacks file_id, and the audio upload fails."))
  70. app_video_list = self.node_params_serializer.data.get('video_list', [])
  71. if app_video_list and len(app_video_list) > 0:
  72. app_video_list = self.workflow_manage.get_reference_field(
  73. app_video_list[0],
  74. app_video_list[1:]
  75. )
  76. for video in app_video_list:
  77. if 'file_id' not in video:
  78. raise ValueError(
  79. _("Parameter value error: The uploaded video lacks file_id, and the video upload fails."))
  80. return self.execute(**{**self.flow_params_serializer.data, **self.node_params_serializer.data},
  81. app_document_list=app_document_list, app_image_list=app_image_list,
  82. app_audio_list=app_audio_list,
  83. app_video_list=app_video_list,
  84. ip_address=self.workflow_params.get('ip_address') or '-',
  85. source=self.workflow_params.get('source') or {"type": ChatSourceChoices.ONLINE.value},
  86. message=str(question), **kwargs)
  87. def execute(self, application_id, message, chat_id, chat_record_id, stream, re_chat, client_id, client_type,
  88. app_document_list=None, app_image_list=None, app_audio_list=None, app_video_list=None, child_node=None,
  89. node_data=None,
  90. ip_address=None,
  91. source=None,
  92. **kwargs) -> NodeResult:
  93. pass