mirror of https://github.com/jumpserver/jumpserver
feat: 节点树搜索
parent
28c8ec1fab
commit
cfa5de13ab
|
@ -24,7 +24,7 @@ class SerializeToTreeNodeMixin:
|
||||||
'title': _name(node),
|
'title': _name(node),
|
||||||
'pId': node.parent_key,
|
'pId': node.parent_key,
|
||||||
'isParent': True,
|
'isParent': True,
|
||||||
'open': node.is_org_root(),
|
'open': True,
|
||||||
'meta': {
|
'meta': {
|
||||||
'data': {
|
'data': {
|
||||||
"id": node.id,
|
"id": node.id,
|
||||||
|
|
|
@ -101,6 +101,8 @@ class NodeListAsTreeApi(generics.ListAPIView):
|
||||||
|
|
||||||
class NodeChildrenApi(generics.ListCreateAPIView):
|
class NodeChildrenApi(generics.ListCreateAPIView):
|
||||||
serializer_class = serializers.NodeSerializer
|
serializer_class = serializers.NodeSerializer
|
||||||
|
search_fields = ('value',)
|
||||||
|
|
||||||
instance = None
|
instance = None
|
||||||
is_initial = False
|
is_initial = False
|
||||||
|
|
||||||
|
@ -179,8 +181,15 @@ class NodeChildrenAsTreeApi(SerializeToTreeNodeMixin, NodeChildrenApi):
|
||||||
"""
|
"""
|
||||||
model = Node
|
model = Node
|
||||||
|
|
||||||
|
def filter_queryset(self, queryset):
|
||||||
|
if not self.request.GET.get('search'):
|
||||||
|
return queryset
|
||||||
|
queryset = super().filter_queryset(queryset)
|
||||||
|
queryset = self.model.get_ancestor_queryset(queryset)
|
||||||
|
return queryset
|
||||||
|
|
||||||
def list(self, request, *args, **kwargs):
|
def list(self, request, *args, **kwargs):
|
||||||
nodes = self.get_queryset().order_by('value')
|
nodes = self.filter_queryset(self.get_queryset()).order_by('value')
|
||||||
nodes = self.serialize_nodes(nodes, with_asset_amount=True)
|
nodes = self.serialize_nodes(nodes, with_asset_amount=True)
|
||||||
assets = self.get_assets()
|
assets = self.get_assets()
|
||||||
data = [*nodes, *assets]
|
data = [*nodes, *assets]
|
||||||
|
|
|
@ -25,7 +25,6 @@ from orgs.mixins.models import OrgModelMixin, OrgManager
|
||||||
from orgs.utils import get_current_org, tmp_to_org, tmp_to_root_org
|
from orgs.utils import get_current_org, tmp_to_org, tmp_to_root_org
|
||||||
from orgs.models import Organization
|
from orgs.models import Organization
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['Node', 'FamilyMixin', 'compute_parent_key', 'NodeQuerySet']
|
__all__ = ['Node', 'FamilyMixin', 'compute_parent_key', 'NodeQuerySet']
|
||||||
logger = get_logger(__name__)
|
logger = get_logger(__name__)
|
||||||
|
|
||||||
|
@ -98,6 +97,14 @@ class FamilyMixin:
|
||||||
q |= Q(key=self.key)
|
q |= Q(key=self.key)
|
||||||
return Node.objects.filter(q)
|
return Node.objects.filter(q)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_ancestor_queryset(cls, queryset, with_self=True):
|
||||||
|
parent_keys = set()
|
||||||
|
for i in queryset:
|
||||||
|
parent_keys.update(set(i.get_ancestor_keys(with_self=with_self)))
|
||||||
|
queryset = queryset.model.objects.filter(key__in=list(parent_keys)).distinct()
|
||||||
|
return queryset
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def children(self):
|
def children(self):
|
||||||
return self.get_children(with_self=False)
|
return self.get_children(with_self=False)
|
||||||
|
@ -396,7 +403,7 @@ class NodeAllAssetsMappingMixin:
|
||||||
mapping[ancestor_key].update(asset_ids)
|
mapping[ancestor_key].update(asset_ids)
|
||||||
|
|
||||||
t3 = time.time()
|
t3 = time.time()
|
||||||
logger.info('t1-t2(DB Query): {} s, t3-t2(Generate mapping): {} s'.format(t2-t1, t3-t2))
|
logger.info('t1-t2(DB Query): {} s, t3-t2(Generate mapping): {} s'.format(t2 - t1, t3 - t2))
|
||||||
return mapping
|
return mapping
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue