Browse Source

[perm] fixes for user permissions

version-14
Rushabh Mehta 10 years ago
parent
commit
99c55650cf
4 changed files with 35 additions and 21 deletions
  1. +1
    -10
      frappe/core/page/permission_manager/permission_manager.py
  2. +21
    -8
      frappe/permissions.py
  3. +5
    -0
      frappe/public/js/frappe/model/meta.js
  4. +8
    -3
      frappe/public/js/frappe/model/perm.js

+ 1
- 10
frappe/core/page/permission_manager/permission_manager.py View File

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


+ 21
- 8
frappe/permissions.py View File

@@ -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]")
})
]))

+ 5
- 0
frappe/public/js/frappe/model/meta.js View File

@@ -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 &&


+ 8
- 3
frappe/public/js/frappe/model/perm.js View File

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


Loading…
Cancel
Save