@@ -7,7 +7,7 @@ import frappe.defaults | |||||
from frappe.modules.import_file import get_file_path, read_doc_from_file | from frappe.modules.import_file import get_file_path, read_doc_from_file | ||||
from frappe.translate import send_translations | from frappe.translate import send_translations | ||||
from frappe.desk.notifications import delete_notification_count_for | from frappe.desk.notifications import delete_notification_count_for | ||||
from frappe.permissions import reset_perms | |||||
from frappe.permissions import reset_perms, get_linked_doctypes | |||||
@frappe.whitelist() | @frappe.whitelist() | ||||
def get_roles_and_doctypes(): | def get_roles_and_doctypes(): | ||||
@@ -31,15 +31,6 @@ def get_permissions(doctype=None, role=None): | |||||
role and ((doctype and " and " or "") + " role='%s'" % role.replace("'", "\'")) or ""), | role and ((doctype and " and " or "") + " role='%s'" % role.replace("'", "\'")) or ""), | ||||
as_dict=True) | as_dict=True) | ||||
def get_linked_doctypes(dt): | |||||
return list(set([dt] + [d.options for d in | |||||
frappe.get_meta(dt).get("fields", { | |||||
"fieldtype":"Link", | |||||
"ignore_user_permissions":("!=", 1), | |||||
"options": ("!=", "[Select]") | |||||
}) | |||||
])) | |||||
linked_doctypes = {} | linked_doctypes = {} | ||||
for d in out: | for d in out: | ||||
d.linked_doctypes = linked_doctypes.setdefault(d.parent, get_linked_doctypes(d.parent)) | d.linked_doctypes = linked_doctypes.setdefault(d.parent, get_linked_doctypes(d.parent)) | ||||
@@ -119,15 +119,19 @@ def get_role_permissions(meta, user=None): | |||||
perms["apply_user_permissions"][ptype] = (perms["apply_user_permissions"].get(ptype, 1) | perms["apply_user_permissions"][ptype] = (perms["apply_user_permissions"].get(ptype, 1) | ||||
and p.get("apply_user_permissions")) | and p.get("apply_user_permissions")) | ||||
if p.apply_user_permissions and p.user_permission_doctypes: | |||||
# set user_permission_doctypes in perms | |||||
user_permission_doctypes = json.loads(p.user_permission_doctypes) | |||||
if p.apply_user_permissions: | |||||
if p.user_permission_doctypes: | |||||
# set user_permission_doctypes in perms | |||||
user_permission_doctypes = json.loads(p.user_permission_doctypes) | |||||
if user_permission_doctypes: | |||||
# perms["user_permission_doctypes"][ptype] would be a list of list like [["User", "Blog Post"], ["User"]] | |||||
for ptype in rights: | |||||
if p.get(ptype): | |||||
perms["user_permission_doctypes"].setdefault(ptype, []).append(user_permission_doctypes) | |||||
else: | |||||
user_permission_doctypes = get_linked_doctypes(meta.name) | |||||
if user_permission_doctypes: | |||||
# perms["user_permission_doctypes"][ptype] would be a list of list like [["User", "Blog Post"], ["User"]] | |||||
for ptype in rights: | |||||
if p.get(ptype): | |||||
perms["user_permission_doctypes"].setdefault(ptype, []).append(user_permission_doctypes) | |||||
for key, value in perms.get("apply_user_permissions").items(): | for key, value in perms.get("apply_user_permissions").items(): | ||||
if not value: | if not value: | ||||
@@ -285,3 +289,12 @@ def reset_perms(doctype): | |||||
frappe.db.sql("""delete from tabDocPerm where parent=%s""", doctype) | frappe.db.sql("""delete from tabDocPerm where parent=%s""", doctype) | ||||
frappe.reload_doc(frappe.db.get_value("DocType", doctype, "module"), | frappe.reload_doc(frappe.db.get_value("DocType", doctype, "module"), | ||||
"DocType", doctype, force=True) | "DocType", doctype, force=True) | ||||
def get_linked_doctypes(dt): | |||||
return list(set([dt] + [d.options for d in | |||||
frappe.get_meta(dt).get("fields", { | |||||
"fieldtype":"Link", | |||||
"ignore_user_permissions":("!=", 1), | |||||
"options": ("!=", "[Select]") | |||||
}) | |||||
])) |
@@ -68,6 +68,11 @@ $.extend(frappe.meta, { | |||||
return docfields; | return docfields; | ||||
}, | }, | ||||
get_linked_fields: function(doctype) { | |||||
return $.map(frappe.get_meta(doctype).fields, | |||||
function(d) { return d.fieldtype=="Link" ? d.options : null; }); | |||||
}, | |||||
get_fields_to_check_permissions: function(doctype, name, user_permission_doctypes) { | get_fields_to_check_permissions: function(doctype, name, user_permission_doctypes) { | ||||
var fields = $.map(frappe.meta.get_docfields(doctype, name), function(df) { | var fields = $.map(frappe.meta.get_docfields(doctype, name), function(df) { | ||||
return (df.fieldtype==="Link" && df.ignore_user_permissions!==1 && | return (df.fieldtype==="Link" && df.ignore_user_permissions!==1 && | ||||
@@ -151,14 +151,19 @@ $.extend(frappe.perm, { | |||||
var user_permissions = frappe.defaults.get_user_permissions(); | var user_permissions = frappe.defaults.get_user_permissions(); | ||||
if(user_permissions && !$.isEmptyObject(user_permissions)) { | if(user_permissions && !$.isEmptyObject(user_permissions)) { | ||||
var user_permission_doctypes = me.get_user_permission_doctypes(perm[0].user_permission_doctypes[ptype], | |||||
user_permissions); | |||||
if(perm[0].user_permission_doctypes) { | |||||
var user_permission_doctypes = me.get_user_permission_doctypes(perm[0].user_permission_doctypes[ptype], | |||||
user_permissions); | |||||
} else { | |||||
// json is not set, so give list of all doctypes | |||||
var user_permission_doctypes = [[doctype].concat(frappe.meta.get_linked_fields(doctype))]; | |||||
} | |||||
$.each(user_permission_doctypes, function(i, doctypes) { | $.each(user_permission_doctypes, function(i, doctypes) { | ||||
var rules = {}; | var rules = {}; | ||||
var fields_to_check = frappe.meta.get_fields_to_check_permissions(doctype, null, doctypes); | var fields_to_check = frappe.meta.get_fields_to_check_permissions(doctype, null, doctypes); | ||||
$.each(fields_to_check, function(i, df) { | $.each(fields_to_check, function(i, df) { | ||||
rules[df.label] = user_permissions[df.options]; | |||||
rules[df.label] = user_permissions[df.options] || []; | |||||
}); | }); | ||||
if (!$.isEmptyObject(rules)) { | if (!$.isEmptyObject(rules)) { | ||||
match_rules.push(rules); | match_rules.push(rules); | ||||