feat: enhance module depth validation with current depth tracking

This commit is contained in:
CaptainB 2025-04-27 10:42:18 +08:00
parent f7a4aca0e8
commit bb4b35bfe8

View File

@ -28,7 +28,7 @@ def get_module_type(source):
MODULE_DEPTH = 3 # Module 不能超过3层
def check_depth(source, parent_id):
def check_depth(source, parent_id, current_depth=0):
# Module 不能超过3层
Module = get_module_type(source)
@ -46,10 +46,28 @@ def check_depth(source, 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'))
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):
id = serializers.CharField(required=True, label=_('module id'))
name = serializers.CharField(required=True, label=_('module name'))
@ -110,7 +128,8 @@ class ModuleSerializer(serializers.Serializer):
parent_id = instance.get('parent_id')
if parent_id is not None and current_id != 'root':
# 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)
current_node.move_to(parent)