Skip to content

Commit 7e3589a

Browse files
committed
refactor: add integrity check for folder tree structure in get_folder_tree method
1 parent 43c7350 commit 7e3589a

File tree

1 file changed

+26
-3
lines changed

1 file changed

+26
-3
lines changed

apps/folders/serializers/folder.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,14 +259,37 @@ class FolderTreeSerializer(serializers.Serializer):
259259
workspace_id = serializers.CharField(required=True, allow_null=True, allow_blank=True, label=_('workspace id'))
260260
source = serializers.CharField(required=True, label=_('source'))
261261

262+
@staticmethod
263+
def _check_tree_integrity(queryset):
264+
"""检查树结构完整性"""
265+
for folder in queryset:
266+
if folder.lft >= folder.rght:
267+
return True # 需要重建
268+
if folder.is_leaf_node() and folder.get_children().exists():
269+
return True # 需要重建
270+
return False
271+
262272
def get_folder_tree(self, name=None):
263273
self.is_valid(raise_exception=True)
264274
Folder = get_folder_type(self.data.get('source')) # noqa
275+
276+
# 检查特定工作空间的树结构完整性
277+
workspace_folders = Folder.objects.filter(workspace_id=self.data.get('workspace_id'))
278+
279+
# 如果发现数据不一致,重建整个表(这是 MPTT 的限制)
280+
if self._check_tree_integrity(workspace_folders):
281+
Folder.objects.rebuild()
282+
265283
if name is not None:
266-
nodes = Folder.objects.filter(Q(workspace_id=self.data.get('workspace_id')) &
267-
Q(name__contains=name)).get_cached_trees()
284+
nodes = Folder.objects.filter(
285+
Q(workspace_id=self.data.get('workspace_id')) &
286+
Q(name__contains=name)
287+
).get_cached_trees()
268288
else:
269-
nodes = Folder.objects.filter(Q(workspace_id=self.data.get('workspace_id'))).get_cached_trees()
289+
nodes = Folder.objects.filter(
290+
Q(workspace_id=self.data.get('workspace_id'))
291+
).get_cached_trees()
292+
270293
TreeSerializer = get_folder_tree_serializer(self.data.get('source')) # noqa
271294
serializer = TreeSerializer(nodes, many=True)
272295
return serializer.data # 这是可序列化的字典

0 commit comments

Comments
 (0)