mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-01 23:47:40 +00:00
Command (#2134)
* [Update] 任务区分org * [Update] 修改翻译 * [Update] 使用id而不是hostname * [Update] 执行命令 * [Update] 修改一些东西 * [Update] 暂存 * [Update] 用户执行命令 * [Update] 添加资产授权模块-tree * [Update] 暂时这样 * [Update] 批量命令执行 * [Update] 修改表结构 * [Update] 更新翻译 * [Update] 删除cloud模块无效中文翻译
This commit is contained in:
95
apps/common/tree.py
Normal file
95
apps/common/tree.py
Normal file
@@ -0,0 +1,95 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
|
||||
from rest_framework import serializers
|
||||
|
||||
|
||||
class TreeNode:
|
||||
id = ""
|
||||
name = ""
|
||||
comment = ""
|
||||
title = ""
|
||||
isParent = False
|
||||
pId = ""
|
||||
open = False
|
||||
iconSkin = ""
|
||||
meta = {}
|
||||
|
||||
_tree = None
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
for k, v in kwargs.items():
|
||||
setattr(self, k, v)
|
||||
|
||||
@classmethod
|
||||
def root(cls):
|
||||
return cls(id="#", name='Root', title='Root', isParent=True, open=True)
|
||||
|
||||
def get_parent(self):
|
||||
return self._tree.get_node(self.pId)
|
||||
|
||||
def get_parents(self):
|
||||
parent = self.get_parent()
|
||||
if parent == self._tree.root:
|
||||
return []
|
||||
parents = [parent]
|
||||
parents.extend(parent.get_parents())
|
||||
return parents
|
||||
|
||||
def add_child(self, child):
|
||||
self._tree.add_node(child, self)
|
||||
|
||||
def __str__(self):
|
||||
return '<{}: {}>'.format(self.id, self.name)
|
||||
|
||||
__repr__ = __str__
|
||||
|
||||
def __gt__(self, other):
|
||||
if self.isParent and not other.isParent:
|
||||
return False
|
||||
return self.id > other.id
|
||||
|
||||
def __eq__(self, other):
|
||||
return self.id == other.id
|
||||
|
||||
def __lt__(self, other):
|
||||
if self.isParent and not other.isParent:
|
||||
return True
|
||||
return self.id < other.id
|
||||
|
||||
|
||||
class Tree:
|
||||
def __init__(self):
|
||||
self.nodes = {}
|
||||
self.root = TreeNode.root()
|
||||
self.root._tree = self
|
||||
|
||||
def add_node(self, node, parent=None):
|
||||
node._tree = self
|
||||
|
||||
if not parent:
|
||||
parent = self.root
|
||||
if parent.id not in self.nodes and parent != self.root:
|
||||
raise ValueError("Parent not in tree")
|
||||
elif node in parent.get_parents():
|
||||
raise ValueError("Parent must not be node parent")
|
||||
node.pId = parent.id
|
||||
parent.isParent = True
|
||||
self.nodes[node.id] = node
|
||||
|
||||
def get_nodes(self):
|
||||
return sorted(self.nodes.values())
|
||||
|
||||
def get_node(self, tid):
|
||||
return self.nodes.get(tid) or TreeNode.root()
|
||||
|
||||
|
||||
class TreeNodeSerializer(serializers.Serializer):
|
||||
id = serializers.CharField(max_length=128)
|
||||
name = serializers.CharField(max_length=128)
|
||||
title = serializers.CharField(max_length=128)
|
||||
pId = serializers.CharField(max_length=128)
|
||||
isParent = serializers.BooleanField(default=False)
|
||||
open = serializers.BooleanField(default=False)
|
||||
iconSkin = serializers.CharField(max_length=128, allow_blank=True)
|
||||
meta = serializers.JSONField()
|
Reference in New Issue
Block a user