diff --git a/accounts/page/accounts_browser/accounts_browser.css b/accounts/page/accounts_browser/accounts_browser.css deleted file mode 100644 index 718da365da9..00000000000 --- a/accounts/page/accounts_browser/accounts_browser.css +++ /dev/null @@ -1,29 +0,0 @@ -select.accbrowser-company-select { - width: 200px; - margin-top: 2px; - margin-left: 10px; -} - -span.tree-node-toolbar { - padding: 2px; - margin-left: 15px; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - background-color: #ddd; -} - -.tree-area a.selected { - font-weight: bold; - text-decoration: underline; -} - -span.balance-area { - float: right; - height: 13px; -} - -span.balance-bold { - font-weight: bold; -} \ No newline at end of file diff --git a/accounts/page/accounts_browser/accounts_browser.js b/accounts/page/accounts_browser/accounts_browser.js index 235e6ab541a..66a40b160e8 100644 --- a/accounts/page/accounts_browser/accounts_browser.js +++ b/accounts/page/accounts_browser/accounts_browser.js @@ -8,7 +8,6 @@ // see ledger pscript['onload_Accounts Browser'] = function(wrapper){ - console.log($(wrapper).html()); wn.ui.make_app_page({ parent: wrapper, single_column: true @@ -122,14 +121,14 @@ erpnext.AccountsChart = Class.extend({ } // bold - $('.balance-bold').removeClass('balance-bold'); // deselect - $(link).parent().find('.balance-area:first').addClass('balance-bold'); // select + $('.bold').removeClass('bold'); // deselect + $(link).parent().find('.balance-area:first').addClass('bold'); // select }, onrender: function(treenode) { if (ctype == 'Account' && treenode.data) { if(treenode.data.balance) { - treenode.parent.append('' + treenode.parent.append('' + format_currency(treenode.data.balance, treenode.data.currency) + ''); } @@ -142,7 +141,7 @@ erpnext.AccountsChart = Class.extend({ var data = $(link).data('node-data'); if(!data) return; - link.toolbar = $('').insertAfter(link); + link.toolbar = $('').insertAfter(link); var node_links = []; // edit diff --git a/hr/doctype/leave_application/leave_application.py b/hr/doctype/leave_application/leave_application.py index f2f34d7d86d..b547d3d2c92 100755 --- a/hr/doctype/leave_application/leave_application.py +++ b/hr/doctype/leave_application/leave_application.py @@ -12,6 +12,7 @@ from webnotes import msgprint class LeaveDayBlockedError(webnotes.ValidationError): pass class OverlapError(webnotes.ValidationError): pass class InvalidLeaveApproverError(webnotes.ValidationError): pass +class LeaveApproverIdentityError(webnotes.ValidationError): pass from webnotes.model.controller import DocListController class DocType(DocListController): @@ -161,6 +162,10 @@ class DocType(DocListController): where parent=%s and role='Leave Approver'""", self.doc.leave_approver): msgprint(get_fullname(self.doc.leave_approver) + ": " \ + _("does not have role 'Leave Approver'"), raise_exception=InvalidLeaveApproverError) + + elif self.doc.docstatus==1 and len(leave_approvers) and self.doc.leave_approver != webnotes.session.user: + msgprint(_("Only the selected Leave Approver can submit this Leave Application"), + raise_exception=LeaveApproverIdentityError) def notify_employee(self, status): employee = webnotes.doc("Employee", self.doc.employee) diff --git a/hr/doctype/leave_application/test_leave_application.py b/hr/doctype/leave_application/test_leave_application.py index ee1504145df..2c4f3763a93 100644 --- a/hr/doctype/leave_application/test_leave_application.py +++ b/hr/doctype/leave_application/test_leave_application.py @@ -163,8 +163,8 @@ class TestLeaveApplication(unittest.TestCase): webnotes.set_user("test1@example.com") application.doc.status = "Approved" - from webnotes.model.bean import BeanPermissionError - self.assertRaises(BeanPermissionError, application.submit) + from hr.doctype.leave_application.leave_application import LeaveApproverIdentityError + self.assertRaises(LeaveApproverIdentityError, application.submit) webnotes.conn.sql("""delete from `tabEmployee Leave Approver` where parent=%s""", "_T-Employee-0001") diff --git a/patches/1311/p06_update_user_properties.py b/patches/1311/p06_update_user_properties.py index de19df2a9bc..51da19f1ba1 100644 --- a/patches/1311/p06_update_user_properties.py +++ b/patches/1311/p06_update_user_properties.py @@ -6,7 +6,9 @@ import webnotes def execute(): update_user_properties() + update_user_match() update_permissions() + remove_duplicate_restrictions() webnotes.clear_cache() def update_user_properties(): @@ -23,6 +25,49 @@ def update_user_properties(): where defkey=%s and parent not in ('__global', 'Control Panel')""", (df[0].options, d.defkey)) +def update_user_match(): + import webnotes.defaults + doctype_matches = {} + for doctype, match in webnotes.conn.sql("""select parent, `match` from `tabDocPerm` + where `match` like %s""", "%:user"): + doctype_matches.setdefault(doctype, []).append(match) + + for doctype, user_matches in doctype_matches.items(): + + # get permissions of this doctype + perms = webnotes.conn.sql("""select role, `match` from `tabDocPerm` + where parent=%s and permlevel=0 and read=1""", doctype, as_dict=True) + + # for each user with roles of this doctype, check if match condition applies + for profile in webnotes.conn.sql_list("""select name from `tabProfile` + where enabled=1 and user_type='System User'"""): + + roles = webnotes.get_roles(profile) + + user_match = False + for perm in perms: + if perm.role in roles and (perm.match and \ + (perm.match.endswith(":user") or perm.match.endswith(":profile"))): + user_match = True + break + + if not user_match: + continue + + # if match condition applies, restrict that user + # add that doc's restriction to that user + for match in user_matches: + for name in webnotes.conn.sql_list("""select name from `tab{doctype}` + where `{field}`=%s""".format(doctype=doctype, field=match.split(":")[0]), profile): + + webnotes.defaults.add_default(doctype, name, profile, "Restriction") + +def update_permissions(): + # clear match conditions other than owner + webnotes.conn.sql("""update tabDocPerm set `match`='' + where ifnull(`match`,'') not in ('', 'owner')""") + +def remove_duplicate_restrictions(): # remove duplicate restrictions (if they exist) for d in webnotes.conn.sql("""select parent, defkey, defvalue, count(*) as cnt from tabDefaultValue @@ -30,9 +75,4 @@ def update_user_properties(): group by parent, defkey, defvalue""", as_dict=1): if d.cnt > 1: webnotes.conn.sql("""delete from tabDefaultValue where parent=%s, defkey=%s, - defvalue=%s limit %s""", (d.parent, d.defkey, d.defvalue, d.cnt-1)) - -def update_permissions(): - # clear match conditions other than owner - webnotes.conn.sql("""update tabDocPerm set `match`='' - where ifnull(`match`,'') not in ('', 'owner')""") \ No newline at end of file + defvalue=%s limit %s""", (d.parent, d.defkey, d.defvalue, d.cnt-1)) \ No newline at end of file diff --git a/support/doctype/customer_issue/customer_issue.txt b/support/doctype/customer_issue/customer_issue.txt index f9fbc6bd6a3..c677654ccca 100644 --- a/support/doctype/customer_issue/customer_issue.txt +++ b/support/doctype/customer_issue/customer_issue.txt @@ -2,7 +2,7 @@ { "creation": "2013-01-10 16:34:30", "docstatus": 0, - "modified": "2013-11-02 16:59:22", + "modified": "2013-12-11 11:14:32", "modified_by": "Administrator", "owner": "harshada@webnotestech.com" }, @@ -13,7 +13,7 @@ "is_submittable": 0, "module": "Support", "name": "__common__", - "search_fields": "status,customer,customer_name,allocated_to,allocated_on, territory" + "search_fields": "status,customer,customer_name,territory" }, { "doctype": "DocField", diff --git a/utilities/demo/make_demo.py b/utilities/demo/make_demo.py index b98fd7ac9c0..87c0527578a 100644 --- a/utilities/demo/make_demo.py +++ b/utilities/demo/make_demo.py @@ -3,7 +3,7 @@ import webnotes, os, datetime import webnotes.utils -from webnotes.utils import random_string +from webnotes.utils import random_string, cstr from webnotes.widgets import query_report import random import json @@ -153,7 +153,7 @@ def run_stock(current_date): for po in list(set([r[0] for r in query_report.run(report)["result"] if r[0]!="Total"]))[:how_many("Purchase Receipt")]: pr = webnotes.bean(make_purchase_receipt(po)) pr.doc.posting_date = current_date - pr.doc.fiscal_year = current_date.year + pr.doc.fiscal_year = cstr(current_date.year) pr.insert() try: pr.submit() @@ -169,7 +169,7 @@ def run_stock(current_date): for so in list(set([r[0] for r in query_report.run(report)["result"] if r[0]!="Total"]))[:how_many("Delivery Note")]: dn = webnotes.bean(make_delivery_note(so)) dn.doc.posting_date = current_date - dn.doc.fiscal_year = current_date.year + dn.doc.fiscal_year = cstr(current_date.year) dn.insert() try: dn.submit() @@ -192,7 +192,7 @@ def run_purchase(current_date): mr = webnotes.new_bean("Material Request") mr.doc.material_request_type = "Purchase" mr.doc.transaction_date = current_date - mr.doc.fiscal_year = current_date.year + mr.doc.fiscal_year = cstr(current_date.year) mr.doclist.append({ "doctype": "Material Request Item", "parentfield": "indent_details", @@ -211,7 +211,7 @@ def run_purchase(current_date): if row[0] != "Total": sq = webnotes.bean(make_supplier_quotation(row[0])) sq.doc.transaction_date = current_date - sq.doc.fiscal_year = current_date.year + sq.doc.fiscal_year = cstr(current_date.year) sq.insert() sq.submit() webnotes.conn.commit() @@ -224,7 +224,7 @@ def run_purchase(current_date): if row[0] != "Total": po = webnotes.bean(make_purchase_order(row[0])) po.doc.transaction_date = current_date - po.doc.fiscal_year = current_date.year + po.doc.fiscal_year = cstr(current_date.year) po.insert() po.submit() webnotes.conn.commit() @@ -283,7 +283,7 @@ def make_stock_entry_from_pro(pro_id, purpose, current_date): try: st = webnotes.bean(make_stock_entry(pro_id, purpose)) st.doc.posting_date = current_date - st.doc.fiscal_year = current_date.year + st.doc.fiscal_year = cstr(current_date.year) for d in st.doclist.get({"parentfield": "mtn_details"}): d.expense_account = "Stock Adjustment - " + company_abbr d.cost_center = "Main - " + company_abbr @@ -303,7 +303,7 @@ def make_quotation(current_date): "customer": get_random("Customer"), "order_type": "Sales", "transaction_date": current_date, - "fiscal_year": current_date.year + "fiscal_year": cstr(current_date.year) }]) add_random_children(b, {