mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-23 20:39:26 +00:00
perf: 修改 m2m json field
This commit is contained in:
@@ -6,6 +6,7 @@ import logging
|
||||
from collections import defaultdict
|
||||
|
||||
from django.db import models
|
||||
from django.db.models import Q
|
||||
from django.forms import model_to_dict
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
@@ -116,7 +117,32 @@ class Protocol(models.Model):
|
||||
return self.asset_platform_protocol.get('public', True)
|
||||
|
||||
|
||||
class Asset(NodesRelationMixin, AbsConnectivity, JMSOrgBaseModel):
|
||||
class JSONFilterMixin:
|
||||
@staticmethod
|
||||
def get_json_filter_attr_q(name, value, match):
|
||||
"""
|
||||
:param name: 属性名称
|
||||
:param value: 定义的结果
|
||||
:param match: 匹配方式
|
||||
:return:
|
||||
"""
|
||||
from ..node import Node
|
||||
if not isinstance(value, (list, tuple)):
|
||||
value = [value]
|
||||
if name == 'nodes':
|
||||
nodes = Node.objects.filter(id__in=value)
|
||||
children = Node.get_nodes_all_children(nodes, with_self=True).values_list('id', flat=True)
|
||||
return Q(nodes__in=children)
|
||||
elif name == 'category':
|
||||
return Q(platform__category__in=value)
|
||||
elif name == 'type':
|
||||
return Q(platform__type__in=value)
|
||||
elif name == 'protocols':
|
||||
return Q(protocols__name__in=value)
|
||||
return None
|
||||
|
||||
|
||||
class Asset(NodesRelationMixin, AbsConnectivity, JSONFilterMixin, JMSOrgBaseModel):
|
||||
Category = const.Category
|
||||
Type = const.AllTypes
|
||||
|
||||
|
@@ -63,6 +63,19 @@ class FamilyMixin:
|
||||
pattern += r'|^{0}$'.format(key)
|
||||
return pattern
|
||||
|
||||
@classmethod
|
||||
def get_nodes_children_key_pattern(cls, nodes, with_self=True):
|
||||
keys = [i.key for i in nodes]
|
||||
keys = cls.clean_children_keys(keys)
|
||||
patterns = [cls.get_node_all_children_key_pattern(key) for key in keys]
|
||||
patterns = '|'.join(patterns)
|
||||
return patterns
|
||||
|
||||
@classmethod
|
||||
def get_nodes_all_children(cls, nodes, with_self=True):
|
||||
pattern = cls.get_nodes_children_key_pattern(nodes, with_self=with_self)
|
||||
return Node.objects.filter(key__iregex=pattern)
|
||||
|
||||
@classmethod
|
||||
def get_node_children_key_pattern(cls, key, with_self=True):
|
||||
pattern = r'^{0}:[0-9]+$'.format(key)
|
||||
|
Reference in New Issue
Block a user