Skip to content

Commit

Permalink
feat: user fields CURD #1205
Browse files Browse the repository at this point in the history
  • Loading branch information
Canway-shiisa committed Oct 8, 2023
1 parent 6e3cc05 commit 1e9675f
Showing 1 changed file with 38 additions and 56 deletions.
94 changes: 38 additions & 56 deletions src/bk-user/bkuser/apis/web/tenant_setting/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,36 @@
logger = logging.getLogger(__name__)


def _validate_options(options):
"""用户自定义字段:<选项> 字段校验"""
if not options:
raise serializers.ValidationError(_("枚举类型的自定义字段需要传递非空的<选项>字段"))
try:
TenantUserCustomFieldOptions(options=options)
except PDValidationError as e:
raise serializers.ValidationError(_("<选项>字段不合法: {}".format(e)))


def _validate_enum_default(default: int, options: List[Dict]):
"""用户自定义字段:单枚举类型的 <默认值> 字段校验"""
if not isinstance(default, int):
raise TypeError("枚举类型自定义字段的 default 值要传递整数类型")

# 单枚举类型要求 default 的值为 options 其中一个对象的 ID 值
if not (default and default in [opt["id"] for opt in options]):
raise serializers.ValidationError(_("默认值必须是 options 中对象的其中一个 id 值"))


def _validate_multi_enum_default(default: List[int], options: List[Dict]):
"""用户自定义字段:多选枚举类型的 <默认值> 字段校验"""
if not isinstance(default, List):
raise TypeError("多选枚举类型自定义字段的 default 值需要传递列表类型")

# 多选枚举类型要求 default 中的值都为 options 其中任一对象的 ID 值
if not (default and set(default).issubset({opt["id"] for opt in options})):
raise serializers.ValidationError(_("默认值必须属于 options 中对象的 id 值"))


class BuiltinFieldOutputSLZ(serializers.Serializer):
id = serializers.IntegerField(help_text="字段ID", read_only=True)
name = serializers.CharField(help_text="字段名称")
Expand Down Expand Up @@ -74,39 +104,15 @@ def validate(self, attrs):
default = attrs.get("default")

if data_type == UserFieldDataType.ENUM.value:
self._validate_options(options)
self._validate_enum_default(default, options)
_validate_options(options)
_validate_enum_default(default, options)

elif data_type == UserFieldDataType.MULTI_ENUM.value:
self._validate_options(options)
self._validate_multi_enum_default(default, options)
_validate_options(options)
_validate_multi_enum_default(default, options)

return attrs

def _validate_options(self, options):
if not options:
raise serializers.ValidationError(_("枚举类型的自定义字段需要传递非空的<选项>字段"))
try:
TenantUserCustomFieldOptions(options=options)
except PDValidationError as e:
raise serializers.ValidationError(_("<选项>字段不合法: {}".format(e)))

def _validate_enum_default(self, default: int, options: List[Dict]):
if not isinstance(default, int):
raise TypeError("枚举类型自定义字段的 default 值要传递整数类型")

# 单枚举类型要求 default 的值为 options 其中一个对象的 ID 值
if not (default or default in [opt["id"] for opt in options]):
raise serializers.ValidationError(_("默认值必须是 options 中对象的其中一个 id 值"))

def _validate_multi_enum_default(self, default: List[int], options: List[Dict]):
if not isinstance(default, List):
raise TypeError("多选枚举类型自定义字段的 default 值需要传递列表类型")

# 多选枚举类型要求 default 中的值都为 options 其中任一对象的 ID 值
if not (default or set(default).issubset({opt["id"] for opt in options})):
raise serializers.ValidationError(_("默认值必须属于 options 中对象的 id 值"))


class TenantUserCustomFieldCreateOutputSLZ(serializers.Serializer):
id = serializers.IntegerField()
Expand Down Expand Up @@ -134,35 +140,11 @@ def validate(self, attrs):
default = attrs.get("default")

if data_type == UserFieldDataType.ENUM.value:
self._validate_options(options)
self._validate_enum_default(default, options)
_validate_options(options)
_validate_enum_default(default, options)

elif data_type == UserFieldDataType.MULTI_ENUM.value:
self._validate_options(options)
self._validate_multi_enum_default(default, options)
_validate_options(options)
_validate_multi_enum_default(default, options)

return attrs

def _validate_options(self, options):
if not options:
raise serializers.ValidationError(_("枚举类型的自定义字段需要传递非空的<选项>字段"))
try:
TenantUserCustomFieldOptions(options=options)
except PDValidationError as e:
raise serializers.ValidationError(_("<选项>字段不合法: {}".format(e)))

def _validate_enum_default(self, default: int, options: List[Dict]):
if not isinstance(default, int):
raise TypeError("枚举类型自定义字段的 default 值要传递整数类型")

# 单枚举类型要求 default 的值为 options 其中一个对象的 ID 值
if not (default or default in [opt["id"] for opt in options]):
raise serializers.ValidationError(_("默认值必须是 options 中对象的其中一个 id 值"))

def _validate_multi_enum_default(self, default: List[int], options: List[Dict]):
if not isinstance(default, List):
raise TypeError("多选枚举类型自定义字段的 default 值需要传递列表类型")

# 多选枚举类型要求 default 中的值都为 options 其中任一对象的 ID 值
if not (default or set(default).issubset({opt["id"] for opt in options})):
raise serializers.ValidationError(_("默认值必须属于 options 中对象的 id 值"))

0 comments on commit 1e9675f

Please sign in to comment.