Fix user permission checks

This commit is contained in:
Suraj Shetty
2018-12-10 19:10:18 +05:30
parent 64b4d98778
commit 07e5786e1b
5 changed files with 56 additions and 27 deletions

View File

@@ -151,10 +151,8 @@ def get_default_price_list(party):
def set_price_list(out, party, party_type, given_price_list): def set_price_list(out, party, party_type, given_price_list):
# price list # price list
price_list = filter(None, get_user_permissions() price_list = [d.get('doc') for d in get_user_permissions().get('Price List', []) \
.get("Price List", {}) if d.get('doc')]
.get("docs", []))
price_list = list(price_list)
if price_list: if price_list:
price_list = price_list[0] price_list = price_list[0]

View File

@@ -83,7 +83,7 @@ frappe.ui.form.on("Leave Application", {
if (!frm.doc.employee && frappe.defaults.get_user_permissions()) { if (!frm.doc.employee && frappe.defaults.get_user_permissions()) {
const perm = frappe.defaults.get_user_permissions(); const perm = frappe.defaults.get_user_permissions();
if (perm && perm['Employee']) { if (perm && perm['Employee']) {
frm.set_value('employee', perm['Employee']["docs"][0]) frm.set_value('employee', perm['Employee'].map(perm_doc => perm_doc.doc)[0]);
} }
} }
}, },

View File

@@ -1,15 +1,11 @@
import frappe import frappe
from frappe.desk.form.linked_with import get_linked_doctypes
# Skips user permission check for doctypes where department link field was recently added # Skips user permission check for doctypes where department link field was recently added
# https://github.com/frappe/erpnext/pull/14121 # https://github.com/frappe/erpnext/pull/14121
def execute(): def execute():
user_permissions = frappe.get_all("User Permission",
filters=[['allow', '=', 'Department']],
fields=['name', 'skip_for_doctype'])
doctypes_to_skip = [] doctypes_to_skip = []
for doctype in ['Appraisal', 'Leave Allocation', 'Expense Claim', 'Instructor', 'Salary Slip', for doctype in ['Appraisal', 'Leave Allocation', 'Expense Claim', 'Instructor', 'Salary Slip',
'Attendance', 'Training Feedback', 'Training Result Employee', 'Attendance', 'Training Feedback', 'Training Result Employee',
'Leave Application', 'Employee Advance', 'Activity Cost', 'Training Event Employee', 'Leave Application', 'Employee Advance', 'Activity Cost', 'Training Event Employee',
@@ -17,12 +13,48 @@ def execute():
if frappe.db.exists('Custom Field', { 'dt': doctype, 'fieldname': 'department'}): continue if frappe.db.exists('Custom Field', { 'dt': doctype, 'fieldname': 'department'}): continue
doctypes_to_skip.append(doctype) doctypes_to_skip.append(doctype)
for perm in user_permissions: frappe.reload_doctype('User Permission')
skip_for_doctype = perm.get('skip_for_doctype')
skip_for_doctype = skip_for_doctype.split('\n') + doctypes_to_skip user_permissions = frappe.get_all("User Permission",
skip_for_doctype = set(skip_for_doctype) # to remove duplicates filters=[['allow', '=', 'Department'], ['applicable_for', 'in', [None] + doctypes_to_skip]],
skip_for_doctype = '\n'.join(skip_for_doctype) # convert back to string fields=['name', 'applicable_for'])
frappe.set_value('User Permission', perm.name, 'skip_for_doctype', skip_for_doctype) user_permissions_to_delete = []
new_user_permissions_list = []
for user_permission in user_permissions:
if user_permission.applicable_for:
# simply delete user permission record since it needs to be skipped.
user_permissions_to_delete.append(user_permission.name)
else:
# if applicable_for is `None` it means that user permission is applicable for every doctype
# to avoid this we need to create other user permission records and only skip the listed doctypes in this patch
linked_doctypes = get_linked_doctypes(user_permission.allow, True).keys()
applicable_for_doctypes = list(set(linked_doctypes) - set(doctypes_to_skip))
user_permissions_to_delete.append(user_permission.name)
for doctype in applicable_for_doctypes:
if doctype:
# Maintain sequence (name, user, allow, for_value, applicable_for, apply_to_all_doctypes)
new_user_permissions_list.append((
frappe.generate_hash("", 10),
user_permission.user,
user_permission.allow,
user_permission.for_value,
doctype,
0
))
if new_user_permissions_list:
frappe.db.sql('''
INSERT INTO `tabUser Permission`
(`name`, `user`, `allow`, `for_value`, `applicable_for`, `apply_to_all_doctypes`)
VALUES {}'''.format(', '.join(['%s'] * len(new_user_permissions_list))),
tuple(new_user_permissions_list)
)
if user_permissions_to_delete:
frappe.db.sql('DELETE FROM `tabUser Permission` WHERE `name` IN ({})'.format(
','.join(['%s'] * len(user_permissions_to_delete))
), tuple(user_permissions_to_delete))

View File

@@ -217,7 +217,7 @@ $.extend(erpnext.utils, {
let unscrub_option = frappe.model.unscrub(option); let unscrub_option = frappe.model.unscrub(option);
let user_permission = frappe.defaults.get_user_permissions(); let user_permission = frappe.defaults.get_user_permissions();
if(user_permission && user_permission[unscrub_option]) { if(user_permission && user_permission[unscrub_option]) {
return user_permission[unscrub_option]["docs"]; return user_permission[unscrub_option].map(perm => perm.doc);
} else { } else {
return $.map(locals[`:${unscrub_option}`], function(c) { return c.name; }).sort(); return $.map(locals[`:${unscrub_option}`], function(c) { return c.name; }).sort();
} }

View File

@@ -87,9 +87,8 @@ def validate_filters(filters):
def get_warehouse_list(filters): def get_warehouse_list(filters):
from frappe.defaults import get_user_permissions from frappe.defaults import get_user_permissions
condition = '' condition = ''
user_permitted_warehouse = filter(None, get_user_permissions() user_permitted_warehouse = [d.get('doc') for d in get_user_permissions().get('Warehouse', []) \
.get("Warehouse", {}) if d.get('doc')]
.get("docs", []))
value = () value = ()
if user_permitted_warehouse: if user_permitted_warehouse:
condition = "and name in %s" condition = "and name in %s"