diff --git a/frappe/core/page/permission_manager/permission_manager.py b/frappe/core/page/permission_manager/permission_manager.py index d39365812c..0dfd3f222a 100644 --- a/frappe/core/page/permission_manager/permission_manager.py +++ b/frappe/core/page/permission_manager/permission_manager.py @@ -7,7 +7,7 @@ import frappe.defaults from frappe.modules.import_file import get_file_path, read_doc_from_file from frappe.translate import send_translations 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() 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 ""), 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 = {} for d in out: d.linked_doctypes = linked_doctypes.setdefault(d.parent, get_linked_doctypes(d.parent)) diff --git a/frappe/permissions.py b/frappe/permissions.py index 05c9c24416..6b20bd8037 100644 --- a/frappe/permissions.py +++ b/frappe/permissions.py @@ -119,15 +119,19 @@ def get_role_permissions(meta, user=None): perms["apply_user_permissions"][ptype] = (perms["apply_user_permissions"].get(ptype, 1) 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(): if not value: @@ -285,3 +289,12 @@ def reset_perms(doctype): frappe.db.sql("""delete from tabDocPerm where parent=%s""", doctype) frappe.reload_doc(frappe.db.get_value("DocType", doctype, "module"), "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]") + }) + ])) diff --git a/frappe/public/js/frappe/model/meta.js b/frappe/public/js/frappe/model/meta.js index 5f7304afc0..d2497b2dbc 100644 --- a/frappe/public/js/frappe/model/meta.js +++ b/frappe/public/js/frappe/model/meta.js @@ -68,6 +68,11 @@ $.extend(frappe.meta, { 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) { var fields = $.map(frappe.meta.get_docfields(doctype, name), function(df) { return (df.fieldtype==="Link" && df.ignore_user_permissions!==1 && diff --git a/frappe/public/js/frappe/model/perm.js b/frappe/public/js/frappe/model/perm.js index 01b1d1ffb8..06084b7144 100644 --- a/frappe/public/js/frappe/model/perm.js +++ b/frappe/public/js/frappe/model/perm.js @@ -151,14 +151,19 @@ $.extend(frappe.perm, { var user_permissions = frappe.defaults.get_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) { var rules = {}; var fields_to_check = frappe.meta.get_fields_to_check_permissions(doctype, null, doctypes); $.each(fields_to_check, function(i, df) { - rules[df.label] = user_permissions[df.options]; + rules[df.label] = user_permissions[df.options] || []; }); if (!$.isEmptyObject(rules)) { match_rules.push(rules);