From a96bda8ca94c5566d3866a3df62a43fdacf1486d Mon Sep 17 00:00:00 2001
From: ibuler <ibuler@qq.com>
Date: Fri, 25 May 2018 17:26:57 +0800
Subject: [PATCH] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9=E6=A0=91=E5=BD=A2?=
 =?UTF-8?q?=E7=BB=93=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 apps/assets/models/node.py  | 41 ++++++++++++++++++++++++-------------
 apps/jumpserver/settings.py |  6 +++++-
 2 files changed, 32 insertions(+), 15 deletions(-)

diff --git a/apps/assets/models/node.py b/apps/assets/models/node.py
index fed8980e..b63daf51 100644
--- a/apps/assets/models/node.py
+++ b/apps/assets/models/node.py
@@ -65,15 +65,25 @@ class Node(models.Model):
             key__regex=r'^{}:[0-9]+$'.format(self.key)
         )
 
+    def get_children_with_self(self):
+        return self.__class__.objects.filter(
+            key__regex=r'^{0}$|^{0}:[0-9]+$'.format(self.key)
+        )
+
     def get_all_children(self):
         return self.__class__.objects.filter(
             key__startswith='{}:'.format(self.key)
         )
 
+    def get_all_children_with_self(self):
+        return self.__class__.objects.filter(
+            key__regex=r'^{0}$|^{0}:'.format(self.key)
+        )
+
     def get_family(self):
-        children = list(self.get_all_children())
-        children.append(self)
-        return children
+        ancestor = self.ancestor
+        children = self.get_all_children()
+        return [*tuple(ancestor), self, *tuple(children)]
 
     def get_assets(self):
         from .asset import Asset
@@ -88,7 +98,7 @@ class Node(models.Model):
         if self.is_root():
             assets = Asset.objects.all()
         else:
-            nodes = self.get_family()
+            nodes = self.get_all_children_with_self()
             assets = Asset.objects.filter(nodes__in=nodes).distinct()
         return assets
 
@@ -108,18 +118,15 @@ class Node(models.Model):
 
     @property
     def parent(self):
-        if self.key == "0":
-            return self.__class__.root()
-        elif not self.key.startswith("0"):
+        if self.key == "0" or not self.key.startswith("0"):
             return self.__class__.root()
 
         parent_key = ":".join(self.key.split(":")[:-1])
         try:
             parent = self.__class__.objects.get(key=parent_key)
+            return parent
         except Node.DoesNotExist:
             return self.__class__.root()
-        else:
-            return parent
 
     @parent.setter
     def parent(self, parent):
@@ -127,14 +134,20 @@ class Node(models.Model):
 
     @property
     def ancestor(self):
-        if self.parent == self.__class__.root():
+        _key = self.key.split(':')
+        ancestor_keys = []
+
+        if self.is_root():
             return [self.__class__.root()]
-        else:
-            return [self.parent, *tuple(self.parent.ancestor)]
+
+        for i in range(len(_key)-1):
+            _key.pop()
+            ancestor_keys.append(':'.join(_key))
+        return self.__class__.objects.filter(key__in=ancestor_keys)
 
     @property
-    def ancestor_with_node(self):
-        ancestor = self.ancestor
+    def ancestor_with_self(self):
+        ancestor = list(self.ancestor)
         ancestor.insert(0, self)
         return ancestor
 
diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py
index af72292f..b81188b9 100644
--- a/apps/jumpserver/settings.py
+++ b/apps/jumpserver/settings.py
@@ -229,7 +229,11 @@ LOGGING = {
         'django_auth_ldap': {
             'handlers': ['console', 'ansible_logs'],
             'level': "INFO",
-        }
+        },
+        # 'django.db': {
+        #     'handlers': ['console', 'file'],
+        #     'level': 'DEBUG'
+        # }
     }
 }
 
-- 
2.18.0