账号过滤

pull/8873/head
feng626 2022-08-31 11:42:20 +08:00
parent d5c13df6be
commit 60eb385c1e
6 changed files with 29 additions and 42 deletions

View File

@ -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 django_filters import rest_framework as filters
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.response import Response from rest_framework.response import Response
@ -7,52 +5,40 @@ from rest_framework.generics import CreateAPIView
from orgs.mixins.api import OrgBulkModelViewSet from orgs.mixins.api import OrgBulkModelViewSet
from rbac.permissions import RBACPermission 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.mixins import RecordViewLogMixin
from common.permissions import UserConfirmation from common.permissions import UserConfirmation
from authentication.const import ConfirmType from authentication.const import ConfirmType
from ..tasks.account_connectivity import test_accounts_connectivity_manual from ..tasks.account_connectivity import test_accounts_connectivity_manual
from ..models import Node, Account from ..models import Account, Node
from .. import serializers from .. import serializers
__all__ = ['AccountFilterSet', 'AccountViewSet', 'AccountSecretsViewSet', 'AccountTaskCreateAPI'] __all__ = ['AccountFilterSet', 'AccountViewSet', 'AccountSecretsViewSet', 'AccountTaskCreateAPI']
class AccountFilterSet(BaseFilterSet): class AccountFilterSet(BaseFilterSet):
username = filters.CharFilter(method='do_nothing')
ip = filters.CharFilter(field_name='ip', lookup_expr='exact') ip = filters.CharFilter(field_name='ip', lookup_expr='exact')
hostname = filters.CharFilter(field_name='name', 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 filter_nodes(self, queryset, name, value):
def qs(self): nodes = Node.objects.filter(id__in=value)
qs = super().qs if not nodes:
qs = self.filter_username(qs) return queryset
qs = self.filter_node(qs)
qs = qs.distinct()
return qs
def filter_username(self, qs): node_qs = Node.objects.none()
username = self.get_query_param('username') for node in nodes:
if not username: node_qs |= node.get_all_children(with_self=True)
return qs node_ids = list(node_qs.values_list('id', flat=True))
qs = qs.filter(Q(username=username) | Q(systemuser__username=username)).distinct() queryset = queryset.filter(asset__nodes__in=node_ids)
return qs return queryset
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
class Meta: class Meta:
model = Account model = Account
fields = [ fields = [
'asset', 'id', 'asset', 'id'
] ]

View File

@ -1,5 +1,3 @@
<<<<<<< HEAD
=======
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
from rest_framework.viewsets import ModelViewSet 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_id = self.kwargs.get('perm_user_group_id')
user_group = get_object_or_404(UserGroup, pk=user_group_id) user_group = get_object_or_404(UserGroup, pk=user_group_id)
return user_group return user_group
>>>>>>> origin

View File

@ -5,7 +5,7 @@ from common.drf.api import JMSModelViewSet
from common.drf.serializers import GroupedChoiceSerailizer from common.drf.serializers import GroupedChoiceSerailizer
from assets.models import Platform from assets.models import Platform
from assets.serializers import PlatformSerializer from assets.serializers import PlatformSerializer
from assets.const import AllTypes, Category from assets.const import AllTypes
from assets.resources.platform import get_platform_methods from assets.resources.platform import get_platform_methods

View File

@ -85,7 +85,7 @@ class DatetimeRangeFilter(filters.BaseFilterBackend):
lookup = "__gte" lookup = "__gte"
else: else:
lookup = "__lte" lookup = "__lte"
kwargs[attr+lookup] = value kwargs[attr + lookup] = value
except ValidationError as e: except ValidationError as e:
print(e) print(e)
continue continue
@ -171,4 +171,13 @@ def current_user_filter(user_field='user'):
class CurrentUserFilter(filters.BaseFilterBackend): class CurrentUserFilter(filters.BaseFilterBackend):
def filter_queryset(self, request, queryset, view): def filter_queryset(self, request, queryset, view):
return queryset.filter(**{user_field: request.user}) return queryset.filter(**{user_field: request.user})
return CurrentUserFilter return CurrentUserFilter
class UUIDInFilter(drf_filters.BaseInFilter, drf_filters.UUIDFilter):
pass
class NumberInFilter(drf_filters.BaseInFilter, drf_filters.NumberFilter):
pass

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:261eee68117787809a9bc6b2034846ee7b222677224f97055f7d7398d427b1d7 oid sha256:d7d4ace7d7ec976b0321bde41789f994f02e3ab6f034828cbfb7e675a313611f
size 255 size 131531

View File

@ -1,6 +1,2 @@
from django_filters.rest_framework import filters
class UUIDInFilter(filters.BaseInFilter, filters.UUIDFilter):
pass