mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-01 07:27:35 +00:00
perf: 优化支持 choices (#10151)
* perf: 支持自定义类型资产 * perf: 改名前 * perf: 优化支持 choices * perf: 优化自定义资产 * perf: 优化资产的详情 * perf: 修改完成自定义平台和资产 --------- Co-authored-by: ibuler <ibuler@qq.com> Co-authored-by: Jiangjie.Bai <bugatti_it@163.com>
This commit is contained in:
54
apps/common/serializers/dynamic.py
Normal file
54
apps/common/serializers/dynamic.py
Normal file
@@ -0,0 +1,54 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
example_info = [
|
||||
{"name": "name", "label": "姓名", "required": False, "default": "老广", "type": "str"},
|
||||
{"name": "age", "label": "年龄", "required": False, "default": 18, "type": "int"},
|
||||
]
|
||||
|
||||
type_field_map = {
|
||||
"str": serializers.CharField,
|
||||
"int": serializers.IntegerField,
|
||||
"bool": serializers.BooleanField,
|
||||
"text": serializers.CharField,
|
||||
"choice": serializers.ChoiceField,
|
||||
}
|
||||
|
||||
|
||||
def set_default_if_need(data, i):
|
||||
field_name = data.pop('name', 'Attr{}'.format(i + 1))
|
||||
data['name'] = field_name
|
||||
|
||||
if not data.get('label'):
|
||||
data['label'] = field_name
|
||||
return data
|
||||
|
||||
|
||||
def set_default_by_type(tp, data, field_info):
|
||||
if tp == 'str':
|
||||
data['max_length'] = 4096
|
||||
elif tp == 'choice':
|
||||
choices = field_info.pop('choices', [])
|
||||
if isinstance(choices, str):
|
||||
choices = choices.split(',')
|
||||
choices = [
|
||||
(c, c.title()) if not isinstance(c, (tuple, list)) else c
|
||||
for c in choices
|
||||
]
|
||||
data['choices'] = choices
|
||||
return data
|
||||
|
||||
|
||||
def create_serializer_class(serializer_name, fields_info):
|
||||
serializer_fields = {}
|
||||
fields_name = ['name', 'label', 'default', 'type', 'help_text']
|
||||
|
||||
for i, field_info in enumerate(fields_info):
|
||||
data = {k: field_info.get(k) for k in fields_name}
|
||||
field_type = data.pop('type', 'str')
|
||||
data = set_default_by_type(field_type, data, field_info)
|
||||
data = set_default_if_need(data, i)
|
||||
field_name = data.pop('name')
|
||||
field_class = type_field_map.get(field_type, serializers.CharField)
|
||||
serializer_fields[field_name] = field_class(**data)
|
||||
|
||||
return type(serializer_name, (serializers.Serializer,), serializer_fields)
|
Reference in New Issue
Block a user