feat: enhance module depth validation with current depth tracking
This commit is contained in:
parent
f7a4aca0e8
commit
bb4b35bfe8
@ -28,7 +28,7 @@ def get_module_type(source):
|
|||||||
MODULE_DEPTH = 3 # Module 不能超过3层
|
MODULE_DEPTH = 3 # Module 不能超过3层
|
||||||
|
|
||||||
|
|
||||||
def check_depth(source, parent_id):
|
def check_depth(source, parent_id, current_depth=0):
|
||||||
# Module 不能超过3层
|
# Module 不能超过3层
|
||||||
Module = get_module_type(source)
|
Module = get_module_type(source)
|
||||||
|
|
||||||
@ -46,10 +46,28 @@ def check_depth(source, parent_id):
|
|||||||
current_parent_id = parent_node.parent_id
|
current_parent_id = parent_node.parent_id
|
||||||
|
|
||||||
# 验证层级深度
|
# 验证层级深度
|
||||||
if depth > MODULE_DEPTH:
|
if depth + current_depth > MODULE_DEPTH:
|
||||||
raise serializers.ValidationError(_('Module depth cannot exceed 3 levels'))
|
raise serializers.ValidationError(_('Module depth cannot exceed 3 levels'))
|
||||||
|
|
||||||
|
|
||||||
|
def get_max_depth(current_node):
|
||||||
|
if not current_node:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
# 获取所有后代节点
|
||||||
|
descendants = current_node.get_descendants()
|
||||||
|
|
||||||
|
if not descendants.exists():
|
||||||
|
return 0
|
||||||
|
|
||||||
|
# 获取最大深度
|
||||||
|
max_level = descendants.order_by('-level').first().level
|
||||||
|
current_level = current_node.level
|
||||||
|
max_depth = max_level - current_level
|
||||||
|
|
||||||
|
return max_depth
|
||||||
|
|
||||||
|
|
||||||
class ModuleSerializer(serializers.Serializer):
|
class ModuleSerializer(serializers.Serializer):
|
||||||
id = serializers.CharField(required=True, label=_('module id'))
|
id = serializers.CharField(required=True, label=_('module id'))
|
||||||
name = serializers.CharField(required=True, label=_('module name'))
|
name = serializers.CharField(required=True, label=_('module name'))
|
||||||
@ -110,7 +128,8 @@ class ModuleSerializer(serializers.Serializer):
|
|||||||
parent_id = instance.get('parent_id')
|
parent_id = instance.get('parent_id')
|
||||||
if parent_id is not None and current_id != 'root':
|
if parent_id is not None and current_id != 'root':
|
||||||
# Module 不能超过3层
|
# Module 不能超过3层
|
||||||
check_depth(self.data.get('source'), parent_id)
|
current_depth = get_max_depth(current_node)
|
||||||
|
check_depth(self.data.get('source'), parent_id, current_depth)
|
||||||
parent = Module.objects.get(id=parent_id)
|
parent = Module.objects.get(id=parent_id)
|
||||||
current_node.move_to(parent)
|
current_node.move_to(parent)
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user