# -*- coding: utf-8 -*- from rest_framework import serializers from rest_framework_bulk.serializers import BulkListSerializer from common.mixins import BulkSerializerMixin from ..models import Asset, Node from .asset import AssetGrantedSerializer __all__ = [ 'NodeSerializer', "NodeGrantedSerializer", "NodeAddChildrenSerializer", "NodeAssetsSerializer", ] class NodeGrantedSerializer(BulkSerializerMixin, serializers.ModelSerializer): """ 授权资产组 """ assets_granted = AssetGrantedSerializer(many=True, read_only=True) assets_amount = serializers.SerializerMethodField() parent = serializers.SerializerMethodField() name = serializers.SerializerMethodField() class Meta: model = Node fields = [ 'id', 'key', 'name', 'value', 'parent', 'assets_granted', 'assets_amount', ] @staticmethod def get_assets_amount(obj): return len(obj.assets_granted) @staticmethod def get_name(obj): return obj.name @staticmethod def get_parent(obj): return obj.parent.id class NodeSerializer(serializers.ModelSerializer): parent = serializers.SerializerMethodField() assets_amount = serializers.SerializerMethodField() class Meta: model = Node fields = ['id', 'key', 'value', 'parent', 'assets_amount', 'is_node'] list_serializer_class = BulkListSerializer def validate(self, data): value = data.get('value') instance = self.instance if self.instance else Node.root() children = instance.parent.get_children().exclude(key=instance.key) values = [child.value for child in children] if value in values: raise serializers.ValidationError( 'The same level node name cannot be the same' ) return data @staticmethod def get_parent(obj): return obj.parent.id if obj.is_node else obj.parent_id @staticmethod def get_assets_amount(obj): return obj.get_all_assets().count() if obj.is_node else 0 def get_fields(self): fields = super().get_fields() field = fields["key"] field.required = False return fields class NodeAssetsSerializer(serializers.ModelSerializer): assets = serializers.PrimaryKeyRelatedField(many=True, queryset = Asset.objects) class Meta: model = Node fields = ['assets'] class NodeAddChildrenSerializer(serializers.Serializer): nodes = serializers.ListField()