@@ -141,27 +141,26 @@ class DocType: | |||||
def make_amendable(self): | def make_amendable(self): | ||||
""" | """ | ||||
if is_submittable is set, add amended_from | |||||
docfields | |||||
if is_submittable is set, add amended_from docfields | |||||
""" | """ | ||||
if self.doc.is_submittable: | if self.doc.is_submittable: | ||||
import webnotes.model.doctype | |||||
temp_doclist = webnotes.model.doctype.get(self.doc.name) | |||||
max_idx = max([d.idx for d in temp_doclist if d.idx]) | |||||
max_idx = max_idx and max_idx or 0 | |||||
if 'amended_from' not in [d.fieldname for d in temp_doclist if \ | |||||
d.doctype=='DocField']: | |||||
new = self.doc.addchild('fields', 'DocField', self.doclist) | |||||
new.label = 'Amended From' | |||||
new.fieldtype = 'Link' | |||||
new.fieldname = 'amended_from' | |||||
new.options = self.doc.name | |||||
new.permlevel = 0 | |||||
new.read_only = 1 | |||||
new.print_hide = 1 | |||||
new.no_copy = 1 | |||||
new.idx = max_idx + 1 | |||||
max_idx += 1 | |||||
if not webnotes.conn.sql("""select name from tabDocField | |||||
where fieldname = 'amended_from' and parent = %s""", self.doc.name): | |||||
new = self.doc.addchild('fields', 'DocField', self.doclist) | |||||
new.label = 'Amended From' | |||||
new.fieldtype = 'Link' | |||||
new.fieldname = 'amended_from' | |||||
new.options = self.doc.name | |||||
new.permlevel = 0 | |||||
new.read_only = 1 | |||||
new.print_hide = 1 | |||||
new.no_copy = 1 | |||||
new.idx = self.get_max_idx() + 1 | |||||
def get_max_idx(self): | |||||
max_idx = webnotes.conn.sql("""select max(idx) from `tabDocField` where parent = %s""", | |||||
self.doc.name) | |||||
return max_idx and max_idx[0][0] or 0 | |||||
def validate_fields_for_doctype(doctype): | def validate_fields_for_doctype(doctype): | ||||
from webnotes.model.doctype import get | from webnotes.model.doctype import get | ||||
@@ -1,5 +1,6 @@ | |||||
from __future__ import unicode_literals | from __future__ import unicode_literals | ||||
import webnotes | import webnotes | ||||
import webnotes.defaults | |||||
@webnotes.whitelist(allow_roles=["System Manager", "Administrator"]) | @webnotes.whitelist(allow_roles=["System Manager", "Administrator"]) | ||||
def get_roles_and_doctypes(): | def get_roles_and_doctypes(): | ||||
@@ -22,8 +23,13 @@ def get_permissions(doctype=None, role=None): | |||||
@webnotes.whitelist(allow_roles=["System Manager", "Administrator"]) | @webnotes.whitelist(allow_roles=["System Manager", "Administrator"]) | ||||
def remove(doctype, name): | def remove(doctype, name): | ||||
match = webnotes.conn.get_value("DocPerm", name, "match") | |||||
webnotes.conn.sql("""delete from tabDocPerm where name=%s""", name) | webnotes.conn.sql("""delete from tabDocPerm where name=%s""", name) | ||||
validate_and_reset(doctype, for_remove=True) | validate_and_reset(doctype, for_remove=True) | ||||
if match: | |||||
webnotes.defaults.clear_cache() | |||||
@webnotes.whitelist(allow_roles=["System Manager", "Administrator"]) | @webnotes.whitelist(allow_roles=["System Manager", "Administrator"]) | ||||
def add(parent, role, permlevel): | def add(parent, role, permlevel): | ||||
@@ -46,11 +52,15 @@ def update(name, doctype, ptype, value=0): | |||||
% (ptype, '%s', '%s'), (value, name)) | % (ptype, '%s', '%s'), (value, name)) | ||||
validate_and_reset(doctype) | validate_and_reset(doctype) | ||||
if ptype == "read" and webnotes.conn.get_value("DocPerm", name, "match"): | |||||
webnotes.defaults.clear_cache() | |||||
@webnotes.whitelist(allow_roles=["System Manager", "Administrator"]) | @webnotes.whitelist(allow_roles=["System Manager", "Administrator"]) | ||||
def update_match(name, doctype, match=""): | def update_match(name, doctype, match=""): | ||||
webnotes.conn.sql("""update tabDocPerm set `match`=%s where name=%s""", | webnotes.conn.sql("""update tabDocPerm set `match`=%s where name=%s""", | ||||
(match, name)) | (match, name)) | ||||
validate_and_reset(doctype) | validate_and_reset(doctype) | ||||
webnotes.defaults.clear_cache() | |||||
def validate_and_reset(doctype, for_remove=False): | def validate_and_reset(doctype, for_remove=False): | ||||
from core.doctype.doctype.doctype import validate_permissions_for_doctype | from core.doctype.doctype.doctype import validate_permissions_for_doctype | ||||
@@ -61,6 +71,7 @@ def validate_and_reset(doctype, for_remove=False): | |||||
def reset(doctype): | def reset(doctype): | ||||
webnotes.reset_perms(doctype) | webnotes.reset_perms(doctype) | ||||
webnotes.clear_cache(doctype=doctype) | webnotes.clear_cache(doctype=doctype) | ||||
webnotes.defaults.clear_cache() | |||||
@webnotes.whitelist(allow_roles=["System Manager", "Administrator"]) | @webnotes.whitelist(allow_roles=["System Manager", "Administrator"]) | ||||
def get_users_with_role(role): | def get_users_with_role(role): | ||||
@@ -54,17 +54,18 @@ $.extend(wn.user, { | |||||
} | } | ||||
}); | }); | ||||
} | } | ||||
if(!modules_list || !modules_list.length) { | |||||
// all modules | |||||
modules_list = keys(wn.modules).sort(); | |||||
} | |||||
// filter hidden modules | // filter hidden modules | ||||
if(wn.boot.hidden_modules && modules_list) { | if(wn.boot.hidden_modules && modules_list) { | ||||
var hidden_list = JSON.parse(wn.boot.hidden_modules); | var hidden_list = JSON.parse(wn.boot.hidden_modules); | ||||
var modules_list = $.map(modules_list, function(m) { | var modules_list = $.map(modules_list, function(m) { | ||||
if(hidden_list.indexOf(m)==-1) return m; else return null; | if(hidden_list.indexOf(m)==-1) return m; else return null; | ||||
}); | }); | ||||
} | |||||
if(!modules_list || !modules_list.length) { | |||||
// all modules | |||||
modules_list = keys(wn.modules).sort(); | |||||
} | } | ||||
// hide based on permission | // hide based on permission | ||||
@@ -276,8 +276,10 @@ def has_permission(doctype, ptype="read", doc=None): | |||||
# no valid permission found | # no valid permission found | ||||
if match_failed: | if match_failed: | ||||
key = match_failed.keys()[0] | |||||
msgprint(_("Not allowed for: ") + key + "=" + match_failed[key]) | |||||
msg = _("Not allowed for: ") | |||||
for key in match_failed: | |||||
msg += "\n" + key + " = " + (match_failed[key] or "None") | |||||
msgprint(msg) | |||||
return False | return False | ||||
else: | else: | ||||
return perms and True or False | return perms and True or False | ||||
@@ -115,11 +115,29 @@ def get_defaults_for(parent="Control Panel"): | |||||
defaults[d.defkey].append(d.defvalue) | defaults[d.defkey].append(d.defvalue) | ||||
else: | else: | ||||
defaults[d.defkey] = d.defvalue | defaults[d.defkey] = d.defvalue | ||||
if webnotes.session and parent == webnotes.session.user: | |||||
defaults.update(get_defaults_for_match(defaults)) | |||||
webnotes.cache().set_value("__defaults:" + parent, defaults) | webnotes.cache().set_value("__defaults:" + parent, defaults) | ||||
return defaults | return defaults | ||||
def get_defaults_for_match(userd): | |||||
""" if a profile based match condition exists for a user's role | |||||
and no user property is specified for that match key, | |||||
set default value as user's profile for that match key""" | |||||
user_roles = webnotes.get_roles() | |||||
out = {} | |||||
for role, match in webnotes.conn.sql("""select distinct role, `match` | |||||
from `tabDocPerm` where ifnull(permlevel, 0)=0 and `read`=1 | |||||
and `match` like "%:user" """): | |||||
if role in user_roles and match.split(":")[0] not in userd: | |||||
out[match.split(":")[0]] = webnotes.session.user | |||||
return out | |||||
def clear_cache(parent=None): | def clear_cache(parent=None): | ||||
def all_profiles(): | def all_profiles(): | ||||
return webnotes.conn.sql_list("select name from tabProfile") + ["Control Panel"] | return webnotes.conn.sql_list("select name from tabProfile") + ["Control Panel"] | ||||