From c775f2a57f22113e7f61543fce307227b196dfcb Mon Sep 17 00:00:00 2001 From: CaptainB Date: Wed, 4 Jun 2025 18:48:20 +0800 Subject: [PATCH] feat: add edit icon functionality for tools and shared tools --- apps/tools/serializers/tool.py | 38 ++++++++++++++++++++++++++++++++++ apps/tools/urls.py | 1 + apps/tools/views/tool.py | 13 ++++++++++++ 3 files changed, 52 insertions(+) diff --git a/apps/tools/serializers/tool.py b/apps/tools/serializers/tool.py index 5c69975ae..5f09b0cce 100644 --- a/apps/tools/serializers/tool.py +++ b/apps/tools/serializers/tool.py @@ -17,9 +17,11 @@ from rest_framework import serializers, status from common.db.search import page_search, native_page_search from common.exception.app_exception import AppApiException +from common.field.common import UploadedImageField from common.result import result from common.utils.common import get_file_content from common.utils.tool_code import ToolExecutor +from knowledge.models import File, FileSourceType from maxkb.const import CONFIG, PROJECT_DIR from tools.models import Tool, ToolScope, ToolFolder from tools.serializers.tool_folder import ToolFolderFlatSerializer @@ -364,6 +366,42 @@ class ToolSerializer(serializers.Serializer): tool_model.save() return True + class IconOperate(serializers.Serializer): + id = serializers.UUIDField(required=True, label=_("function ID")) + workspace_id = serializers.CharField(required=True, label=_("workspace id")) + user_id = serializers.UUIDField(required=True, label=_("User ID")) + image = UploadedImageField(required=True, label=_("picture")) + + def edit(self, with_valid=True): + if with_valid: + self.is_valid(raise_exception=True) + tool = QuerySet(Tool).filter(id=self.data.get('id')).first() + if tool is None: + raise AppApiException(500, _('Function does not exist')) + # 删除旧的图片 + if tool.icon != '/ui/favicon.ico': + QuerySet(File).filter(id=tool.icon.split('/')[-1]).delete() + if self.data.get('image') is None: + tool.icon = '/ui/favicon.ico' + else: + meta = { + 'debug': False + } + file_id = uuid.uuid7() + file = File( + id=file_id, + file_name=self.data.get('image').name, + source_type=FileSourceType.TOOL, + source_id=tool.id, + meta=meta + ) + file.save(self.data.get('image').read()) + + tool.icon = f'/api/file/{file_id}' + tool.save() + + return tool.icon + class ToolTreeSerializer(serializers.Serializer): workspace_id = serializers.CharField(required=True, label=_('workspace id')) diff --git a/apps/tools/urls.py b/apps/tools/urls.py index cbc69a116..51e1718cc 100644 --- a/apps/tools/urls.py +++ b/apps/tools/urls.py @@ -9,6 +9,7 @@ urlpatterns = [ path('workspace//tool/pylint', views.ToolView.Pylint.as_view()), path('workspace//tool/', views.ToolView.Operate.as_view()), path('workspace//tool//debug', views.ToolView.Debug.as_view()), + path('workspace//tool//edit_icon', views.ToolView.Debug.as_view()), path('workspace//tool//export', views.ToolView.Export.as_view()), path('workspace//tool//', views.ToolView.Page.as_view()), ] diff --git a/apps/tools/views/tool.py b/apps/tools/views/tool.py index 9d324deac..9fe3abb8a 100644 --- a/apps/tools/views/tool.py +++ b/apps/tools/views/tool.py @@ -193,3 +193,16 @@ class ToolView(APIView): return result.success(ToolSerializer.Pylint( data={'workspace_id': workspace_id} ).run(request.data)) + + class EditIcon(APIView): + authentication_classes = [TokenAuth] + parser_classes = [MultiPartParser] + + @has_permissions(PermissionConstants.TOOL_EDIT.get_workspace_permission()) + def put(self, request: Request, id: str, workspace_id: str): + return result.success(ToolSerializer.IconOperate(data={ + 'id': id, + 'workspace_id': workspace_id, + 'user_id': request.user.id, + 'image': request.FILES.get('file') + }).edit(request.data))