feat: add assets amount field to platform page

pull/13829/head
wangruidong 2024-07-24 18:23:12 +08:00 committed by w940853815
parent 88037b2038
commit 2e625f2c33
3 changed files with 23 additions and 7 deletions

View File

@ -1,3 +1,4 @@
from django.db.models import Count
from rest_framework import generics from rest_framework import generics
from rest_framework import serializers from rest_framework import serializers
from rest_framework.decorators import action from rest_framework.decorators import action
@ -5,7 +6,7 @@ from rest_framework.response import Response
from assets.const import AllTypes from assets.const import AllTypes
from assets.models import Platform, Node, Asset, PlatformProtocol from assets.models import Platform, Node, Asset, PlatformProtocol
from assets.serializers import PlatformSerializer, PlatformProtocolSerializer from assets.serializers import PlatformSerializer, PlatformProtocolSerializer, PlatformListSerializer
from common.api import JMSModelViewSet from common.api import JMSModelViewSet
from common.permissions import IsValidUser from common.permissions import IsValidUser
from common.serializers import GroupedChoiceSerializer from common.serializers import GroupedChoiceSerializer
@ -17,6 +18,7 @@ class AssetPlatformViewSet(JMSModelViewSet):
queryset = Platform.objects.all() queryset = Platform.objects.all()
serializer_classes = { serializer_classes = {
'default': PlatformSerializer, 'default': PlatformSerializer,
'list': PlatformListSerializer,
'categories': GroupedChoiceSerializer, 'categories': GroupedChoiceSerializer,
} }
filterset_fields = ['name', 'category', 'type'] filterset_fields = ['name', 'category', 'type']
@ -31,8 +33,8 @@ class AssetPlatformViewSet(JMSModelViewSet):
def get_queryset(self): def get_queryset(self):
# 因为没有走分页逻辑,所以需要这里 prefetch # 因为没有走分页逻辑,所以需要这里 prefetch
queryset = super().get_queryset().prefetch_related( queryset = super().get_queryset().annotate(assets_amount=Count('assets')).prefetch_related(
'protocols', 'automation', 'labels', 'labels__label', 'protocols', 'automation', 'labels', 'labels__label'
) )
queryset = queryset.filter(type__in=AllTypes.get_types_values()) queryset = queryset.filter(type__in=AllTypes.get_types_values())
return queryset return queryset

View File

@ -111,6 +111,10 @@ class Platform(LabeledMixin, JMSBaseModel):
def type_constraints(self): def type_constraints(self):
return AllTypes.get_constraints(self.category, self.type) return AllTypes.get_constraints(self.category, self.type)
@lazyproperty
def assets_amount(self):
return self.assets.count()
@classmethod @classmethod
def default(cls): def default(cls):
linux, created = cls.objects.get_or_create( linux, created = cls.objects.get_or_create(

View File

@ -1,18 +1,19 @@
from django.db.models import QuerySet from django.db.models import QuerySet, Count
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from rest_framework.validators import UniqueValidator from rest_framework.validators import UniqueValidator
from assets.models import Asset
from common.serializers import ( from common.serializers import (
WritableNestedModelSerializer, type_field_map, MethodSerializer, WritableNestedModelSerializer, type_field_map, MethodSerializer,
DictSerializer, create_serializer_class, ResourceLabelsMixin DictSerializer, create_serializer_class, ResourceLabelsMixin
) )
from common.serializers.fields import LabeledChoiceField from common.serializers.fields import LabeledChoiceField, ObjectRelatedField
from common.utils import lazyproperty from common.utils import lazyproperty
from ..const import Category, AllTypes, Protocol from ..const import Category, AllTypes, Protocol
from ..models import Platform, PlatformProtocol, PlatformAutomation from ..models import Platform, PlatformProtocol, PlatformAutomation
__all__ = ["PlatformSerializer", "PlatformOpsMethodSerializer", "PlatformProtocolSerializer"] __all__ = ["PlatformSerializer", "PlatformOpsMethodSerializer", "PlatformProtocolSerializer", "PlatformListSerializer"]
class PlatformAutomationSerializer(serializers.ModelSerializer): class PlatformAutomationSerializer(serializers.ModelSerializer):
@ -179,6 +180,8 @@ class PlatformSerializer(ResourceLabelsMixin, WritableNestedModelSerializer):
required=False, default="sudo", allow_null=True required=False, default="sudo", allow_null=True
) )
custom_fields = PlatformCustomField(label=_("Custom fields"), many=True, required=False) custom_fields = PlatformCustomField(label=_("Custom fields"), many=True, required=False)
assets = ObjectRelatedField(queryset=Asset.objects, many=True, required=False, label=_('Assets'))
assets_amount = serializers.IntegerField(label=_('Assets amount'), read_only=True)
class Meta: class Meta:
model = Platform model = Platform
@ -191,7 +194,8 @@ class PlatformSerializer(ResourceLabelsMixin, WritableNestedModelSerializer):
'internal', 'date_created', 'date_updated', 'internal', 'date_created', 'date_updated',
'created_by', 'updated_by' 'created_by', 'updated_by'
] ]
fields = fields_small + [ fields_m2m = ['assets', 'assets_amount']
fields = fields_small + fields_m2m + [
"protocols", "domain_enabled", "su_enabled", "su_method", "protocols", "domain_enabled", "su_enabled", "su_method",
"automation", "comment", "custom_fields", "labels" "automation", "comment", "custom_fields", "labels"
] + read_only_fields ] + read_only_fields
@ -208,6 +212,7 @@ class PlatformSerializer(ResourceLabelsMixin, WritableNestedModelSerializer):
"help_text": _("Assets can be connected using a zone gateway") "help_text": _("Assets can be connected using a zone gateway")
}, },
"domain_default": {"label": _('Default Domain')}, "domain_default": {"label": _('Default Domain')},
'assets': {'required': False, 'label': _('Assets')},
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -265,6 +270,11 @@ class PlatformSerializer(ResourceLabelsMixin, WritableNestedModelSerializer):
return automation return automation
class PlatformListSerializer(PlatformSerializer):
class Meta(PlatformSerializer.Meta):
fields = list(set(PlatformSerializer.Meta.fields + ['assets_amount']) - {'assets'})
class PlatformOpsMethodSerializer(serializers.Serializer): class PlatformOpsMethodSerializer(serializers.Serializer):
id = serializers.CharField(read_only=True) id = serializers.CharField(read_only=True)
name = serializers.CharField(max_length=50, label=_("Name")) name = serializers.CharField(max_length=50, label=_("Name"))