| 2381 | visited = set() |
| 2382 | |
| 2383 | def walk(node): |
| 2384 | if isinstance(node, Record): |
| 2385 | ruid = node.record_uid |
| 2386 | if ruid in nsf_records: |
| 2387 | nsf_record_uids.add(ruid) |
| 2388 | else: |
| 2389 | classic_record_uids.add(ruid) |
| 2390 | return |
| 2391 | |
| 2392 | node_uid = node.uid if hasattr(node, 'uid') else '' |
| 2393 | walk_key = node_uid or id(node) |
| 2394 | if walk_key in visited: |
| 2395 | return |
| 2396 | visited.add(walk_key) |
| 2397 | |
| 2398 | is_nsf = ( |
| 2399 | (hasattr(node, 'type') and node.type == 'nested_share_folder') |
| 2400 | or (node_uid and node_uid in nsf_folders) |
| 2401 | ) |
| 2402 | if is_nsf and node_uid: |
| 2403 | nsf_folder_uids.add(node_uid) |
| 2404 | |
| 2405 | dir_nodes = [] |
| 2406 | if hasattr(node, 'subfolders'): |
| 2407 | dir_nodes = [params.folder_cache.get(fuid) for fuid in node.subfolders if params.folder_cache.get(fuid)] |
| 2408 | |
| 2409 | is_root = (isinstance(node, BaseFolderNode) and (node.type == '/' or node_uid == '')) or ( |
| 2410 | hasattr(node, 'type') and node.type == 'nested_share_folder' and not node_uid) |
| 2411 | |
| 2412 | if is_root and nsf_folders: |
| 2413 | for nsf_uid, nsf_folder in nsf_folders.items(): |
| 2414 | parent_uid = nsf_folder.get('parent_uid') |
| 2415 | is_root_folder = ( |
| 2416 | parent_uid is None or parent_uid == '' or parent_uid == 'root' |
| 2417 | or parent_uid == 'AAAAAAAAAAAAAAAAAPmtNA' |
| 2418 | or (parent_uid and parent_uid not in nsf_folders) |
| 2419 | ) |
| 2420 | if not is_root_folder: |
| 2421 | continue |
| 2422 | nsf_folder_uids.add(nsf_uid) |
| 2423 | if nsf_uid in params.folder_cache: |
| 2424 | dir_nodes.append(params.folder_cache.get(nsf_uid)) |
| 2425 | else: |
| 2426 | dir_nodes.append(type('FolderNode', (), { |
| 2427 | 'uid': nsf_uid, 'name': nsf_folder.get('name', ''), |
| 2428 | 'type': 'nested_share_folder', 'subfolders': [] |
| 2429 | })()) |
| 2430 | elif node_uid and nsf_folders: |
| 2431 | for child_uid, child_folder in nsf_folders.items(): |
| 2432 | if child_folder.get('parent_uid', '') == node_uid: |
| 2433 | nsf_folder_uids.add(child_uid) |
| 2434 | if child_uid in params.folder_cache: |
| 2435 | dir_nodes.append(params.folder_cache.get(child_uid)) |
| 2436 | else: |
| 2437 | dir_nodes.append(type('FolderNode', (), { |
| 2438 | 'uid': child_uid, 'name': child_folder.get('name', ''), |
| 2439 | 'type': 'nested_share_folder', 'subfolders': [] |
| 2440 | })()) |