1010import pickle
1111import re
1212import uuid
13- from typing import List
1413
1514from django .core import validators
1615from django .db import transaction
1716from django .db .models import QuerySet , Q
1817from django .http import HttpResponse
18+ from django .utils .translation import gettext_lazy as _
1919from rest_framework import serializers , status
2020
2121from common .db .search import page_search
2222from common .exception .app_exception import AppApiException
23- from common .field .common import UploadedFileField
23+ from common .field .common import UploadedFileField , UploadedImageField
2424from common .response import result
2525from common .util .field_message import ErrMessage
2626from common .util .function_code import FunctionExecutor
27+ from dataset .models import Image
2728from function_lib .models .function import FunctionLib
2829from smartdoc .const import CONFIG
29- from django .utils .translation import gettext_lazy as _
3030
3131function_executor = FunctionExecutor (CONFIG .get ('SANDBOX' ))
3232
@@ -39,7 +39,7 @@ def __init__(self, function_lib: dict, version: str):
3939class FunctionLibModelSerializer (serializers .ModelSerializer ):
4040 class Meta :
4141 model = FunctionLib
42- fields = ['id' , 'name' , 'desc' , 'code' , 'input_field_list' , 'permission_type' , 'is_active' , 'user_id' ,
42+ fields = ['id' , 'name' , 'icon' , ' desc' , 'code' , 'input_field_list' , 'init_field_list ' , 'permission_type' , 'is_active' , 'user_id' ,
4343 'create_time' , 'update_time' ]
4444
4545
@@ -65,6 +65,7 @@ class DebugField(serializers.Serializer):
6565class DebugInstance (serializers .Serializer ):
6666 debug_field_list = DebugField (required = True , many = True )
6767 input_field_list = FunctionLibInputField (required = True , many = True )
68+ init_field_list = serializers .ListField (required = False , default = list )
6869 code = serializers .CharField (required = True , error_messages = ErrMessage .char (_ ('function content' )))
6970
7071
@@ -80,6 +81,8 @@ class EditFunctionLib(serializers.Serializer):
8081
8182 input_field_list = FunctionLibInputField (required = False , many = True )
8283
84+ init_field_list = serializers .ListField (required = False , default = list )
85+
8386 is_active = serializers .BooleanField (required = False , error_messages = ErrMessage .char (_ ('Is active' )))
8487
8588
@@ -93,6 +96,8 @@ class CreateFunctionLib(serializers.Serializer):
9396
9497 input_field_list = FunctionLibInputField (required = True , many = True )
9598
99+ init_field_list = serializers .ListField (required = False , default = list )
100+
96101 permission_type = serializers .CharField (required = True , error_messages = ErrMessage .char (_ ('permission' )), validators = [
97102 validators .RegexValidator (regex = re .compile ("^PUBLIC|PRIVATE$" ),
98103 message = "权限只支持PUBLIC|PRIVATE" , code = 500 )
@@ -148,6 +153,7 @@ def insert(self, instance, with_valid=True):
148153 code = instance .get ('code' ),
149154 user_id = self .data .get ('user_id' ),
150155 input_field_list = instance .get ('input_field_list' ),
156+ init_field_list = instance .get ('init_field_list' ),
151157 permission_type = instance .get ('permission_type' ),
152158 is_active = instance .get ('is_active' , True ))
153159 function_lib .save ()
@@ -163,12 +169,16 @@ def debug(self, debug_instance, with_valid=True):
163169 input_field_list = debug_instance .get ('input_field_list' )
164170 code = debug_instance .get ('code' )
165171 debug_field_list = debug_instance .get ('debug_field_list' )
172+ init_field_list = debug_instance .get ('init_field_list' )
173+ init_params = {field .get ('field' ): field .get ('value' ) if field .get ('value' , None ) is not None else field .get ('default_value' ) for field in init_field_list }
166174 params = {field .get ('name' ): self .convert_value (field .get ('name' ), field .get ('value' ), field .get ('type' ),
167175 field .get ('is_required' ))
168176 for field in
169177 [{'value' : self .get_field_value (debug_field_list , field .get ('name' ), field .get ('is_required' )),
170178 ** field } for field in
171179 input_field_list ]}
180+ # 合并初始化参数
181+ params = init_params | params
172182 return function_executor .exec_code (code , params )
173183
174184 @staticmethod
@@ -224,7 +234,7 @@ def edit(self, instance, with_valid=True):
224234 if with_valid :
225235 self .is_valid (raise_exception = True )
226236 EditFunctionLib (data = instance ).is_valid (raise_exception = True )
227- edit_field_list = ['name' , 'desc' , 'code' , 'input_field_list' , 'permission_type' , 'is_active' ]
237+ edit_field_list = ['name' , 'desc' , 'code' , 'input_field_list' , 'init_field_list' , ' permission_type' , 'is_active' ]
228238 edit_dict = {field : instance .get (field ) for field in edit_field_list if (
229239 field in instance and instance .get (field ) is not None )}
230240 QuerySet (FunctionLib ).filter (id = self .data .get ('id' )).update (** edit_dict )
@@ -277,4 +287,23 @@ def import_(self, with_valid=True):
277287 permission_type = 'PRIVATE' ,
278288 is_active = function_lib .get ('is_active' ))
279289 function_lib_model .save ()
280- return True
290+ return True
291+
292+ class IconOperate (serializers .Serializer ):
293+ id = serializers .UUIDField (required = True , error_messages = ErrMessage .uuid (_ ("function ID" )))
294+ user_id = serializers .UUIDField (required = True , error_messages = ErrMessage .uuid (_ ("User ID" )))
295+ image = UploadedImageField (required = True , error_messages = ErrMessage .image (_ ("picture" )))
296+
297+ def edit (self , with_valid = True ):
298+ if with_valid :
299+ self .is_valid (raise_exception = True )
300+ functionLib = QuerySet (FunctionLib ).filter (id = self .data .get ('id' )).first ()
301+ if functionLib is None :
302+ raise AppApiException (500 , _ ('Function does not exist' ))
303+ image_id = uuid .uuid1 ()
304+ image = Image (id = image_id , image = self .data .get ('image' ).read (), image_name = self .data .get ('image' ).name )
305+ image .save ()
306+ functionLib .icon = f'/api/image/{ image_id } '
307+ functionLib .save ()
308+
309+ return functionLib .icon
0 commit comments