From 7f2e645593035a03fd0c1b598bdd8dcac1645ef4 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 27 Jan 2021 16:46:47 +0530 Subject: [PATCH 1/6] feat: Provision to rebuild NSM from treeview --- frappe/public/js/frappe/views/treeview.js | 33 +++++++++++++++++++++-- frappe/utils/nestedset.py | 6 ++++- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/views/treeview.js b/frappe/public/js/frappe/views/treeview.js index 1a53c14974..ddddb33f9c 100644 --- a/frappe/public/js/frappe/views/treeview.js +++ b/frappe/public/js/frappe/views/treeview.js @@ -171,6 +171,24 @@ 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,'_'), + 'commit': 1 + }, + "callback": function(r) { + if (!r.exc) { + me.make_tree(); + } + } + }) + }, + post_render: function() { var me = this; me.opts.post_render && me.opts.post_render(me); @@ -359,7 +377,7 @@ frappe.views.TreeView = Class.extend({ }); }); }, - set_primary_action: function(){ + set_primary_action: function() { var me = this; if (!this.opts.disable_add_node && this.can_create) { me.page.set_primary_action(__("New"), function() { @@ -367,7 +385,7 @@ frappe.views.TreeView = Class.extend({ }, "octicon octicon-plus") } }, - set_menu_item: function(){ + set_menu_item: function() { var me = this; this.menu_items = [ @@ -392,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..03200eb4ad 100644 --- a/frappe/utils/nestedset.py +++ b/frappe/utils/nestedset.py @@ -137,7 +137,8 @@ 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)) -def rebuild_tree(doctype, parent_field): +@frappe.whitelist() +def rebuild_tree(doctype, parent_field, commit=0): """ call rebuild_node for all root nodes """ @@ -151,6 +152,9 @@ def rebuild_tree(doctype, parent_field): frappe.db.auto_commit_on_many_writes = 0 + if commit: + frappe.db.commit() + def rebuild_node(doctype, parent, left, parent_field): """ reset lft, rgt and recursive call for all children From 79c73fadcea0742dc11ae65104ae60f558c5fa1d Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sat, 20 Feb 2021 19:47:44 +0530 Subject: [PATCH 2/6] fix: Linting Issues --- frappe/public/js/frappe/views/treeview.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/views/treeview.js b/frappe/public/js/frappe/views/treeview.js index ddddb33f9c..0308f80bfb 100644 --- a/frappe/public/js/frappe/views/treeview.js +++ b/frappe/public/js/frappe/views/treeview.js @@ -178,7 +178,7 @@ frappe.views.TreeView = Class.extend({ "method": "frappe.utils.nestedset.rebuild_tree", "args": { 'doctype': me.doctype, - 'parent_field': "parent_"+me.doctype.toLowerCase().replace(/ /g,'_'), + 'parent_field': "parent_"+me.doctype.toLowerCase().replace(/ /g, '_'), 'commit': 1 }, "callback": function(r) { @@ -186,7 +186,7 @@ frappe.views.TreeView = Class.extend({ me.make_tree(); } } - }) + }); }, post_render: function() { @@ -418,7 +418,7 @@ frappe.views.TreeView = Class.extend({ me.rebuild_tree(); } } - ) + ); } if (me.opts.menu_items) { From 9e19d13262eb4c431b61d2b79184d29136c45d2c Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sun, 21 Feb 2021 18:35:34 +0530 Subject: [PATCH 3/6] fix: Check for perm --- frappe/public/js/frappe/views/treeview.js | 1 - frappe/utils/nestedset.py | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/views/treeview.js b/frappe/public/js/frappe/views/treeview.js index 900c2508cc..b69053eb26 100644 --- a/frappe/public/js/frappe/views/treeview.js +++ b/frappe/public/js/frappe/views/treeview.js @@ -180,7 +180,6 @@ frappe.views.TreeView = Class.extend({ "args": { 'doctype': me.doctype, 'parent_field': "parent_"+me.doctype.toLowerCase().replace(/ /g, '_'), - 'commit': 1 }, "callback": function(r) { if (!r.exc) { diff --git a/frappe/utils/nestedset.py b/frappe/utils/nestedset.py index 03200eb4ad..996fe0b96d 100644 --- a/frappe/utils/nestedset.py +++ b/frappe/utils/nestedset.py @@ -138,10 +138,15 @@ def update_move_node(doc, parent_field): where lft < 0""".format(doc.doctype), (new_diff, new_diff, n)) @frappe.whitelist() -def rebuild_tree(doctype, parent_field, commit=0): +def rebuild_tree(doctype, parent_field): """ call rebuild_node for all root nodes """ + + # Check for perm + if not frappe.has_permission(doctype): + frappe.msgprint(_("No Permission"), raise_exception=1) + # get all roots frappe.db.auto_commit_on_many_writes = 1 @@ -152,9 +157,6 @@ def rebuild_tree(doctype, parent_field, commit=0): frappe.db.auto_commit_on_many_writes = 0 - if commit: - frappe.db.commit() - def rebuild_node(doctype, parent, left, parent_field): """ reset lft, rgt and recursive call for all children From ce9843ee4aca08e21481b6fbb45ba722198906ff Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 24 Feb 2021 15:22:17 +0530 Subject: [PATCH 4/6] fix: Only for system manager --- frappe/utils/nestedset.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/frappe/utils/nestedset.py b/frappe/utils/nestedset.py index 996fe0b96d..8e569952b1 100644 --- a/frappe/utils/nestedset.py +++ b/frappe/utils/nestedset.py @@ -143,9 +143,14 @@ def rebuild_tree(doctype, parent_field): call rebuild_node for all root nodes """ - # Check for perm - if not frappe.has_permission(doctype): - frappe.msgprint(_("No Permission"), raise_exception=1) + # Check for perm if called from client-side + if frappe.request: + user = frappe.session.user + if user != 'Administrator' or ('System Manager' not in frappe.get_roles(user)): + frappe.throw(_("No Permission")) + + if not frappe.has_permission(doctype, ptype='write'): + frappe.throw(_("No Permission")) # get all roots frappe.db.auto_commit_on_many_writes = 1 From 38861decabcf26ecd69d208fb617289256041575 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 24 Feb 2021 15:23:49 +0530 Subject: [PATCH 5/6] fix: Only for system manager --- frappe/utils/nestedset.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/frappe/utils/nestedset.py b/frappe/utils/nestedset.py index 8e569952b1..a7a7b4cb37 100644 --- a/frappe/utils/nestedset.py +++ b/frappe/utils/nestedset.py @@ -145,12 +145,7 @@ def rebuild_tree(doctype, parent_field): # Check for perm if called from client-side if frappe.request: - user = frappe.session.user - if user != 'Administrator' or ('System Manager' not in frappe.get_roles(user)): - frappe.throw(_("No Permission")) - - if not frappe.has_permission(doctype, ptype='write'): - frappe.throw(_("No Permission")) + frappe.only_for('System Manager') # get all roots frappe.db.auto_commit_on_many_writes = 1 From f2d619bb2c4d08e5b608e0f09941b6450fa6a940 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 24 Feb 2021 15:43:03 +0530 Subject: [PATCH 6/6] fix: Check for command in case of API call --- frappe/utils/nestedset.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/utils/nestedset.py b/frappe/utils/nestedset.py index a7a7b4cb37..531699db0c 100644 --- a/frappe/utils/nestedset.py +++ b/frappe/utils/nestedset.py @@ -144,7 +144,7 @@ def rebuild_tree(doctype, parent_field): """ # Check for perm if called from client-side - if frappe.request: + if frappe.request and frappe.local.form_dict.cmd == 'rebuild_tree': frappe.only_for('System Manager') # get all roots