jumpserver/apps/assets/serializers/platform.py

83 lines
3.4 KiB
Python

from rest_framework import serializers
from django.utils.translation import gettext_lazy as _
from common.drf.fields import ChoiceDisplayField
from common.drf.serializers import JMSWritableNestedModelSerializer
from ..models import Platform, PlatformProtocol
from ..const import Category, AllTypes
__all__ = ['PlatformSerializer', 'PlatformOpsMethodSerializer']
class ProtocolSettingSerializer(serializers.Serializer):
SECURITY_CHOICES = [
('any', 'Any'),
('rdp', 'RDP'),
('tls', 'TLS'),
('nla', 'NLA'),
]
console = serializers.BooleanField(required=False)
security = serializers.ChoiceField(choices=SECURITY_CHOICES, default='any', required=False)
class PlatformProtocolsSerializer(serializers.ModelSerializer):
setting = ProtocolSettingSerializer(required=False)
class Meta:
model = PlatformProtocol
fields = ['id', 'name', 'port', 'setting']
class PlatformSerializer(JMSWritableNestedModelSerializer):
type = ChoiceDisplayField(choices=AllTypes.choices, label=_("Type"))
category = ChoiceDisplayField(choices=Category.choices, label=_("Category"))
protocols = PlatformProtocolsSerializer(label=_('Protocols'), many=True, required=False)
type_constraints = serializers.ReadOnlyField(required=False, read_only=True)
su_method = ChoiceDisplayField(
choices=[('sudo', 'sudo su -'), ('su', 'su - ')],
label='切换方式', required=False, default='sudo'
)
class Meta:
model = Platform
fields_mini = ['id', 'name', 'internal']
fields_small = fields_mini + [
'category', 'type',
]
fields = fields_small + [
'domain_enabled', 'domain_default', 'su_enabled', 'su_method',
'protocols_enabled', 'protocols', 'ping_enabled', 'ping_method',
'verify_account_enabled', 'verify_account_method',
'change_password_enabled', 'change_password_method',
'type_constraints', 'comment', 'charset',
]
extra_kwargs = {
'su_enabled': {'label': '启用切换账号'},
'verify_account_enabled': {'label': '启用校验账号'},
'verify_account_method': {'label': '校验账号方式'},
'create_account_enabled': {'label': '启用创建账号'},
'create_account_method': {'label': '创建账号方式'},
'change_password_enabled': {'label': '启用账号创建改密'},
'change_password_method': {'label': '账号创建改密方式'},
}
def validate(self, attrs):
fields_to_check = [
('verify_account_enabled', 'verify_account_method'),
('create_account_enabled', 'create_account_method'),
('change_password_enabled', 'change_password_method'),
]
for method_enabled, method_name in fields_to_check:
if attrs.get(method_enabled, False) and not attrs.get(method_name, False):
raise serializers.ValidationError({method_name: _('This field is required.')})
return attrs
class PlatformOpsMethodSerializer(serializers.Serializer):
id = serializers.CharField(read_only=True)
name = serializers.CharField(max_length=50, label=_('Name'))
category = serializers.CharField(max_length=50, label=_('Category'))
type = serializers.ListSerializer(child=serializers.CharField())
method = serializers.CharField()