mirror of https://github.com/jumpserver/jumpserver
				
				
				
			Merge branch 'dev' into perm_tree
						commit
						e7c7c3a7a8
					
				| 
						 | 
				
			
			@ -31,7 +31,7 @@ from .. import serializers
 | 
			
		|||
logger = get_logger(__file__)
 | 
			
		||||
__all__ = [
 | 
			
		||||
    'NodeViewSet', 'NodeChildrenApi',
 | 
			
		||||
    'NodeAssetsApi', 'NodeWithAssetsApi',
 | 
			
		||||
    'NodeAssetsApi',
 | 
			
		||||
    'NodeAddAssetsApi', 'NodeRemoveAssetsApi',
 | 
			
		||||
    'NodeReplaceAssetsApi',
 | 
			
		||||
    'NodeAddChildrenApi', 'RefreshNodeHardwareInfoApi',
 | 
			
		||||
| 
						 | 
				
			
			@ -42,14 +42,7 @@ __all__ = [
 | 
			
		|||
class NodeViewSet(BulkModelViewSet):
 | 
			
		||||
    queryset = Node.objects.all()
 | 
			
		||||
    permission_classes = (IsSuperUser,)
 | 
			
		||||
    # serializer_class = serializers.NodeSerializer
 | 
			
		||||
 | 
			
		||||
    def get_serializer_class(self):
 | 
			
		||||
        show_current_asset = self.request.query_params.get('show_current_asset')
 | 
			
		||||
        if show_current_asset:
 | 
			
		||||
            return serializers.NodeCurrentSerializer
 | 
			
		||||
        else:
 | 
			
		||||
            return serializers.NodeSerializer
 | 
			
		||||
    serializer_class = serializers.NodeSerializer
 | 
			
		||||
 | 
			
		||||
    def perform_create(self, serializer):
 | 
			
		||||
        child_key = Node.root().get_next_child_key()
 | 
			
		||||
| 
						 | 
				
			
			@ -57,32 +50,32 @@ class NodeViewSet(BulkModelViewSet):
 | 
			
		|||
        serializer.save()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class NodeWithAssetsApi(generics.ListAPIView):
 | 
			
		||||
    permission_classes = (IsSuperUser,)
 | 
			
		||||
    serializers = serializers.NodeSerializer
 | 
			
		||||
 | 
			
		||||
    def get_node(self):
 | 
			
		||||
        pk = self.kwargs.get('pk') or self.request.query_params.get('node')
 | 
			
		||||
        if not pk:
 | 
			
		||||
            node = Node.root()
 | 
			
		||||
        else:
 | 
			
		||||
            node = get_object_or_404(Node, pk)
 | 
			
		||||
        return node
 | 
			
		||||
 | 
			
		||||
    def get_queryset(self):
 | 
			
		||||
        queryset = []
 | 
			
		||||
        node = self.get_node()
 | 
			
		||||
        children = node.get_children()
 | 
			
		||||
        assets = node.get_assets()
 | 
			
		||||
        queryset.extend(list(children))
 | 
			
		||||
 | 
			
		||||
        for asset in assets:
 | 
			
		||||
            node = Node()
 | 
			
		||||
            node.id = asset.id
 | 
			
		||||
            node.parent = node.id
 | 
			
		||||
            node.value = asset.hostname
 | 
			
		||||
            queryset.append(node)
 | 
			
		||||
        return queryset
 | 
			
		||||
# class NodeWithAssetsApi(generics.ListAPIView):
 | 
			
		||||
#     permission_classes = (IsSuperUser,)
 | 
			
		||||
#     serializers = serializers.NodeSerializer
 | 
			
		||||
#
 | 
			
		||||
#     def get_node(self):
 | 
			
		||||
#         pk = self.kwargs.get('pk') or self.request.query_params.get('node')
 | 
			
		||||
#         if not pk:
 | 
			
		||||
#             node = Node.root()
 | 
			
		||||
#         else:
 | 
			
		||||
#             node = get_object_or_404(Node, pk)
 | 
			
		||||
#         return node
 | 
			
		||||
#
 | 
			
		||||
#     def get_queryset(self):
 | 
			
		||||
#         queryset = []
 | 
			
		||||
#         node = self.get_node()
 | 
			
		||||
#         children = node.get_children()
 | 
			
		||||
#         assets = node.get_assets()
 | 
			
		||||
#         queryset.extend(list(children))
 | 
			
		||||
#
 | 
			
		||||
#         for asset in assets:
 | 
			
		||||
#             node = Node()
 | 
			
		||||
#             node.id = asset.id
 | 
			
		||||
#             node.parent = node.id
 | 
			
		||||
#             node.value = asset.hostname
 | 
			
		||||
#             queryset.append(node)
 | 
			
		||||
#         return queryset
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class NodeChildrenApi(mixins.ListModelMixin, generics.CreateAPIView):
 | 
			
		||||
| 
						 | 
				
			
			@ -146,9 +139,9 @@ class NodeChildrenApi(mixins.ListModelMixin, generics.CreateAPIView):
 | 
			
		|||
            for asset in assets:
 | 
			
		||||
                node_fake = Node()
 | 
			
		||||
                node_fake.id = asset.id
 | 
			
		||||
                node_fake.is_node = False
 | 
			
		||||
                node_fake.parent = node
 | 
			
		||||
                node_fake.value = asset.hostname
 | 
			
		||||
                node_fake.is_node = False
 | 
			
		||||
                queryset.append(node_fake)
 | 
			
		||||
        queryset = sorted(queryset, key=lambda x: x.is_node, reverse=True)
 | 
			
		||||
        return queryset
 | 
			
		||||
| 
						 | 
				
			
			@ -184,9 +177,7 @@ class NodeAddChildrenApi(generics.UpdateAPIView):
 | 
			
		|||
        for node in children:
 | 
			
		||||
            if not node:
 | 
			
		||||
                continue
 | 
			
		||||
            # node.parent = instance
 | 
			
		||||
            # node.save()
 | 
			
		||||
            node.set_parent(instance)
 | 
			
		||||
            node.parent = instance
 | 
			
		||||
        return Response("OK")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,16 +52,6 @@ class Node(models.Model):
 | 
			
		|||
    def level(self):
 | 
			
		||||
        return len(self.key.split(':'))
 | 
			
		||||
 | 
			
		||||
    def set_parent(self, instance):
 | 
			
		||||
        children = self.get_all_children()
 | 
			
		||||
        old_key = self.key
 | 
			
		||||
        with transaction.atomic():
 | 
			
		||||
            self.parent = instance
 | 
			
		||||
            for child in children:
 | 
			
		||||
                child.key = child.key.replace(old_key, self.key, 1)
 | 
			
		||||
                child.save()
 | 
			
		||||
            self.save()
 | 
			
		||||
 | 
			
		||||
    def get_next_child_key(self):
 | 
			
		||||
        mark = self.child_mark
 | 
			
		||||
        self.child_mark += 1
 | 
			
		||||
| 
						 | 
				
			
			@ -142,7 +132,17 @@ class Node(models.Model):
 | 
			
		|||
 | 
			
		||||
    @parent.setter
 | 
			
		||||
    def parent(self, parent):
 | 
			
		||||
        self.key = parent.get_next_child_key()
 | 
			
		||||
        if self.is_node:
 | 
			
		||||
            children = self.get_all_children()
 | 
			
		||||
            old_key = self.key
 | 
			
		||||
            with transaction.atomic():
 | 
			
		||||
                self.key = parent.get_next_child_key()
 | 
			
		||||
                for child in children:
 | 
			
		||||
                    child.key = child.key.replace(old_key, self.key, 1)
 | 
			
		||||
                    child.save()
 | 
			
		||||
                self.save()
 | 
			
		||||
        else:
 | 
			
		||||
            self.key = parent.key+':fake'
 | 
			
		||||
 | 
			
		||||
    def get_ancestor(self, with_self=False):
 | 
			
		||||
        if self.is_root():
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,7 @@ from .asset import AssetGrantedSerializer
 | 
			
		|||
 | 
			
		||||
__all__ = [
 | 
			
		||||
    'NodeSerializer', "NodeGrantedSerializer", "NodeAddChildrenSerializer",
 | 
			
		||||
    "NodeAssetsSerializer", "NodeCurrentSerializer",
 | 
			
		||||
    "NodeAssetsSerializer",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -80,12 +80,6 @@ class NodeSerializer(serializers.ModelSerializer):
 | 
			
		|||
        return fields
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class NodeCurrentSerializer(NodeSerializer):
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def get_assets_amount(obj):
 | 
			
		||||
        return obj.get_assets().count()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class NodeAssetsSerializer(serializers.ModelSerializer):
 | 
			
		||||
    assets = serializers.PrimaryKeyRelatedField(many=True, queryset=Asset.objects.all())
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -95,7 +95,7 @@ function initTree2() {
 | 
			
		|||
    };
 | 
			
		||||
 | 
			
		||||
    var zNodes = [];
 | 
			
		||||
    $.get("{% url 'api-assets:node-list' %}?show_current_asset=1", function(data, status){
 | 
			
		||||
    $.get("{% url 'api-assets:node-list' %}", function(data, status){
 | 
			
		||||
        $.each(data, function (index, value) {
 | 
			
		||||
            value["pId"] = value["parent"];
 | 
			
		||||
            {#value["open"] = true;#}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -399,8 +399,7 @@ function initTree() {
 | 
			
		|||
    };
 | 
			
		||||
 | 
			
		||||
    var zNodes = [];
 | 
			
		||||
    var query_params = {'show_current_asset': getCookie('show_current_asset')};
 | 
			
		||||
    $.get("{% url 'api-assets:node-list' %}", query_params, function(data, status){
 | 
			
		||||
    $.get("{% url 'api-assets:node-list' %}", function(data, status){
 | 
			
		||||
        $.each(data, function (index, value) {
 | 
			
		||||
            value["pId"] = value["parent"];
 | 
			
		||||
            if (value["key"] === "0") {
 | 
			
		||||
| 
						 | 
				
			
			@ -436,7 +435,7 @@ $(document).ready(function(){
 | 
			
		|||
    initTable();
 | 
			
		||||
    initTree();
 | 
			
		||||
 | 
			
		||||
    if(getCookie('show_current_asset') === 'yes'){
 | 
			
		||||
    if(getCookie('show_current_asset') === '1'){
 | 
			
		||||
        $('#show_all_asset').css('display', 'inline-block');
 | 
			
		||||
    }
 | 
			
		||||
    else{
 | 
			
		||||
| 
						 | 
				
			
			@ -564,7 +563,7 @@ $(document).ready(function(){
 | 
			
		|||
    hideRMenu();
 | 
			
		||||
    $(this).css('display', 'none');
 | 
			
		||||
    $('#show_all_asset').css('display', 'inline-block');
 | 
			
		||||
    setCookie('show_current_asset', 'yes');
 | 
			
		||||
    setCookie('show_current_asset', '1');
 | 
			
		||||
    location.reload();
 | 
			
		||||
})
 | 
			
		||||
.on('click', '.btn-show-all-asset', function(){
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
if grep -q 'source ~/.autoenv/activate.sh' ~/.bashrc; then
 | 
			
		||||
if grep -q 'source /opt/autoenv/activate.sh' ~/.bashrc; then
 | 
			
		||||
    echo -e "\033[31m 正在自动载入 python 环境 \033[0m"
 | 
			
		||||
else
 | 
			
		||||
    echo -e "\033[31m 不支持自动升级,请参考 http://docs.jumpserver.org/zh/docs/upgrade.html 手动升级 \033[0m"
 | 
			
		||||
| 
						 | 
				
			
			@ -40,5 +40,6 @@ git pull && pip install -r requirements/requirements.txt && cd utils && sh make_
 | 
			
		|||
cd .. && ./jms start all -d
 | 
			
		||||
echo -e "\033[31m 请检查jumpserver是否启动成功 \033[0m"
 | 
			
		||||
echo -e "\033[31m 备份文件存放于$jumpserver_backup目录 \033[0m"
 | 
			
		||||
stty erase ^?
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue