feat: add app asset suggestion

pull/6735/head
feng626 2021-08-27 16:38:23 +08:00
parent 44044a7d99
commit e8e211f47c
6 changed files with 37 additions and 18 deletions

View File

@ -6,11 +6,10 @@ from rest_framework.decorators import action
from rest_framework.response import Response from rest_framework.response import Response
from common.tree import TreeNodeSerializer from common.tree import TreeNodeSerializer
from ..hands import IsOrgAdminOrAppUser from ..hands import IsOrgAdminOrAppUser, IsValidUser
from .. import serializers from .. import serializers
from ..models import Application from ..models import Application
__all__ = ['ApplicationViewSet'] __all__ = ['ApplicationViewSet']
@ -25,7 +24,8 @@ class ApplicationViewSet(OrgBulkModelViewSet):
permission_classes = (IsOrgAdminOrAppUser,) permission_classes = (IsOrgAdminOrAppUser,)
serializer_classes = { serializer_classes = {
'default': serializers.ApplicationSerializer, 'default': serializers.ApplicationSerializer,
'get_tree': TreeNodeSerializer 'get_tree': TreeNodeSerializer,
'suggestion': serializers.MiniApplicationSerializer
} }
@action(methods=['GET'], detail=False, url_path='tree') @action(methods=['GET'], detail=False, url_path='tree')
@ -35,3 +35,9 @@ class ApplicationViewSet(OrgBulkModelViewSet):
tree_nodes = Application.create_tree_nodes(queryset, show_count=show_count) tree_nodes = Application.create_tree_nodes(queryset, show_count=show_count)
serializer = self.get_serializer(tree_nodes, many=True) serializer = self.get_serializer(tree_nodes, many=True)
return Response(serializer.data) return Response(serializer.data)
@action(methods=['get'], detail=False, permission_classes=(IsValidUser,))
def suggestion(self, request):
queryset = self.filter_queryset(self.get_queryset())[:3]
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)

View File

@ -12,7 +12,7 @@ from .. import models
from .. import const from .. import const
__all__ = [ __all__ = [
'ApplicationSerializer', 'ApplicationSerializerMixin', 'ApplicationSerializer', 'ApplicationSerializerMixin', 'MiniApplicationSerializer',
'ApplicationAccountSerializer', 'ApplicationAccountSecretSerializer' 'ApplicationAccountSerializer', 'ApplicationAccountSecretSerializer'
] ]
@ -108,3 +108,9 @@ class ApplicationAccountSerializer(serializers.Serializer):
class ApplicationAccountSecretSerializer(ApplicationAccountSerializer): class ApplicationAccountSecretSerializer(ApplicationAccountSerializer):
password = serializers.CharField(write_only=False, label=_("Password")) password = serializers.CharField(write_only=False, label=_("Password"))
class MiniApplicationSerializer(serializers.ModelSerializer):
class Meta:
model = models.Application
fields = ApplicationSerializer.Meta.fields_mini

View File

@ -1,15 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
from assets.api import FilterAssetByNodeMixin from assets.api import FilterAssetByNodeMixin
from rest_framework.decorators import action
from rest_framework.viewsets import ModelViewSet from rest_framework.viewsets import ModelViewSet
from rest_framework.generics import RetrieveAPIView from rest_framework.generics import RetrieveAPIView
from rest_framework.response import Response
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from common.utils import get_logger, get_object_or_none from common.utils import get_logger, get_object_or_none
from common.permissions import IsOrgAdmin, IsOrgAdminOrAppUser, IsSuperUser from common.permissions import IsOrgAdmin, IsOrgAdminOrAppUser, IsSuperUser, IsValidUser
from orgs.mixins.api import OrgBulkModelViewSet from orgs.mixins.api import OrgBulkModelViewSet
from orgs.mixins import generics from orgs.mixins import generics
from ..models import Asset, Node, Platform, SystemUser from ..models import Asset, Node, Platform
from .. import serializers from .. import serializers
from ..tasks import ( from ..tasks import (
update_assets_hardware_info_manual, test_assets_connectivity_manual, update_assets_hardware_info_manual, test_assets_connectivity_manual,
@ -17,7 +19,6 @@ from ..tasks import (
) )
from ..filters import FilterAssetByNodeFilterBackend, LabelFilterBackend, IpInFilterBackend from ..filters import FilterAssetByNodeFilterBackend, LabelFilterBackend, IpInFilterBackend
logger = get_logger(__file__) logger = get_logger(__file__)
__all__ = [ __all__ = [
'AssetViewSet', 'AssetPlatformRetrieveApi', 'AssetViewSet', 'AssetPlatformRetrieveApi',
@ -43,6 +44,7 @@ class AssetViewSet(FilterAssetByNodeMixin, OrgBulkModelViewSet):
ordering_fields = ("hostname", "ip", "port", "cpu_cores") ordering_fields = ("hostname", "ip", "port", "cpu_cores")
serializer_classes = { serializer_classes = {
'default': serializers.AssetSerializer, 'default': serializers.AssetSerializer,
'suggestion': serializers.MiniAssetSerializer
} }
permission_classes = (IsOrgAdminOrAppUser,) permission_classes = (IsOrgAdminOrAppUser,)
extra_filter_backends = [FilterAssetByNodeFilterBackend, LabelFilterBackend, IpInFilterBackend] extra_filter_backends = [FilterAssetByNodeFilterBackend, LabelFilterBackend, IpInFilterBackend]
@ -62,6 +64,12 @@ class AssetViewSet(FilterAssetByNodeMixin, OrgBulkModelViewSet):
assets = serializer.save() assets = serializer.save()
self.set_assets_node(assets) self.set_assets_node(assets)
@action(methods=['get'], detail=False, permission_classes=(IsValidUser,))
def suggestion(self, request):
queryset = self.filter_queryset(self.get_queryset())[:3]
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
class AssetPlatformRetrieveApi(RetrieveAPIView): class AssetPlatformRetrieveApi(RetrieveAPIView):
queryset = Platform.objects.all() queryset = Platform.objects.all()

View File

@ -8,7 +8,7 @@ from orgs.mixins.serializers import BulkOrgResourceModelSerializer
from ..models import Asset, Node, Platform, SystemUser from ..models import Asset, Node, Platform, SystemUser
__all__ = [ __all__ = [
'AssetSerializer', 'AssetSimpleSerializer', 'AssetSerializer', 'AssetSimpleSerializer', 'MiniAssetSerializer',
'ProtocolsField', 'PlatformSerializer', 'ProtocolsField', 'PlatformSerializer',
'AssetTaskSerializer', 'AssetsTaskSerializer', 'ProtocolsField' 'AssetTaskSerializer', 'AssetsTaskSerializer', 'ProtocolsField'
] ]
@ -69,6 +69,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
""" """
资产的数据结构 资产的数据结构
""" """
class Meta: class Meta:
model = Asset model = Asset
fields_mini = ['id', 'hostname', 'ip', 'platform', 'protocols'] fields_mini = ['id', 'hostname', 'ip', 'platform', 'protocols']
@ -157,6 +158,12 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
return instance return instance
class MiniAssetSerializer(serializers.ModelSerializer):
class Meta:
model = Asset
fields = AssetSerializer.Meta.fields_mini
class PlatformSerializer(serializers.ModelSerializer): class PlatformSerializer(serializers.ModelSerializer):
meta = serializers.DictField(required=False, allow_null=True, label=_('Meta')) meta = serializers.DictField(required=False, allow_null=True, label=_('Meta'))
@ -177,7 +184,6 @@ class PlatformSerializer(serializers.ModelSerializer):
class AssetSimpleSerializer(serializers.ModelSerializer): class AssetSimpleSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Asset model = Asset
fields = ['id', 'hostname', 'ip', 'port', 'connectivity', 'date_verified'] fields = ['id', 'hostname', 'ip', 'port', 'connectivity', 'date_verified']

View File

@ -130,14 +130,7 @@ class UserViewSet(CommonApiMixin, UserQuerysetMixin, BulkModelViewSet):
@action(methods=['get'], detail=False, permission_classes=(IsOrgAdmin,)) @action(methods=['get'], detail=False, permission_classes=(IsOrgAdmin,))
def suggestion(self, request): def suggestion(self, request):
queryset = User.objects.exclude(role=User.ROLE.APP) queryset = User.objects.exclude(role=User.ROLE.APP)
queryset = self.filter_queryset(queryset) queryset = self.filter_queryset(queryset)[:3]
queryset = queryset[:3]
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True) serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data) return Response(serializer.data)

View File

@ -181,7 +181,7 @@ class UserRetrieveSerializer(UserSerializer):
class MiniUserSerializer(serializers.ModelSerializer): class MiniUserSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = User model = User
fields = ['id', 'name', 'username'] fields = UserSerializer.Meta.fields_mini
class InviteSerializer(serializers.Serializer): class InviteSerializer(serializers.Serializer):