# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors # MIT License. See license.txt import frappe from frappe import _ @frappe.whitelist() def get_all_nodes(method, company): """Recursively gets all data from nodes""" method = frappe.get_attr(method) if method not in frappe.whitelisted: frappe.throw(_("Not Permitted"), frappe.PermissionError) root_nodes = method(company=company) result = [] nodes_to_expand = [] for root in root_nodes: data = method(root.id, company) result.append(dict(parent=root.id, parent_name=root.name, data=data)) nodes_to_expand.extend( [{"id": d.get("id"), "name": d.get("name")} for d in data if d.get("expandable")] ) while nodes_to_expand: parent = nodes_to_expand.pop(0) data = method(parent.get("id"), company) result.append(dict(parent=parent.get("id"), parent_name=parent.get("name"), data=data)) for d in data: if d.get("expandable"): nodes_to_expand.append({"id": d.get("id"), "name": d.get("name")}) return result