Merge pull request #2115 from anandpdoshi/user-permission-doctypes

HR permissions, translations
This commit is contained in:
Anand Doshi 2014-08-29 11:55:51 +05:30
commit c90773cc85
16 changed files with 287 additions and 308 deletions

View File

@ -11,8 +11,12 @@ erpnext.hr.EmployeeController = frappe.ui.form.Controller.extend({
}, },
onload: function() { onload: function() {
this.setup_leave_approver_select();
if(this.frm.doc.__islocal) this.frm.set_value("employee_name", ""); if(this.frm.doc.__islocal) this.frm.set_value("employee_name", "");
this.frm.set_query("leave_approver", "employee_leave_approvers", function() {
return {
filters: [["UserRole", "role", "=", "Leave Approver"]]
}
});
}, },
refresh: function() { refresh: function() {
@ -25,21 +29,6 @@ erpnext.hr.EmployeeController = frappe.ui.form.Controller.extend({
} }
}, },
setup_leave_approver_select: function() {
var me = this;
return this.frm.call({
method: "erpnext.hr.utils.get_leave_approver_list",
callback: function(r) {
var df = frappe.meta.get_docfield("Employee Leave Approver", "leave_approver",
me.frm.doc.name);
df.options = $.map(r.message, function(user) {
return {value: user, label: frappe.user_info(user).fullname};
});
me.frm.fields_dict.employee_leave_approvers.refresh();
}
});
},
date_of_birth: function() { date_of_birth: function() {
return cur_frm.call({ return cur_frm.call({
method: "get_retirement_date", method: "get_retirement_date",

View File

@ -1,5 +1,5 @@
{ {
"allow_import": 1, "allow_import": 1,
"allow_rename": 1, "allow_rename": 1,
"autoname": "naming_series:", "autoname": "naming_series:",
"creation": "2013-03-07 09:04:18", "creation": "2013-03-07 09:04:18",
@ -172,6 +172,7 @@
{ {
"fieldname": "employment_type", "fieldname": "employment_type",
"fieldtype": "Link", "fieldtype": "Link",
"ignore_user_permissions": 1,
"in_filter": 1, "in_filter": 1,
"in_list_view": 1, "in_list_view": 1,
"label": "Employment Type", "label": "Employment Type",
@ -185,6 +186,7 @@
"description": "Applicable Holiday List", "description": "Applicable Holiday List",
"fieldname": "holiday_list", "fieldname": "holiday_list",
"fieldtype": "Link", "fieldtype": "Link",
"ignore_user_permissions": 1,
"label": "Holiday List", "label": "Holiday List",
"oldfieldname": "holiday_list", "oldfieldname": "holiday_list",
"oldfieldtype": "Link", "oldfieldtype": "Link",
@ -672,7 +674,7 @@
], ],
"icon": "icon-user", "icon": "icon-user",
"idx": 1, "idx": 1,
"modified": "2014-05-27 07:34:49.337586", "modified": "2014-08-27 05:55:00.514660",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Employee", "name": "Employee",
@ -704,6 +706,7 @@
"report": 1, "report": 1,
"role": "HR User", "role": "HR User",
"submit": 0, "submit": 0,
"user_permission_doctypes": "[\"Branch\",\"Company\",\"Department\",\"Designation\"]",
"write": 1 "write": 1
}, },
{ {
@ -719,12 +722,6 @@
"set_user_permissions": 1, "set_user_permissions": 1,
"submit": 0, "submit": 0,
"write": 1 "write": 1
},
{
"apply_user_permissions": 1,
"permlevel": 0,
"read": 1,
"role": "Leave Approver"
} }
], ],
"search_fields": "employee_name", "search_fields": "employee_name",

View File

@ -50,21 +50,11 @@ class Employee(Document):
self.update_user_permissions() self.update_user_permissions()
self.update_dob_event() self.update_dob_event()
self.update_leave_approver_user_permissions()
def update_user_permissions(self): def update_user_permissions(self):
frappe.permissions.add_user_permission("Employee", self.name, self.user_id) frappe.permissions.add_user_permission("Employee", self.name, self.user_id)
frappe.permissions.set_user_permission_if_allowed("Company", self.company, self.user_id) frappe.permissions.set_user_permission_if_allowed("Company", self.company, self.user_id)
def update_leave_approver_user_permissions(self):
"""add employee user permission for leave approver"""
employee_leave_approvers = [d.leave_approver for d in self.get("employee_leave_approvers")]
if self.reports_to and self.reports_to not in employee_leave_approvers:
employee_leave_approvers.append(frappe.db.get_value("Employee", self.reports_to, "user_id"))
for user in employee_leave_approvers:
frappe.permissions.add_user_permission("Employee", self.name, user)
def update_user(self): def update_user(self):
# add employee role if missing # add employee role if missing
user = frappe.get_doc("User", self.user_id) user = frappe.get_doc("User", self.user_id)

View File

@ -8,10 +8,11 @@
"fields": [ "fields": [
{ {
"fieldname": "leave_approver", "fieldname": "leave_approver",
"fieldtype": "Select", "fieldtype": "Link",
"ignore_user_permissions": 1,
"in_list_view": 1, "in_list_view": 1,
"label": "Leave Approver", "label": "Leave Approver",
"options": "[Select]", "options": "User",
"permlevel": 0, "permlevel": 0,
"print_hide": 1, "print_hide": 1,
"reqd": 1, "reqd": 1,
@ -20,7 +21,7 @@
], ],
"idx": 1, "idx": 1,
"istable": 1, "istable": 1,
"modified": "2014-05-15 19:32:14.134420", "modified": "2014-08-27 06:21:36.887205",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Employee Leave Approver", "name": "Employee Leave Approver",

View File

@ -57,14 +57,12 @@ cur_frm.cscript.onload = function(doc,cdt,cdn) {
return{ return{
query: "erpnext.controllers.queries.employee_query" query: "erpnext.controllers.queries.employee_query"
} }
} };
var exp_approver = doc.exp_approver;
return cur_frm.call({ cur_frm.set_query("exp_approver", function() {
method: "erpnext.hr.utils.get_expense_approver_list", return {
callback: function(r) { filters: [["UserRole", "role", "=", "Expense Approver"]]
cur_frm.set_df_property("exp_approver", "options", r.message); };
if(exp_approver) cur_frm.set_value("exp_approver", exp_approver);
}
}); });
} }

View File

@ -20,11 +20,13 @@
"search_index": 1 "search_index": 1
}, },
{ {
"description": "A user with \"Expense Approver\" role",
"fieldname": "exp_approver", "fieldname": "exp_approver",
"fieldtype": "Select", "fieldtype": "Link",
"label": "Approver", "label": "Approver",
"oldfieldname": "exp_approver", "oldfieldname": "exp_approver",
"oldfieldtype": "Select", "oldfieldtype": "Select",
"options": "User",
"permlevel": 0, "permlevel": 0,
"width": "160px" "width": "160px"
}, },
@ -188,7 +190,7 @@
"icon": "icon-money", "icon": "icon-money",
"idx": 1, "idx": 1,
"is_submittable": 1, "is_submittable": 1,
"modified": "2014-06-23 07:55:48.580747", "modified": "2014-08-27 07:08:48.454580",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Expense Claim", "name": "Expense Claim",
@ -204,6 +206,7 @@
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Employee", "role": "Employee",
"user_permission_doctypes": "[\"Company\",\"Employee\",\"Expense Claim\",\"Fiscal Year\"]",
"write": 1 "write": 1
}, },
{ {
@ -219,6 +222,7 @@
"report": 1, "report": 1,
"role": "Expense Approver", "role": "Expense Approver",
"submit": 1, "submit": 1,
"user_permission_doctypes": "[\"Expense Claim\",\"User\"]",
"write": 1 "write": 1
}, },
{ {
@ -234,6 +238,7 @@
"report": 1, "report": 1,
"role": "HR User", "role": "HR User",
"submit": 1, "submit": 1,
"user_permission_doctypes": "[\"Company\",\"Expense Claim\",\"Fiscal Year\"]",
"write": 1 "write": 1
} }
], ],

View File

@ -0,0 +1,10 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors and Contributors
# See license.txt
import frappe
import unittest
test_records = frappe.get_test_records('Expense Claim')
class TestExpenseClaim(unittest.TestCase):
pass

View File

@ -0,0 +1 @@
[]

View File

@ -11,20 +11,13 @@ cur_frm.cscript.onload = function(doc, dt, dn) {
cur_frm.cscript.calculate_total_days(doc, dt, dn); cur_frm.cscript.calculate_total_days(doc, dt, dn);
} }
var leave_approver = doc.leave_approver; cur_frm.set_query("leave_approver", function() {
return cur_frm.call({ return {
method: "erpnext.hr.utils.get_leave_approver_list", filters: [["UserRole", "role", "=", "Leave Approver"]]
callback: function(r) { };
cur_frm.set_df_property("leave_approver", "options", $.map(r.message,
function(user) {
return {value: user, label: frappe.user_info(user).fullname};
}));
if(leave_approver) cur_frm.set_value("leave_approver", leave_approver);
cur_frm.cscript.get_leave_balance(cur_frm.doc);
}
}); });
cur_frm.cscript.get_leave_balance(cur_frm.doc);
} }
cur_frm.cscript.refresh = function(doc, dt, dn) { cur_frm.cscript.refresh = function(doc, dt, dn) {

View File

@ -1,285 +1,294 @@
{ {
"autoname": "LAP/.#####", "autoname": "LAP/.#####",
"creation": "2013-02-20 11:18:11", "creation": "2013-02-20 11:18:11",
"description": "Apply / Approve Leaves", "description": "Apply / Approve Leaves",
"docstatus": 0, "docstatus": 0,
"doctype": "DocType", "doctype": "DocType",
"document_type": "Transaction", "document_type": "Transaction",
"fields": [ "fields": [
{ {
"default": "Open", "default": "Open",
"fieldname": "status", "fieldname": "status",
"fieldtype": "Select", "fieldtype": "Select",
"in_list_view": 1, "in_list_view": 1,
"label": "Status", "label": "Status",
"no_copy": 1, "no_copy": 1,
"options": "Open\nApproved\nRejected", "options": "Open\nApproved\nRejected",
"permlevel": 1 "permlevel": 1
}, },
{ {
"description": "Leave can be approved by users with Role, \"Leave Approver\"", "description": "Leave can be approved by users with Role, \"Leave Approver\"",
"fieldname": "leave_approver", "fieldname": "leave_approver",
"fieldtype": "Select", "fieldtype": "Link",
"label": "Leave Approver", "label": "Leave Approver",
"options": "[Select]", "options": "User",
"permlevel": 0 "permlevel": 0
}, },
{ {
"fieldname": "leave_type", "fieldname": "leave_type",
"fieldtype": "Link", "fieldtype": "Link",
"in_filter": 1, "ignore_user_permissions": 1,
"in_list_view": 1, "in_filter": 1,
"label": "Leave Type", "in_list_view": 1,
"options": "Leave Type", "label": "Leave Type",
"permlevel": 0, "options": "Leave Type",
"reqd": 1, "permlevel": 0,
"reqd": 1,
"search_index": 1 "search_index": 1
}, },
{ {
"fieldname": "from_date", "fieldname": "from_date",
"fieldtype": "Date", "fieldtype": "Date",
"in_list_view": 1, "in_list_view": 1,
"label": "From Date", "label": "From Date",
"permlevel": 0, "permlevel": 0,
"reqd": 1, "reqd": 1,
"search_index": 1 "search_index": 1
}, },
{ {
"fieldname": "to_date", "fieldname": "to_date",
"fieldtype": "Date", "fieldtype": "Date",
"in_list_view": 0, "in_list_view": 0,
"label": "To Date", "label": "To Date",
"permlevel": 0, "permlevel": 0,
"reqd": 1, "reqd": 1,
"search_index": 1 "search_index": 1
}, },
{ {
"fieldname": "half_day", "fieldname": "half_day",
"fieldtype": "Check", "fieldtype": "Check",
"label": "Half Day", "label": "Half Day",
"permlevel": 0 "permlevel": 0
}, },
{ {
"fieldname": "column_break1", "fieldname": "column_break1",
"fieldtype": "Column Break", "fieldtype": "Column Break",
"permlevel": 0, "permlevel": 0,
"print_width": "50%", "print_width": "50%",
"width": "50%" "width": "50%"
}, },
{ {
"fieldname": "description", "fieldname": "description",
"fieldtype": "Small Text", "fieldtype": "Small Text",
"label": "Reason", "label": "Reason",
"permlevel": 0 "permlevel": 0
}, },
{ {
"fieldname": "employee", "fieldname": "employee",
"fieldtype": "Link", "fieldtype": "Link",
"in_filter": 1, "in_filter": 1,
"label": "Employee", "label": "Employee",
"options": "Employee", "options": "Employee",
"permlevel": 0, "permlevel": 0,
"reqd": 1, "reqd": 1,
"search_index": 1 "search_index": 1
}, },
{ {
"fieldname": "employee_name", "fieldname": "employee_name",
"fieldtype": "Data", "fieldtype": "Data",
"in_filter": 1, "in_filter": 1,
"in_list_view": 1, "in_list_view": 1,
"label": "Employee Name", "label": "Employee Name",
"permlevel": 0, "permlevel": 0,
"read_only": 1, "read_only": 1,
"search_index": 0 "search_index": 0
}, },
{ {
"fieldname": "leave_balance", "fieldname": "leave_balance",
"fieldtype": "Float", "fieldtype": "Float",
"label": "Leave Balance Before Application", "label": "Leave Balance Before Application",
"no_copy": 1, "no_copy": 1,
"permlevel": 0, "permlevel": 0,
"read_only": 1 "read_only": 1
}, },
{ {
"fieldname": "total_leave_days", "fieldname": "total_leave_days",
"fieldtype": "Float", "fieldtype": "Float",
"label": "Total Leave Days", "label": "Total Leave Days",
"no_copy": 1, "no_copy": 1,
"permlevel": 0, "permlevel": 0,
"read_only": 1 "read_only": 1
}, },
{ {
"fieldname": "sb10", "fieldname": "sb10",
"fieldtype": "Section Break", "fieldtype": "Section Break",
"label": "More Info", "label": "More Info",
"permlevel": 0 "permlevel": 0
}, },
{ {
"allow_on_submit": 1, "allow_on_submit": 1,
"default": "1", "default": "1",
"fieldname": "follow_via_email", "fieldname": "follow_via_email",
"fieldtype": "Check", "fieldtype": "Check",
"label": "Follow via Email", "label": "Follow via Email",
"permlevel": 0, "permlevel": 0,
"print_hide": 1 "print_hide": 1
}, },
{ {
"default": "Today", "default": "Today",
"fieldname": "posting_date", "fieldname": "posting_date",
"fieldtype": "Date", "fieldtype": "Date",
"label": "Posting Date", "label": "Posting Date",
"no_copy": 1, "no_copy": 1,
"permlevel": 0, "permlevel": 0,
"reqd": 1 "reqd": 1
}, },
{ {
"fieldname": "fiscal_year", "fieldname": "fiscal_year",
"fieldtype": "Link", "fieldtype": "Link",
"in_filter": 1, "in_filter": 1,
"label": "Fiscal Year", "label": "Fiscal Year",
"options": "Fiscal Year", "options": "Fiscal Year",
"permlevel": 0, "permlevel": 0,
"read_only": 0, "read_only": 0,
"reqd": 1, "reqd": 1,
"search_index": 0 "search_index": 0
}, },
{ {
"fieldname": "column_break_17", "fieldname": "column_break_17",
"fieldtype": "Column Break", "fieldtype": "Column Break",
"permlevel": 0 "permlevel": 0
}, },
{ {
"fieldname": "company", "fieldname": "company",
"fieldtype": "Link", "fieldtype": "Link",
"label": "Company", "label": "Company",
"options": "Company", "options": "Company",
"permlevel": 0, "permlevel": 0,
"reqd": 1 "reqd": 1
}, },
{ {
"fieldname": "letter_head", "fieldname": "letter_head",
"fieldtype": "Link", "fieldtype": "Link",
"label": "Letter Head", "ignore_user_permissions": 1,
"options": "Letter Head", "label": "Letter Head",
"permlevel": 0, "options": "Letter Head",
"print_hide": 1, "permlevel": 0,
"print_hide": 1,
"read_only": 0 "read_only": 0
}, },
{ {
"fieldname": "amended_from", "fieldname": "amended_from",
"fieldtype": "Link", "fieldtype": "Link",
"ignore_user_permissions": 1, "ignore_user_permissions": 1,
"label": "Amended From", "label": "Amended From",
"no_copy": 1, "no_copy": 1,
"options": "Leave Application", "options": "Leave Application",
"permlevel": 0, "permlevel": 0,
"print_hide": 1, "print_hide": 1,
"read_only": 1 "read_only": 1
} }
], ],
"icon": "icon-calendar", "icon": "icon-calendar",
"idx": 1, "idx": 1,
"is_submittable": 1, "is_submittable": 1,
"max_attachments": 3, "max_attachments": 3,
"modified": "2014-06-06 05:06:44.594229", "modified": "2014-08-28 03:32:38.865202",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Leave Application", "name": "Leave Application",
"owner": "Administrator", "owner": "Administrator",
"permissions": [ "permissions": [
{ {
"apply_user_permissions": 1, "apply_user_permissions": 1,
"create": 1, "create": 1,
"delete": 0, "delete": 0,
"email": 1, "email": 1,
"permlevel": 0, "permlevel": 0,
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Employee", "role": "Employee",
"user_permission_doctypes": "[\"Company\",\"Employee\",\"Fiscal Year\",\"Leave Application\"]",
"write": 1 "write": 1
}, },
{ {
"amend": 1, "amend": 1,
"cancel": 1, "cancel": 1,
"create": 1, "create": 1,
"email": 1, "delete": 1,
"permlevel": 0, "email": 1,
"print": 1, "export": 1,
"read": 1, "import": 0,
"report": 1, "permlevel": 0,
"role": "HR Manager", "print": 1,
"set_user_permissions": 1, "read": 1,
"submit": 1, "report": 1,
"role": "HR Manager",
"set_user_permissions": 1,
"submit": 1,
"write": 1 "write": 1
}, },
{ {
"amend": 0, "amend": 0,
"cancel": 0, "cancel": 0,
"create": 0, "create": 0,
"delete": 0, "delete": 0,
"permlevel": 1, "permlevel": 1,
"read": 1, "read": 1,
"role": "All", "role": "All",
"submit": 0 "submit": 0
}, },
{ {
"amend": 1, "amend": 1,
"apply_user_permissions": 1, "apply_user_permissions": 1,
"cancel": 1, "cancel": 1,
"create": 1, "create": 1,
"delete": 1, "delete": 1,
"email": 1, "email": 1,
"permlevel": 0, "export": 0,
"print": 1, "permlevel": 0,
"read": 1, "print": 1,
"report": 1, "read": 1,
"role": "HR User", "report": 1,
"set_user_permissions": 1, "role": "HR User",
"submit": 1, "set_user_permissions": 1,
"submit": 1,
"user_permission_doctypes": "[\"Company\"]",
"write": 1 "write": 1
}, },
{ {
"amend": 1, "amend": 1,
"apply_user_permissions": 1, "apply_user_permissions": 1,
"cancel": 0, "cancel": 0,
"create": 0, "create": 0,
"delete": 0, "delete": 0,
"email": 1, "email": 1,
"permlevel": 0, "permlevel": 0,
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Leave Approver", "role": "Leave Approver",
"submit": 1, "submit": 1,
"user_permission_doctypes": "[\"Company\",\"User\"]",
"write": 1 "write": 1
}, },
{ {
"amend": 0, "amend": 0,
"cancel": 0, "cancel": 0,
"create": 0, "create": 0,
"delete": 0, "delete": 0,
"permlevel": 1, "permlevel": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "HR User", "role": "HR User",
"submit": 0, "submit": 0,
"write": 1 "write": 1
}, },
{ {
"amend": 0, "amend": 0,
"cancel": 0, "cancel": 0,
"create": 0, "create": 0,
"delete": 0, "delete": 0,
"permlevel": 1, "permlevel": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Leave Approver", "role": "Leave Approver",
"submit": 0, "submit": 0,
"write": 1 "write": 1
} }
], ],
"search_fields": "employee,employee_name,leave_type,from_date,to_date,total_leave_days,fiscal_year", "search_fields": "employee,employee_name,leave_type,from_date,to_date,total_leave_days,fiscal_year",
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC" "sort_order": "DESC"
} }

View File

@ -155,8 +155,7 @@ class LeaveApplication(Document):
def validate_leave_approver(self): def validate_leave_approver(self):
employee = frappe.get_doc("Employee", self.employee) employee = frappe.get_doc("Employee", self.employee)
leave_approvers = [l.leave_approver for l in leave_approvers = [l.leave_approver for l in employee.get("employee_leave_approvers")]
employee.get("employee_leave_approvers")]
if len(leave_approvers) and self.leave_approver not in leave_approvers: if len(leave_approvers) and self.leave_approver not in leave_approvers:
frappe.throw(_("Leave approver must be one of {0}").format(comma_or(leave_approvers)), InvalidLeaveApproverError) frappe.throw(_("Leave approver must be one of {0}").format(comma_or(leave_approvers)), InvalidLeaveApproverError)

View File

@ -91,6 +91,7 @@ class TestLeaveApplication(unittest.TestCase):
from frappe.utils.user import add_role from frappe.utils.user import add_role
add_role("test1@example.com", "HR User") add_role("test1@example.com", "HR User")
add_role("test1@example.com", "Leave Approver")
clear_user_permissions_for_doctype("Employee") clear_user_permissions_for_doctype("Employee")
frappe.db.set_value("Department", "_Test Department", frappe.db.set_value("Department", "_Test Department",
@ -157,6 +158,7 @@ class TestLeaveApplication(unittest.TestCase):
from frappe.utils.user import add_role from frappe.utils.user import add_role
add_role("test@example.com", "Employee") add_role("test@example.com", "Employee")
add_role("test1@example.com", "HR User")
add_role("test1@example.com", "Leave Approver") add_role("test1@example.com", "Leave Approver")
add_role("test2@example.com", "Leave Approver") add_role("test2@example.com", "Leave Approver")

View File

@ -0,0 +1 @@
[]

View File

@ -74,6 +74,7 @@
{ {
"fieldname": "letter_head", "fieldname": "letter_head",
"fieldtype": "Link", "fieldtype": "Link",
"ignore_user_permissions": 1,
"label": "Letter Head", "label": "Letter Head",
"options": "Letter Head", "options": "Letter Head",
"permlevel": 0, "permlevel": 0,
@ -335,7 +336,7 @@
"icon": "icon-file-text", "icon": "icon-file-text",
"idx": 1, "idx": 1,
"is_submittable": 1, "is_submittable": 1,
"modified": "2014-07-21 07:58:08.033784", "modified": "2014-08-27 06:38:10.006224",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Salary Slip", "name": "Salary Slip",
@ -353,6 +354,7 @@
"report": 1, "report": 1,
"role": "HR User", "role": "HR User",
"submit": 1, "submit": 1,
"user_permission_doctypes": "[\"Branch\",\"Company\",\"Department\",\"Designation\",\"Fiscal Year\",\"Salary Slip\"]",
"write": 1 "write": 1
}, },
{ {

View File

@ -5,24 +5,6 @@ from __future__ import unicode_literals
import frappe import frappe
from frappe import _ from frappe import _
@frappe.whitelist()
def get_leave_approver_list():
roles = [r[0] for r in frappe.db.sql("""select distinct parent from `tabUserRole`
where role='Leave Approver'""")]
if not roles:
frappe.msgprint(_("No Leave Approvers. Please assign 'Leave Approver' Role to atleast one user"))
return roles
@frappe.whitelist()
def get_expense_approver_list():
roles = [r[0] for r in frappe.db.sql("""select distinct parent from `tabUserRole`
where role='Expense Approver'""")]
if not roles:
frappe.msgprint(_("No Expense Approvers. Please assign 'Expense Approver' Role to atleast one user"))
return roles
def set_employee_name(doc): def set_employee_name(doc):
if doc.employee and not doc.employee_name: if doc.employee and not doc.employee_name:
doc.employee_name = frappe.db.get_value("Employee", doc.employee, "employee_name") doc.employee_name = frappe.db.get_value("Employee", doc.employee, "employee_name")

View File

@ -7,7 +7,7 @@ import frappe, json
from frappe.utils import cstr, flt, getdate from frappe.utils import cstr, flt, getdate
from frappe import _ from frappe import _
from frappe.utils.file_manager import save_file from frappe.utils.file_manager import save_file
from frappe.translate import set_default_language, get_dict, get_lang_dict from frappe.translate import set_default_language, get_dict, get_lang_dict, send_translations
from frappe.country_info import get_country_info from frappe.country_info import get_country_info
from frappe.utils.nestedset import get_root_of from frappe.utils.nestedset import get_root_of
from default_website import website_maker from default_website import website_maker
@ -423,7 +423,7 @@ def load_messages(language):
frappe.local.lang = lang frappe.local.lang = lang
m = get_dict("page", "setup-wizard") m = get_dict("page", "setup-wizard")
m.update(get_dict("boot")) m.update(get_dict("boot"))
frappe.local.response["__messages"] = m send_translations(m)
return lang return lang