Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def tree_to_list(items, sort_by=None, omit=[], reverse=False):
- # First set up some empty arrays to hold interim values
- items_flat = []
- roots = []
- items_sorted = []
- items_keyed_by_id = {}
- # Create a flat list of all given items
- for item in items:
- items_flat.append({
- 'obj': item,
- 'children': [],
- 'depth': 0,
- })
- # Create a dict of all items keyed by ID
- for item in items_flat:
- items_keyed_by_id[item['obj'].id] = item
- # Fill up the "children" attribute for every node, and the list of roots
- for item in items_flat:
- if item['obj'].parent and item['obj'].parent.id in items_keyed_by_id:
- parent = items_keyed_by_id[item['obj'].parent.id]
- parent['children'].append(item)
- else:
- roots.append(item)
- # Sort the roots by the given attribute
- if sort_by:
- roots = sorted(roots, key=lambda k: getattr(k['obj'], sort_by), reverse=reverse)
- # Build items_sorted by iterating through roots, adding sorted children, setting the depth, and
- # moving each child node into the roots to process before popping it off the stack
- while len(roots):
- root = roots[0]
- del roots[0]
- if not omit or not root.obj.id in omit:
- items_sorted.append(root)
- children = sorted(root['children'], key=lambda k: getattr(k['obj'], sort_by), reverse=not reverse)
- for child in children:
- child['depth'] = root['depth'] + 1
- roots.insert(0, child)
- return items_sorted
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement