Merge remote-tracking branch 'origin/v3' into v3

# Conflicts:
#	apps/assets/api/platform.py
pull/8873/head
ibuler 2022-08-31 11:55:30 +08:00
commit 2ede152663
5 changed files with 28 additions and 41 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

@ -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