from rest_framework import serializers from django.utils.translation import ugettext_lazy as _ from assets.models import Asset, Node from perms.models import AssetPermission from perms.serializers.permission import ActionChoicesField from common.serializers.fields import ObjectRelatedField from tickets.models import ApplyAssetTicket from .common import BaseApplyAssetSerializer from .ticket import TicketApplySerializer __all__ = ['ApplyAssetSerializer', 'ApproveAssetSerializer'] asset_or_node_help_text = _("Select at least one asset or node") apply_help_text = _('Support fuzzy search, and display up to 10 items') class ApplyAssetSerializer(BaseApplyAssetSerializer, TicketApplySerializer): apply_assets = ObjectRelatedField( queryset=Asset.objects, many=True, required=False, label=_('Apply assets'), help_text=apply_help_text ) apply_nodes = ObjectRelatedField( queryset=Node.objects, many=True, required=False, label=_('Apply nodes'), help_text=apply_help_text ) apply_actions = ActionChoicesField(required=False, allow_null=True, label=_("Apply actions")) permission_model = AssetPermission class Meta(TicketApplySerializer.Meta): model = ApplyAssetTicket writeable_fields = [ 'id', 'title', 'type', 'apply_nodes', 'apply_assets', 'apply_accounts', 'apply_actions', 'apply_date_start', 'apply_date_expired', 'comment', 'org_id' ] read_only_fields = TicketApplySerializer.Meta.read_only_fields + ['apply_permission_name', ] fields = TicketApplySerializer.Meta.fields_small + writeable_fields + read_only_fields ticket_extra_kwargs = TicketApplySerializer.Meta.extra_kwargs extra_kwargs = { 'apply_accounts': {'required': False}, } extra_kwargs.update(ticket_extra_kwargs) def validate_apply_nodes(self, nodes): return self.filter_many_to_many_field(Node, nodes) def validate_apply_assets(self, assets): return self.filter_many_to_many_field(Asset, assets) def validate(self, attrs): attrs['type'] = 'apply_asset' attrs = super().validate(attrs) if self.is_final_approval and ( not attrs.get('apply_nodes') and not attrs.get('apply_assets') ): raise serializers.ValidationError({ 'apply_nodes': asset_or_node_help_text, 'apply_assets': asset_or_node_help_text, }) return attrs @classmethod def setup_eager_loading(cls, queryset): queryset = queryset.prefetch_related('apply_nodes', 'apply_assets') return queryset class ApproveAssetSerializer(ApplyAssetSerializer): class Meta(ApplyAssetSerializer.Meta): read_only_fields = TicketApplySerializer.Meta.fields_small + \ ApplyAssetSerializer.Meta.read_only_fields