From d52ed2ffb982d2ca65b529420ea161d8282c29d9 Mon Sep 17 00:00:00 2001 From: xinwen Date: Tue, 29 Sep 2020 15:35:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(xpack):=20GatheredUser=20=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E8=B5=84=E4=BA=A7=E6=A0=91=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/api/mixin.py | 18 +++---------- apps/assets/filters.py | 56 +++++++++++++++------------------------- apps/assets/utils.py | 24 ++++++++++++++++- 3 files changed, 47 insertions(+), 51 deletions(-) diff --git a/apps/assets/api/mixin.py b/apps/assets/api/mixin.py index 01dd42805..89555324b 100644 --- a/apps/assets/api/mixin.py +++ b/apps/assets/api/mixin.py @@ -3,6 +3,7 @@ from typing import List from assets.models import Node, Asset from assets.pagination import AssetLimitOffsetPagination from common.utils import lazyproperty, dict_get_any, is_uuid, get_object_or_none +from assets.utils import get_node, is_query_node_all_assets class SerializeToTreeNodeMixin: @@ -80,21 +81,8 @@ class FilterAssetByNodeMixin: @lazyproperty def is_query_node_all_assets(self): - request = self.request - query_all_arg = request.query_params.get('all') - show_current_asset_arg = request.query_params.get('show_current_asset') - if show_current_asset_arg is not None: - return show_current_asset_arg != '1' - return query_all_arg != '0' + return is_query_node_all_assets(self.request) @lazyproperty def node(self): - node_id = dict_get_any(self.request.query_params, ['node', 'node_id']) - if not node_id: - return None - - if is_uuid(node_id): - node = get_object_or_none(Node, id=node_id) - else: - node = get_object_or_none(Node, key=node_id) - return node + return get_node(self.request) diff --git a/apps/assets/filters.py b/apps/assets/filters.py index feed9f9dc..b807396e0 100644 --- a/apps/assets/filters.py +++ b/apps/assets/filters.py @@ -5,9 +5,8 @@ from rest_framework.compat import coreapi, coreschema from rest_framework import filters from django.db.models import Q -from common.utils import dict_get_any, is_uuid, get_object_or_none from .models import Label -from assets.models import Node +from assets.utils import is_query_node_all_assets, get_node class AssetByNodeFilterBackend(filters.BaseFilterBackend): @@ -22,43 +21,25 @@ class AssetByNodeFilterBackend(filters.BaseFilterBackend): for field in self.fields ] - @staticmethod - def is_query_all(request): - query_all_arg = request.query_params.get('all') - show_current_asset_arg = request.query_params.get('show_current_asset') + def filter_node_related_all(self, queryset, node): + return queryset.filter( + Q(nodes__key__istartswith=f'{node.key}:') | + Q(nodes__key=node.key) + ).distinct() - query_all = query_all_arg == '1' - if show_current_asset_arg is not None: - query_all = show_current_asset_arg != '1' - return query_all - - @staticmethod - def get_query_node(request): - node_id = dict_get_any(request.query_params, ['node', 'node_id']) - if not node_id: - return None, False - - if is_uuid(node_id): - node = get_object_or_none(Node, id=node_id) - else: - node = get_object_or_none(Node, key=node_id) - return node, True + def filter_node_related_direct(self, queryset, node): + return queryset.filter(nodes__key=node.key).distinct() def filter_queryset(self, request, queryset, view): - node, has_query_arg = self.get_query_node(request) - if not has_query_arg: - return queryset - + node = get_node(request) if node is None: return queryset - query_all = self.is_query_all(request) + + query_all = is_query_node_all_assets(request) if query_all: - return queryset.filter( - Q(nodes__key__istartswith=f'{node.key}:') | - Q(nodes__key=node.key) - ).distinct() + return self.filter_node_related_all(queryset, node) else: - return queryset.filter(nodes__key=node.key).distinct() + return self.filter_node_related_direct(queryset, node) class FilterAssetByNodeFilterBackend(filters.BaseFilterBackend): @@ -139,9 +120,14 @@ class LabelFilterBackend(filters.BaseFilterBackend): class AssetRelatedByNodeFilterBackend(AssetByNodeFilterBackend): - @staticmethod - def perform_query(pattern, queryset): - return queryset.filter(asset__nodes__key__regex=pattern).distinct() + def filter_node_related_all(self, queryset, node): + return queryset.filter( + Q(asset__nodes__key__istartswith=f'{node.key}:') | + Q(asset__nodes__key=node.key) + ).distinct() + + def filter_node_related_direct(self, queryset, node): + return queryset.filter(asset__nodes__key=node.key).distinct() class IpInFilterBackend(filters.BaseFilterBackend): diff --git a/apps/assets/utils.py b/apps/assets/utils.py index c67cc8528..98b283630 100644 --- a/apps/assets/utils.py +++ b/apps/assets/utils.py @@ -2,7 +2,8 @@ # from django.db.models import Q -from common.utils import get_logger +from common.utils import get_logger, dict_get_any, is_uuid, get_object_or_none +from common.http import is_true from .models import Asset, Node @@ -28,3 +29,24 @@ def is_asset_exists_in_node(asset_pk, node_key): ).filter( Q(nodes__key__istartswith=f'{node_key}:') | Q(nodes__key=node_key) ).exists() + + +def is_query_node_all_assets(request): + request = request + query_all_arg = request.query_params.get('all') + show_current_asset_arg = request.query_params.get('show_current_asset') + if show_current_asset_arg is not None: + return not is_true(show_current_asset_arg) + return is_true(query_all_arg) + + +def get_node(request): + node_id = dict_get_any(request.query_params, ['node', 'node_id']) + if not node_id: + return None + + if is_uuid(node_id): + node = get_object_or_none(Node, id=node_id) + else: + node = get_object_or_none(Node, key=node_id) + return node