From 1018deda96a7923bc73ad1450d4908b91953196d Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 1 Mar 2018 12:40:41 +0800 Subject: [PATCH] =?UTF-8?q?[Update]=20=E6=94=AF=E6=8C=81=E6=8B=96=E6=8B=BD?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/api/node.py | 21 ++++++- apps/assets/models/node.py | 4 ++ apps/assets/serializers/node.py | 6 +- apps/assets/templates/assets/asset_list.html | 57 ++++++++++++++++++- apps/assets/urls/api_urls.py | 1 + .../perms/asset_permission_list.html | 12 +--- apps/users/templates/users/login.html | 2 +- 7 files changed, 87 insertions(+), 16 deletions(-) diff --git a/apps/assets/api/node.py b/apps/assets/api/node.py index 9538a265c..78cd7a27a 100644 --- a/apps/assets/api/node.py +++ b/apps/assets/api/node.py @@ -19,7 +19,7 @@ from rest_framework.response import Response from rest_framework_bulk import BulkModelViewSet from django.utils.translation import ugettext_lazy as _ -from common.utils import get_logger +from common.utils import get_logger, get_object_or_none from ..hands import IsSuperUser from ..models import Node from .. import serializers @@ -29,6 +29,7 @@ logger = get_logger(__file__) __all__ = [ 'NodeViewSet', 'NodeChildrenApi', 'NodeAddAssetsApi', 'NodeRemoveAssetsApi', + 'NodeAddChildrenApi', ] @@ -75,6 +76,24 @@ class NodeChildrenApi(mixins.ListModelMixin, generics.CreateAPIView): return Response(response, status=200) +class NodeAddChildrenApi(generics.UpdateAPIView): + queryset = Node.objects.all() + permission_classes = (IsSuperUser,) + serializer_class = serializers.NodeAddChildrenSerializer + instance = None + + def put(self, request, *args, **kwargs): + instance = self.get_object() + nodes_id = request.data.get("nodes") + children = [get_object_or_none(Node, id=pk) for pk in nodes_id] + for node in children: + if not node: + continue + node.parent = instance + node.save() + return Response("OK") + + class NodeAddAssetsApi(generics.UpdateAPIView): serializer_class = serializers.NodeAssetsSerializer queryset = Node.objects.all() diff --git a/apps/assets/models/node.py b/apps/assets/models/node.py index b4ecc1302..5ce195783 100644 --- a/apps/assets/models/node.py +++ b/apps/assets/models/node.py @@ -94,6 +94,10 @@ class Node(models.Model): else: return parent + @parent.setter + def parent(self, parent): + self.key = parent.get_next_child_key() + @property def ancestor(self): if self.parent == self.__class__.root(): diff --git a/apps/assets/serializers/node.py b/apps/assets/serializers/node.py index 6e69008bb..f6654aef9 100644 --- a/apps/assets/serializers/node.py +++ b/apps/assets/serializers/node.py @@ -65,4 +65,8 @@ class NodeAssetsSerializer(serializers.ModelSerializer): class Meta: model = Node - fields = ['assets'] \ No newline at end of file + fields = ['assets'] + + +class NodeAddChildrenSerializer(serializers.Serializer): + nodes = serializers.ListField() diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html index 62996cc47..4933b26e2 100644 --- a/apps/assets/templates/assets/asset_list.html +++ b/apps/assets/templates/assets/asset_list.html @@ -224,6 +224,7 @@ function editTreeNode() { if (!current_node){ return } + current_node.name = current_node.value; zTree.editName(current_node); } @@ -308,6 +309,44 @@ function selectQueryNode() { } } +function beforeDrag() { + return true +} + +function beforeDrop() { + return true +} + +function onDrag(event, treeId, treeNodes) { +} + +function onDrop(event, treeId, treeNodes, targetNode, moveType) { + console.log("DROP"); + console.log(event); + console.log(treeNodes); + console.log(targetNode); + console.log(moveType); + + var treeNodesNames = []; + var treeNodesIds = []; + $.each(treeNodes, function (index, value) { + treeNodesNames.push(value.value); + treeNodesIds.push(value.id); + }); + + var msg = "你想移动节点: `" + treeNodesNames.join(",") + "` 到 `" + targetNode.value + "` 下吗?"; + var the_url = "{% url 'api-assets:node-add-children' pk=DEFAULT_PK %}".replace("{{ DEFAULT_PK }}", targetNode.id); + var body = {nodes: treeNodesIds}; + if (confirm(msg)){ + APIUpdateAttr({ + url: the_url, + method: "PUT", + body: JSON.stringify(body) + }) + } + +} + function initTree() { var setting = { view: { @@ -319,11 +358,24 @@ function initTree() { enable: true } }, + edit: { + enable: true, + showRemoveBtn: false, + showRenameBtn: false, + drag: { + isCopy: true, + isMove: true + } + }, callback: { onRightClick: OnRightClick, beforeClick: beforeClick, onRename: onRename, - onSelected: onSelected + onSelected: onSelected, + beforeDrag: beforeDrag, + onDrag: onDrag, + beforeDrop: beforeDrop, + onDrop: onDrop } }; @@ -334,7 +386,8 @@ function initTree() { {#if (value["key"] === "0") {#} value["open"] = true; {# }#} - value["name"] = value["value"] + ' (' + value['assets_amount'] + ')' + value["name"] = value["value"] + ' (' + value['assets_amount'] + ')'; + value['value'] = value['value']; }); zNodes = data; $.fn.zTree.init($("#assetTree"), setting, zNodes); diff --git a/apps/assets/urls/api_urls.py b/apps/assets/urls/api_urls.py index 236a1f854..38494539c 100644 --- a/apps/assets/urls/api_urls.py +++ b/apps/assets/urls/api_urls.py @@ -44,6 +44,7 @@ urlpatterns = [ url(r'^v1/system-user/(?P[0-9a-zA-Z\-]{36})/connective/$', api.SystemUserTestConnectiveApi.as_view(), name='system-user-connective'), url(r'^v1/nodes/(?P[0-9a-zA-Z\-]{36})/children/$', api.NodeChildrenApi.as_view(), name='node-children'), + url(r'^v1/nodes/(?P[0-9a-zA-Z\-]{36})/children/add/$', api.NodeAddChildrenApi.as_view(), name='node-add-children'), url(r'^v1/nodes/(?P[0-9a-zA-Z\-]{36})/assets/add/$', api.NodeAddAssetsApi.as_view(), name='node-add-assets'), url(r'^v1/nodes/(?P[0-9a-zA-Z\-]{36})/assets/remove/$', api.NodeRemoveAssetsApi.as_view(), name='node-remove-assets'), ] diff --git a/apps/perms/templates/perms/asset_permission_list.html b/apps/perms/templates/perms/asset_permission_list.html index f87241d54..fa9118dcd 100644 --- a/apps/perms/templates/perms/asset_permission_list.html +++ b/apps/perms/templates/perms/asset_permission_list.html @@ -215,16 +215,6 @@ $(document).ready(function(){ initTable(); initTree(); }) -.on('click', '.btn-create-asset', function () { - var url = "{% url 'assets:asset-create' %}"; - var nodes = zTree.getSelectedNodes(); - var current_node; - if (nodes && nodes.length ===1 ){ - current_node = nodes[0]; - url += "?node=" + current_node.id; - } - window.open(url, '_self'); -}) .on('click', '.btn-del', function () { var $this = $(this); var uid = $this.data('uid'); @@ -241,7 +231,7 @@ $(document).ready(function(){ current_node = nodes[0]; url += "?node_id=" + current_node.id; } - window.open(url); + window.open(url, '_self'); }) diff --git a/apps/users/templates/users/login.html b/apps/users/templates/users/login.html index f8385bae7..1f6498370 100644 --- a/apps/users/templates/users/login.html +++ b/apps/users/templates/users/login.html @@ -30,7 +30,7 @@ 极致的用户使用体验:拥有时尚外观是区别与以往版本和其他软件的铭牌,高雅的气质让你爱不释手;

- 混合云环境下的堡垒机:怎么能容忍传统堡垒机的繁琐步骤,Jumpserver让你极致省力。 + 混合云环境下的堡垒机:怎么能容忍传统堡垒机的繁琐步骤,Jumpserver让你极致省力;

改变世界,从一点点开始。