diff --git a/frappe/public/js/frappe/views/treeview.js b/frappe/public/js/frappe/views/treeview.js index 93c490884e..b69053eb26 100644 --- a/frappe/public/js/frappe/views/treeview.js +++ b/frappe/public/js/frappe/views/treeview.js @@ -172,6 +172,23 @@ frappe.views.TreeView = Class.extend({ this.post_render(); }, + rebuild_tree: function() { + let me = this; + + frappe.call({ + "method": "frappe.utils.nestedset.rebuild_tree", + "args": { + 'doctype': me.doctype, + 'parent_field': "parent_"+me.doctype.toLowerCase().replace(/ /g, '_'), + }, + "callback": function(r) { + if (!r.exc) { + me.make_tree(); + } + } + }); + }, + post_render: function() { var me = this; me.opts.post_render && me.opts.post_render(me); @@ -368,7 +385,7 @@ frappe.views.TreeView = Class.extend({ }, "add"); } }, - set_menu_item: function(){ + set_menu_item: function() { var me = this; this.menu_items = [ @@ -393,6 +410,17 @@ frappe.views.TreeView = Class.extend({ }, ]; + if (frappe.user.has_role('System Manager')) { + this.menu_items.push( + { + label: __('Rebuild Tree'), + action: function() { + me.rebuild_tree(); + } + } + ); + } + if (me.opts.menu_items) { me.menu_items.push.apply(me.menu_items, me.opts.menu_items) } diff --git a/frappe/utils/nestedset.py b/frappe/utils/nestedset.py index ab426d2ce4..531699db0c 100644 --- a/frappe/utils/nestedset.py +++ b/frappe/utils/nestedset.py @@ -137,10 +137,16 @@ def update_move_node(doc, parent_field): frappe.db.sql("""update `tab{0}` set lft = -lft + %s, rgt = -rgt + %s, modified=%s where lft < 0""".format(doc.doctype), (new_diff, new_diff, n)) +@frappe.whitelist() def rebuild_tree(doctype, parent_field): """ call rebuild_node for all root nodes """ + + # Check for perm if called from client-side + if frappe.request and frappe.local.form_dict.cmd == 'rebuild_tree': + frappe.only_for('System Manager') + # get all roots frappe.db.auto_commit_on_many_writes = 1