mirror of https://github.com/jumpserver/jumpserver
87 lines
2.6 KiB
Python
87 lines
2.6 KiB
Python
# coding: utf-8
|
|
#
|
|
|
|
import copy
|
|
from rest_framework import serializers
|
|
|
|
from common.serializers import AdaptedBulkListSerializer
|
|
from common.fields.serializer import CustomMetaDictField
|
|
from orgs.mixins.serializers import BulkOrgResourceModelSerializer
|
|
|
|
from .. import const
|
|
from ..models import RemoteApp
|
|
|
|
|
|
__all__ = [
|
|
'RemoteAppSerializer', 'RemoteAppConnectionInfoSerializer',
|
|
]
|
|
|
|
|
|
class RemoteAppParamsDictField(CustomMetaDictField):
|
|
type_fields_map = const.REMOTE_APP_TYPE_FIELDS_MAP
|
|
default_type = const.REMOTE_APP_TYPE_CHROME
|
|
convert_key_remove_type_prefix = False
|
|
convert_key_to_upper = False
|
|
|
|
|
|
class RemoteAppSerializer(BulkOrgResourceModelSerializer):
|
|
params = RemoteAppParamsDictField()
|
|
type_fields_map = const.REMOTE_APP_TYPE_FIELDS_MAP
|
|
|
|
class Meta:
|
|
model = RemoteApp
|
|
list_serializer_class = AdaptedBulkListSerializer
|
|
fields = [
|
|
'id', 'name', 'asset', 'asset_info', 'type', 'get_type_display',
|
|
'path', 'params', 'date_created', 'created_by', 'comment',
|
|
]
|
|
read_only_fields = [
|
|
'created_by', 'date_created', 'asset_info',
|
|
'get_type_display'
|
|
]
|
|
|
|
def process_params(self, instance, validated_data):
|
|
new_params = copy.deepcopy(validated_data.get('params', {}))
|
|
tp = validated_data.get('type', '')
|
|
|
|
if tp != instance.type:
|
|
return new_params
|
|
|
|
old_params = instance.params
|
|
fields = self.type_fields_map.get(instance.type, [])
|
|
for field in fields:
|
|
if not field.get('write_only', False):
|
|
continue
|
|
field_name = field['name']
|
|
new_value = new_params.get(field_name, '')
|
|
old_value = old_params.get(field_name, '')
|
|
field_value = new_value if new_value else old_value
|
|
new_params[field_name] = field_value
|
|
|
|
return new_params
|
|
|
|
def update(self, instance, validated_data):
|
|
params = self.process_params(instance, validated_data)
|
|
validated_data['params'] = params
|
|
return super().update(instance, validated_data)
|
|
|
|
|
|
class RemoteAppConnectionInfoSerializer(serializers.ModelSerializer):
|
|
parameter_remote_app = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = RemoteApp
|
|
fields = [
|
|
'id', 'name', 'asset', 'parameter_remote_app',
|
|
]
|
|
read_only_fields = ['parameter_remote_app']
|
|
|
|
@staticmethod
|
|
def get_parameter_remote_app(obj):
|
|
parameter = {
|
|
'program': const.REMOTE_APP_BOOT_PROGRAM_NAME,
|
|
'working_directory': '',
|
|
'parameters': obj.parameters,
|
|
}
|
|
return parameter
|