[fix] apply permission in timeline (version)

This commit is contained in:
Rushabh Mehta 2017-01-30 17:34:07 +05:30
parent e329962756
commit 80e7e0bf29
3 changed files with 128 additions and 80 deletions

View file

@ -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 = '<a href="#Form/Version/'+version.name+'">' + text + '</a>';
}
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 = '<a href="#Form/Version/'+version.name+'">' + text + '</a>';
}
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();

View file

@ -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);

View file

@ -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({