# -*- coding: utf-8 -*- # from django.conf import settings from rest_framework import serializers from common.utils import get_request_ip from users.serializers_v2 import ServiceAccountSerializer from ..models import Terminal __all__ = ['TerminalSerializer', 'TerminalRegistrationSerializer'] class TerminalSerializer(serializers.ModelSerializer): sa_serializer_class = ServiceAccountSerializer sa_serializer = None class Meta: model = Terminal fields = [ 'id', 'name', 'remote_addr', 'command_storage', 'replay_storage', 'user', 'is_accepted', 'is_deleted', 'date_created', 'comment' ] read_only_fields = ['remote_addr', 'user', 'date_created'] def is_valid(self, raise_exception=False): valid = super().is_valid(raise_exception=raise_exception) if not valid: return valid if not settings.SECURITY_SERVICE_ACCOUNT_REGISTRATION: error = {"error": "service account registration disabled"} raise serializers.ValidationError(error) data = {'name': self.validated_data.get('name')} kwargs = {'data': data} if self.instance and self.instance.user: kwargs['instance'] = self.instance.user self.sa_serializer = ServiceAccountSerializer(**kwargs) valid = self.sa_serializer.is_valid(raise_exception=True) return valid def save(self, **kwargs): instance = super().save(**kwargs) sa = self.sa_serializer.save() instance.user = sa instance.save() return instance def create(self, validated_data): request = self.context.get('request') instance = super().create(validated_data) instance.is_accepted = True if request: instance.remote_addr = get_request_ip(request) instance.save() return instance class TerminalRegistrationSerializer(serializers.Serializer): name = serializers.CharField(max_length=128) comment = serializers.CharField(max_length=128) service_account = ServiceAccountSerializer(read_only=True)