feat: add edit icon functionality for tools and shared tools

This commit is contained in:
CaptainB 2025-06-04 18:48:20 +08:00
parent 578fb34361
commit c775f2a57f
3 changed files with 52 additions and 0 deletions

View File

@ -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'))

View File

@ -9,6 +9,7 @@ urlpatterns = [
path('workspace/<str:workspace_id>/tool/pylint', views.ToolView.Pylint.as_view()),
path('workspace/<str:workspace_id>/tool/<str:tool_id>', views.ToolView.Operate.as_view()),
path('workspace/<str:workspace_id>/tool/<str:tool_id>/debug', views.ToolView.Debug.as_view()),
path('workspace/<str:workspace_id>/tool/<str:tool_id>/edit_icon', views.ToolView.Debug.as_view()),
path('workspace/<str:workspace_id>/tool/<str:tool_id>/export', views.ToolView.Export.as_view()),
path('workspace/<str:workspace_id>/tool/<int:current_page>/<int:page_size>', views.ToolView.Page.as_view()),
]

View File

@ -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))