From 60eb385c1e8796fe51166d72d7c0a919cb54a190 Mon Sep 17 00:00:00 2001 From: feng626 <1304903146@qq.com> Date: Wed, 31 Aug 2022 11:42:20 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/api/accounts.py | 46 ++++++++++------------------ apps/assets/api/asset.py | 4 --- apps/assets/api/platform.py | 2 +- apps/common/drf/filters.py | 11 ++++++- apps/locale/ja/LC_MESSAGES/django.mo | 4 +-- apps/orgs/filters.py | 4 --- 6 files changed, 29 insertions(+), 42 deletions(-) diff --git a/apps/assets/api/accounts.py b/apps/assets/api/accounts.py index 459b1013c..00f569357 100644 --- a/apps/assets/api/accounts.py +++ b/apps/assets/api/accounts.py @@ -1,5 +1,3 @@ -from django.db.models import Q -from django.shortcuts import get_object_or_404 from django_filters import rest_framework as filters from rest_framework.decorators import action from rest_framework.response import Response @@ -7,52 +5,40 @@ from rest_framework.generics import CreateAPIView from orgs.mixins.api import OrgBulkModelViewSet from rbac.permissions import RBACPermission -from common.drf.filters import BaseFilterSet +from common.drf.filters import BaseFilterSet, UUIDInFilter from common.mixins import RecordViewLogMixin from common.permissions import UserConfirmation from authentication.const import ConfirmType from ..tasks.account_connectivity import test_accounts_connectivity_manual -from ..models import Node, Account +from ..models import Account, Node from .. import serializers __all__ = ['AccountFilterSet', 'AccountViewSet', 'AccountSecretsViewSet', 'AccountTaskCreateAPI'] class AccountFilterSet(BaseFilterSet): - username = filters.CharFilter(method='do_nothing') ip = filters.CharFilter(field_name='ip', lookup_expr='exact') hostname = filters.CharFilter(field_name='name', lookup_expr='exact') - node = filters.CharFilter(method='do_nothing') + username = filters.CharFilter(field_name="username", lookup_expr='exact') + assets = UUIDInFilter(field_name='asset_id', lookup_expr='in') + nodes = UUIDInFilter(method='filter_nodes') - @property - def qs(self): - qs = super().qs - qs = self.filter_username(qs) - qs = self.filter_node(qs) - qs = qs.distinct() - return qs + def filter_nodes(self, queryset, name, value): + nodes = Node.objects.filter(id__in=value) + if not nodes: + return queryset - def filter_username(self, qs): - username = self.get_query_param('username') - if not username: - return qs - qs = qs.filter(Q(username=username) | Q(systemuser__username=username)).distinct() - return qs - - def filter_node(self, qs): - node_id = self.get_query_param('node') - if not node_id: - return qs - node = get_object_or_404(Node, pk=node_id) - node_ids = node.get_all_children(with_self=True).values_list('id', flat=True) - node_ids = list(node_ids) - qs = qs.filter(asset__nodes__in=node_ids) - return qs + node_qs = Node.objects.none() + for node in nodes: + node_qs |= node.get_all_children(with_self=True) + node_ids = list(node_qs.values_list('id', flat=True)) + queryset = queryset.filter(asset__nodes__in=node_ids) + return queryset class Meta: model = Account fields = [ - 'asset', 'id', + 'asset', 'id' ] diff --git a/apps/assets/api/asset.py b/apps/assets/api/asset.py index 1e7cbdfe8..881395f5b 100644 --- a/apps/assets/api/asset.py +++ b/apps/assets/api/asset.py @@ -1,5 +1,3 @@ -<<<<<<< HEAD -======= # -*- coding: utf-8 -*- # from rest_framework.viewsets import ModelViewSet @@ -309,5 +307,3 @@ class AssetPermUserGroupPermissionsListApi(BaseAssetPermUserOrUserGroupPermissio user_group_id = self.kwargs.get('perm_user_group_id') user_group = get_object_or_404(UserGroup, pk=user_group_id) return user_group - ->>>>>>> origin diff --git a/apps/assets/api/platform.py b/apps/assets/api/platform.py index ca0e83dcf..e538e12ee 100644 --- a/apps/assets/api/platform.py +++ b/apps/assets/api/platform.py @@ -5,7 +5,7 @@ from common.drf.api import JMSModelViewSet from common.drf.serializers import GroupedChoiceSerailizer from assets.models import Platform from assets.serializers import PlatformSerializer -from assets.const import AllTypes, Category +from assets.const import AllTypes from assets.resources.platform import get_platform_methods diff --git a/apps/common/drf/filters.py b/apps/common/drf/filters.py index 1c89f49ac..80074edf9 100644 --- a/apps/common/drf/filters.py +++ b/apps/common/drf/filters.py @@ -85,7 +85,7 @@ class DatetimeRangeFilter(filters.BaseFilterBackend): lookup = "__gte" else: lookup = "__lte" - kwargs[attr+lookup] = value + kwargs[attr + lookup] = value except ValidationError as e: print(e) continue @@ -171,4 +171,13 @@ def current_user_filter(user_field='user'): class CurrentUserFilter(filters.BaseFilterBackend): def filter_queryset(self, request, queryset, view): return queryset.filter(**{user_field: request.user}) + return CurrentUserFilter + + +class UUIDInFilter(drf_filters.BaseInFilter, drf_filters.UUIDFilter): + pass + + +class NumberInFilter(drf_filters.BaseInFilter, drf_filters.NumberFilter): + pass diff --git a/apps/locale/ja/LC_MESSAGES/django.mo b/apps/locale/ja/LC_MESSAGES/django.mo index 9fc9c6640..4378759fd 100644 --- a/apps/locale/ja/LC_MESSAGES/django.mo +++ b/apps/locale/ja/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:261eee68117787809a9bc6b2034846ee7b222677224f97055f7d7398d427b1d7 -size 255 +oid sha256:d7d4ace7d7ec976b0321bde41789f994f02e3ab6f034828cbfb7e675a313611f +size 131531 diff --git a/apps/orgs/filters.py b/apps/orgs/filters.py index ee68a0ed8..139597f9c 100644 --- a/apps/orgs/filters.py +++ b/apps/orgs/filters.py @@ -1,6 +1,2 @@ -from django_filters.rest_framework import filters -class UUIDInFilter(filters.BaseInFilter, filters.UUIDFilter): - pass -