feat: add edit icon functionality for tools and shared tools
This commit is contained in:
parent
578fb34361
commit
c775f2a57f
@ -17,9 +17,11 @@ from rest_framework import serializers, status
|
|||||||
|
|
||||||
from common.db.search import page_search, native_page_search
|
from common.db.search import page_search, native_page_search
|
||||||
from common.exception.app_exception import AppApiException
|
from common.exception.app_exception import AppApiException
|
||||||
|
from common.field.common import UploadedImageField
|
||||||
from common.result import result
|
from common.result import result
|
||||||
from common.utils.common import get_file_content
|
from common.utils.common import get_file_content
|
||||||
from common.utils.tool_code import ToolExecutor
|
from common.utils.tool_code import ToolExecutor
|
||||||
|
from knowledge.models import File, FileSourceType
|
||||||
from maxkb.const import CONFIG, PROJECT_DIR
|
from maxkb.const import CONFIG, PROJECT_DIR
|
||||||
from tools.models import Tool, ToolScope, ToolFolder
|
from tools.models import Tool, ToolScope, ToolFolder
|
||||||
from tools.serializers.tool_folder import ToolFolderFlatSerializer
|
from tools.serializers.tool_folder import ToolFolderFlatSerializer
|
||||||
@ -364,6 +366,42 @@ class ToolSerializer(serializers.Serializer):
|
|||||||
tool_model.save()
|
tool_model.save()
|
||||||
return True
|
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):
|
class ToolTreeSerializer(serializers.Serializer):
|
||||||
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
|
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
|
||||||
|
|||||||
@ -9,6 +9,7 @@ urlpatterns = [
|
|||||||
path('workspace/<str:workspace_id>/tool/pylint', views.ToolView.Pylint.as_view()),
|
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>', 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>/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/<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()),
|
path('workspace/<str:workspace_id>/tool/<int:current_page>/<int:page_size>', views.ToolView.Page.as_view()),
|
||||||
]
|
]
|
||||||
|
|||||||
@ -193,3 +193,16 @@ class ToolView(APIView):
|
|||||||
return result.success(ToolSerializer.Pylint(
|
return result.success(ToolSerializer.Pylint(
|
||||||
data={'workspace_id': workspace_id}
|
data={'workspace_id': workspace_id}
|
||||||
).run(request.data))
|
).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))
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user