From 80e7e0bf29d2f6bf428dfb0803ed006be4818239 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 30 Jan 2017 17:34:07 +0530 Subject: [PATCH] [fix] apply permission in timeline (version) --- .../public/js/frappe/form/footer/timeline.js | 193 +++++++++++------- frappe/public/js/frappe/model/perm.js | 13 +- .../js/frappe/ui/toolbar/awesome_bar.js | 2 +- 3 files changed, 128 insertions(+), 80 deletions(-) diff --git a/frappe/public/js/frappe/form/footer/timeline.js b/frappe/public/js/frappe/form/footer/timeline.js index c9c3a0f277..e3241811e3 100644 --- a/frappe/public/js/frappe/form/footer/timeline.js +++ b/frappe/public/js/frappe/form/footer/timeline.js @@ -365,86 +365,125 @@ frappe.ui.form.Timeline = Class.extend({ out = [].concat(docinfo.communications); if(with_versions) { - var add_comment = function(version, text, comment_type) { - if(!comment_type) { - text = '' + text + ''; - } - out.push({ - comment_type: comment_type || 'Edit', - creation: version.creation, - owner: version.owner, - version_name: version.name, - sender: version.owner, - comment_by: version.owner, - content: text - }); - } - - docinfo.versions.forEach(function(version) { - if(!version.data) return; - var data = JSON.parse(version.data); - - // comment - if(data.comment) { - add_comment(version, data.comment, data.comment_type); - return; - } - - // value changed in parent - if(data.changed && data.changed.length) { - var parts = []; - data.changed.slice(0, 3).forEach(function(p) { - if(p[0]==='docstatus') { - if(p[2]==1) { - add_comment(version, __('submitted this document')); - } else if (p[2]==2) { - add_comment(version, __('cancelled this document')); - } - } else { - parts.push(__('{0} from {1} to {2}', [ - frappe.meta.get_label(me.frm.doctype, p[0]), - (frappe.ellipsis(p[1], 40) || '""').bold(), - (frappe.ellipsis(p[2], 40) || '""').bold() - ])); - } - }); - add_comment(version, __("changed value of {0}", [parts.join(', ')])); - } - - // value changed in table field - if(data.row_changed && data.row_changed.length) { - var parts = [], count = 0; - data.row_changed.every(function(row) { - row[3].every(function(p) { - parts.push(__('{0} from {1} to {2} in row #{3}', [ - frappe.meta.get_label(me.frm.fields_dict[row[0]].grid.doctype, - p[0]), - (frappe.ellipsis(p[1], 40) || '""').bold(), - (frappe.ellipsis(p[2], 40) || '""').bold(), - row[1] - ])); - return parts.length < 3; - }); - return parts.length < 3; - }); - add_comment(version, __("changed values for {0}", - [parts.join(', ')])); - } - - // rows added / removed - // __('added'), __('removed') # for translation, don't remove - ['added', 'removed'].forEach(function(key) { - if(data[key] && data[key].length) { - parts = (data[key] || []).map(function(p) { - return frappe.meta.get_label(me.frm.doctype, p[0]) }); - add_comment(version, __("{0} rows for {1}", - [__(key), parts.join(', ')])); - } - }); - }); + this.build_version_comments(docinfo, out); } return out; }, + build_version_comments: function(docinfo, out) { + var me = this; + + docinfo.versions.forEach(function(version) { + if(!version.data) return; + var data = JSON.parse(version.data); + + // comment + if(data.comment) { + out.push(this.get_version_comment(version, data.comment, data.comment_type)); + return; + } + + // value changed in parent + if(data.changed && data.changed.length) { + var parts = []; + data.changed.every(function(p) { + if(p[0]==='docstatus') { + if(p[2]==1) { + out.push(me.get_version_comment(version, __('submitted this document'))); + } else if (p[2]==2) { + out.push(me.get_version_comment(version, __('cancelled this document'))); + } + } else { + var df = frappe.meta.get_docfield(me.frm.doctype, p[0], me.frm.docname); + if(!df.hidden) { + var field_display_status = frappe.perm.get_field_display_status(df, null, + me.frm.perm); + if(field_display_status === 'Read' || field_display_status === 'Write') { + parts.push(__('{0} from {1} to {2}', [ + __(df.label), + (frappe.ellipsis(p[1], 40) || '""').bold(), + (frappe.ellipsis(p[2], 40) || '""').bold() + ])); + } + } + } + return parts.length < 3; + }); + if(parts.length) { + out.push(me.get_version_comment(version, __("changed value of {0}", [parts.join(', ')]))); + } + } + + // value changed in table field + if(data.row_changed && data.row_changed.length) { + var parts = [], count = 0; + data.row_changed.every(function(row) { + row[3].every(function(p) { + var df = frappe.meta.get_docfield(me.frm.fields_dict[row[0]].grid.doctype, + p[0], me.frm.docname); + + if(!df.hidden) { + field_display_status = frappe.perm.get_field_display_status(df, + null, me.frm.perm); + + if(field_display_status === 'Read' || field_display_status === 'Write') { + parts.push(__('{0} from {1} to {2} in row #{3}', [ + frappe.meta.get_label(me.frm.fields_dict[row[0]].grid.doctype, + p[0]), + (frappe.ellipsis(p[1], 40) || '""').bold(), + (frappe.ellipsis(p[2], 40) || '""').bold(), + row[1] + ])); + } + } + return parts.length < 3; + }); + return parts.length < 3; + }); + if(parts.length) { + out.push(me.get_version_comment(version, __("changed values for {0}", + [parts.join(', ')]))); + } + } + + // rows added / removed + // __('added'), __('removed') # for translation, don't remove + ['added', 'removed'].forEach(function(key) { + if(data[key] && data[key].length) { + parts = (data[key] || []).map(function(p) { + var df = frappe.meta.get_docfield(me.frm.doctype, p[0], me.frm.docname); + if(!df.hidden) { + var field_display_status = frappe.perm.get_field_display_status(df, null, + me.frm.perm); + + if(field_display_status === 'Read' || field_display_status === 'Write') { + return frappe.meta.get_label(me.frm.doctype, p[0]) + } + } + }); + parts = parts.filter(function(p) { return p; }); + if(parts.length) { + out.push(me.get_version_comment(version, __("{0} rows for {1}", + [__(key), parts.join(', ')]))); + } + } + }); + }); + }, + get_version_comment: function(version, text, comment_type) { + if(!comment_type) { + text = '' + text + ''; + } + return { + comment_type: comment_type || 'Edit', + creation: version.creation, + owner: version.owner, + version_name: version.name, + sender: version.owner, + comment_by: version.owner, + content: text + }; + }, + add_comment: function(btn) { var txt = this.input.val(); diff --git a/frappe/public/js/frappe/model/perm.js b/frappe/public/js/frappe/model/perm.js index f83e56f47e..adff448535 100644 --- a/frappe/public/js/frappe/model/perm.js +++ b/frappe/public/js/frappe/model/perm.js @@ -255,11 +255,16 @@ $.extend(frappe.perm, { }, get_field_display_status: function(df, doc, perm, explain) { - if(!doc) { + // returns the display status of a particular field + // returns one of "Read", "Write" or "None" + if(!perm && doc) { + perm = frappe.perm.get_perm(doc.doctype, doc); + } + + if(!perm) { return (df && (cint(df.hidden) || cint(df.hidden_due_to_dependency))) ? "None": "Write"; } - perm = perm || frappe.perm.get_perm(doc.doctype, doc); if(!df.permlevel) df.permlevel = 0; var p = perm[df.permlevel]; var status = "None"; @@ -282,6 +287,10 @@ $.extend(frappe.perm, { if(cint(df.hidden_due_to_dependency)) status = "None"; if(explain) console.log("By Hidden Due To Dependency:" + status); + if(!doc) { + return status; + } + // submit if(status==="Write" && cint(doc.docstatus) > 0) status = "Read"; if(explain) console.log("By Submit:" + status); diff --git a/frappe/public/js/frappe/ui/toolbar/awesome_bar.js b/frappe/public/js/frappe/ui/toolbar/awesome_bar.js index 223016f5a3..72d7774512 100644 --- a/frappe/public/js/frappe/ui/toolbar/awesome_bar.js +++ b/frappe/public/js/frappe/ui/toolbar/awesome_bar.js @@ -282,7 +282,7 @@ frappe.search.verbs = [ out.push({ label: __("{0} Calendar", [__(match).bold()]), value: __("{0} Calendar", [__(match)]), - route:["Calendar", match] + route:["List", match, "Calendar"] }); out.push({