From c753d31ba78082f6c65f1cc8b2c9c70fd5fccd66 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 26 Aug 2013 17:33:50 +0530 Subject: [PATCH 01/34] [fix] [minor] erpnext demo --- accounts/doctype/purchase_invoice/purchase_invoice.py | 6 ++---- utilities/demo/make_demo.py | 10 +++++----- utilities/demo/make_erpnext_demo.py | 2 +- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.py b/accounts/doctype/purchase_invoice/purchase_invoice.py index bfea0bb5a0a..05383235614 100644 --- a/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -261,13 +261,11 @@ class DocType(BuyingController): if d.purchase_order: submitted = sql("select name from `tabPurchase Order` where docstatus = 1 and name = '%s'" % d.purchase_order) if not submitted: - msgprint("Purchase Order : "+ cstr(d.purchase_order) +" is not submitted") - raise Exception , "Validation Error." + webnotes.throw("Purchase Order : "+ cstr(d.purchase_order) +" is not submitted") if d.purchase_receipt: submitted = sql("select name from `tabPurchase Receipt` where docstatus = 1 and name = '%s'" % d.purchase_receipt) if not submitted: - msgprint("Purchase Receipt : "+ cstr(d.purchase_receipt) +" is not submitted") - raise Exception , "Validation Error." + webnotes.throw("Purchase Receipt : "+ cstr(d.purchase_receipt) +" is not submitted") def update_against_document_in_jv(self): diff --git a/utilities/demo/make_demo.py b/utilities/demo/make_demo.py index fc0776740e6..7600b2b5fea 100644 --- a/utilities/demo/make_demo.py +++ b/utilities/demo/make_demo.py @@ -266,11 +266,11 @@ def make_stock_entry_from_pro(pro_id, purpose, current_date): from stock.stock_ledger import NegativeStockError from stock.doctype.stock_entry.stock_entry import IncorrectValuationRateError, DuplicateEntryForProductionOrderError - st = webnotes.bean(make_stock_entry(pro_id, purpose)) - st.doc.posting_date = current_date - st.doc.fiscal_year = "2013" - st.doc.expense_adjustment_account = "Stock in Hand - WP" try: + st = webnotes.bean(make_stock_entry(pro_id, purpose)) + st.doc.posting_date = current_date + st.doc.fiscal_year = "2013" + st.doc.expense_adjustment_account = "Stock in Hand - WP" st.insert() webnotes.conn.commit() st.submit() @@ -278,7 +278,7 @@ def make_stock_entry_from_pro(pro_id, purpose, current_date): except NegativeStockError: pass except IncorrectValuationRateError: pass except DuplicateEntryForProductionOrderError: pass - + def make_quotation(current_date): b = webnotes.bean([{ "creation": current_date, diff --git a/utilities/demo/make_erpnext_demo.py b/utilities/demo/make_erpnext_demo.py index 0a8a9351d8f..b6c22c2b901 100644 --- a/utilities/demo/make_erpnext_demo.py +++ b/utilities/demo/make_erpnext_demo.py @@ -73,7 +73,7 @@ def make_demo_on_login_script(): s.doc.script = dfile.read() if __name__=="__main__": - webnotes.connect() + # webnotes.connect() webnotes.mute_emails = 1 make_demo_app() make_demo_user() From c6601cb32df503bc3fc8e6144557ca4e7d2b9b55 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 26 Aug 2013 18:53:50 +0530 Subject: [PATCH 02/34] [minor] [demo] do not allow creation of newsletter --- utilities/demo/make_erpnext_demo.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/utilities/demo/make_erpnext_demo.py b/utilities/demo/make_erpnext_demo.py index b6c22c2b901..f3e7f3ed6fc 100644 --- a/utilities/demo/make_erpnext_demo.py +++ b/utilities/demo/make_erpnext_demo.py @@ -36,6 +36,11 @@ def make_demo_user(): }) p.save() + + # only read for newsletter + webnotes.conn.sql("""update `tabDocPerm` set `write`=0, `create`=0, `cancel`=0 + where parent='Newsletter'""") + webnotes.conn.commit() def make_demo_login_page(): From f668f97a6f8f30aa31120e0ca45d8a4c9cc919c4 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 26 Aug 2013 19:51:24 +0530 Subject: [PATCH 03/34] [minor] [demo] --- utilities/demo/make_erpnext_demo.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/utilities/demo/make_erpnext_demo.py b/utilities/demo/make_erpnext_demo.py index f3e7f3ed6fc..16d57bb8562 100644 --- a/utilities/demo/make_erpnext_demo.py +++ b/utilities/demo/make_erpnext_demo.py @@ -76,6 +76,9 @@ def make_demo_on_login_script(): s.doc.script_type = "Server" with open(os.path.join(os.path.dirname(__file__), "demo_control_panel.py"), "r") as dfile: s.doc.script = dfile.read() + s.insert() + + webnotes.conn.commit() if __name__=="__main__": # webnotes.connect() From a65253b5d5b9a16815b1d3d2175436ba15ec6b3f Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 27 Aug 2013 10:32:56 +0530 Subject: [PATCH 04/34] [stock] [minor] Added Warehouse User check in Sales Order --- selling/doctype/sales_order/sales_order.py | 12 ++++++- .../doctype/sales_order/test_sales_order.py | 23 ++++++++++++++ stock/doctype/stock_entry/test_stock_entry.py | 31 +++++++++++++++++++ .../stock_ledger_entry/stock_ledger_entry.py | 14 ++------- stock/doctype/warehouse/test_warehouse.py | 4 +++ stock/utils.py | 12 +++++++ 6 files changed, 84 insertions(+), 12 deletions(-) diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py index a9bb7a2140f..ec2406f0512 100644 --- a/selling/doctype/sales_order/sales_order.py +++ b/selling/doctype/sales_order/sales_order.py @@ -126,8 +126,9 @@ class DocType(SellingController): self.validate_mandatory() self.validate_proj_cust() self.validate_po() - self.validate_uom_is_integer("stock_uom", "qty") + self.validate_uom_is_integer("stock_uom", "qty") self.validate_for_items() + self.validate_warehouse_user() sales_com_obj = get_obj(dt = 'Sales Common') sales_com_obj.check_active_sales_items(self) sales_com_obj.check_conversion_rate(self) @@ -147,6 +148,15 @@ class DocType(SellingController): if not self.doc.billing_status: self.doc.billing_status = 'Not Billed' if not self.doc.delivery_status: self.doc.delivery_status = 'Not Delivered' + + def validate_warehouse_user(self): + from stock.utils import validate_warehouse_user + + warehouses = list(set([d.reserved_warehouse for d in self.doclist.get({"doctype": self.tname})])) + + for w in warehouses: + validate_warehouse_user(w) + def validate_with_previous_doc(self): super(DocType, self).validate_with_previous_doc(self.tname, { "Quotation": { diff --git a/selling/doctype/sales_order/test_sales_order.py b/selling/doctype/sales_order/test_sales_order.py index 9fd16e8c299..7b72271bec9 100644 --- a/selling/doctype/sales_order/test_sales_order.py +++ b/selling/doctype/sales_order/test_sales_order.py @@ -272,6 +272,29 @@ class TestSalesOrder(unittest.TestCase): self.check_reserved_qty(sbom_test_records[0][2]["item_code"], so.doclist[1].reserved_warehouse, 20.0) + def test_warehouse_user(self): + webnotes.session.user = "test@example.com" + + webnotes.bean("Profile", "test@example.com").get_controller()\ + .add_roles("Sales User", "Sales Manager", "Material User", "Material Manager") + + webnotes.bean("Profile", "test2@example.com").get_controller()\ + .add_roles("Sales User", "Sales Manager", "Material User", "Material Manager") + + + from stock.utils import UserNotAllowedForWarehouse + so = webnotes.bean(copy = test_records[0]) + so.doc.company = "_Test Company 1" + so.doc.conversion_rate = 0.02 + so.doc.plc_conversion_rate = 0.02 + so.doclist[1].reserved_warehouse = "_Test Warehouse 2 - _TC1" + self.assertRaises(UserNotAllowedForWarehouse, so.insert) + + webnotes.session.user = "test2@example.com" + so.insert() + + webnotes.session.user = "Administrator" + test_dependencies = ["Sales BOM"] test_records = [ diff --git a/stock/doctype/stock_entry/test_stock_entry.py b/stock/doctype/stock_entry/test_stock_entry.py index f33cfa35d3d..b9b32306d8b 100644 --- a/stock/doctype/stock_entry/test_stock_entry.py +++ b/stock/doctype/stock_entry/test_stock_entry.py @@ -41,11 +41,42 @@ class TestStockEntry(unittest.TestCase): webnotes.conn.set_default("company", self.old_default_company) def test_warehouse_company_validation(self): + webnotes.session.user = "test2@example.com" + webnotes.bean("Profile", "test2@example.com").get_controller()\ + .add_roles("Sales User", "Sales Manager", "Material User", "Material Manager") + from stock.doctype.stock_ledger_entry.stock_ledger_entry import InvalidWarehouseCompany st1 = webnotes.bean(copy=test_records[0]) st1.doclist[1].t_warehouse="_Test Warehouse 2 - _TC1" st1.insert() self.assertRaises(InvalidWarehouseCompany, st1.submit) + + webnotes.session.user = "Administrator" + + def test_warehouse_user(self): + from stock.utils import UserNotAllowedForWarehouse + + webnotes.session.user = "test@example.com" + webnotes.bean("Profile", "test@example.com").get_controller()\ + .add_roles("Sales User", "Sales Manager", "Material User", "Material Manager") + + webnotes.bean("Profile", "test2@example.com").get_controller()\ + .add_roles("Sales User", "Sales Manager", "Material User", "Material Manager") + + st1 = webnotes.bean(copy=test_records[0]) + st1.doc.company = "_Test Company 1" + st1.doclist[1].t_warehouse="_Test Warehouse 2 - _TC1" + st1.insert() + self.assertRaises(UserNotAllowedForWarehouse, st1.submit) + + webnotes.session.user = "test2@example.com" + st1 = webnotes.bean(copy=test_records[0]) + st1.doc.company = "_Test Company 1" + st1.doclist[1].t_warehouse="_Test Warehouse 2 - _TC1" + st1.insert() + st1.submit() + + webnotes.session.user = "Administrator" def test_material_receipt_gl_entry(self): webnotes.conn.sql("delete from `tabStock Ledger Entry`") diff --git a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py index 71d426f48e0..58fc828f2de 100644 --- a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py +++ b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py @@ -25,12 +25,14 @@ class DocType(DocListController): self.doclist = doclist def validate(self): + from stock.utils import validate_warehouse_user if not hasattr(webnotes, "new_stock_ledger_entries"): webnotes.new_stock_ledger_entries = [] + webnotes.new_stock_ledger_entries.append(self.doc) self.validate_mandatory() self.validate_item() - self.validate_warehouse_user() + validate_warehouse_user(self.doc.warehouse) self.validate_warehouse_company() self.actual_amt_check() self.check_stock_frozen_date() @@ -52,16 +54,6 @@ class DocType(DocListController): self.doc.fields.pop('batch_bal') - def validate_warehouse_user(self): - if webnotes.session.user=="Administrator": - return - warehouse_users = [p[0] for p in webnotes.conn.sql("""select user from `tabWarehouse User` - where parent=%s""", self.doc.warehouse)] - - if warehouse_users and not webnotes.session.user in warehouse_users: - webnotes.msgprint(_("User not allowed entry in the Warehouse") \ - + ": " + webnotes.session.user + " / " + self.doc.warehouse, raise_exception = 1) - def validate_warehouse_company(self): warehouse_company = webnotes.conn.get_value("Warehouse", self.doc.warehouse, "company") if warehouse_company and warehouse_company != self.doc.company: diff --git a/stock/doctype/warehouse/test_warehouse.py b/stock/doctype/warehouse/test_warehouse.py index 4e47d5636b0..ed72562078b 100644 --- a/stock/doctype/warehouse/test_warehouse.py +++ b/stock/doctype/warehouse/test_warehouse.py @@ -16,5 +16,9 @@ test_records = [ "doctype": "Warehouse", "warehouse_name": "_Test Warehouse 2", "company": "_Test Company 1" + }, { + "doctype": "Warehouse User", + "parentfield": "warehouse_users", + "user": "test2@example.com" }] ] diff --git a/stock/utils.py b/stock/utils.py index 5376342979a..f04b6632369 100644 --- a/stock/utils.py +++ b/stock/utils.py @@ -8,6 +8,8 @@ from webnotes.utils import flt, cstr, nowdate, add_days, cint from webnotes.defaults import get_global_default from webnotes.utils.email_lib import sendmail +class UserNotAllowedForWarehouse(webnotes.ValidationError): pass + def validate_end_of_life(item_code, end_of_life=None, verbose=1): if not end_of_life: end_of_life = webnotes.conn.get_value("Item", item_code, "end_of_life") @@ -152,6 +154,16 @@ def get_warehouse_list(doctype, txt, searchfield, start, page_len, filters): wlist.append([w]) return wlist +def validate_warehouse_user(warehouse): + if webnotes.session.user=="Administrator": + return + warehouse_users = [p[0] for p in webnotes.conn.sql("""select user from `tabWarehouse User` + where parent=%s""", warehouse)] + + if warehouse_users and not (webnotes.session.user in warehouse_users): + webnotes.throw(_("Not allowed entry in Warehouse") \ + + ": " + warehouse, UserNotAllowedForWarehouse) + def get_buying_amount(item_code, voucher_type, voucher_no, voucher_detail_no, stock_ledger_entries, item_sales_bom=None): if item_sales_bom and item_sales_bom.get(item_code): From 23b3610fe88d76cbb74ec2250764c3b341a09823 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 27 Aug 2013 10:43:08 +0530 Subject: [PATCH 05/34] [fix] [minor] batch no get query --- selling/doctype/sales_common/sales_common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selling/doctype/sales_common/sales_common.js b/selling/doctype/sales_common/sales_common.js index dea94b8f3d4..5c0c96ad569 100644 --- a/selling/doctype/sales_common/sales_common.js +++ b/selling/doctype/sales_common/sales_common.js @@ -95,7 +95,7 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({ return{ query : "selling.doctype.sales_common.sales_common.get_batch_no", filters: { - 'item': item.item_code, + 'item_code': item.item_code, 'posting_date': me.frm.doc.posting_date } } From d608042de43dee12dafe1805a35a2a3d20799a60 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 27 Aug 2013 10:51:41 +0530 Subject: [PATCH 06/34] [fix] [minor] batch no get query --- selling/doctype/sales_common/sales_common.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/selling/doctype/sales_common/sales_common.py b/selling/doctype/sales_common/sales_common.py index 3c43c1ede70..baa8850a589 100644 --- a/selling/doctype/sales_common/sales_common.py +++ b/selling/doctype/sales_common/sales_common.py @@ -340,7 +340,7 @@ def get_batch_no(doctype, txt, searchfield, start, page_len, filters): and batch_no like '%(txt)s' and exists(select * from `tabBatch` where name = sle.batch_no - and expiry_date >= '%(posting_date)s' + and (ifnull(expiry_date, '')='' or expiry_date >= '%(posting_date)s') and docstatus != 2) %(mcond)s group by batch_no having sum(actual_qty) > 0 @@ -353,11 +353,11 @@ def get_batch_no(doctype, txt, searchfield, start, page_len, filters): return webnotes.conn.sql("""select name from tabBatch where docstatus != 2 and item = '%(item_code)s' - and expiry_date >= '%(posting_date)s' + and (ifnull(expiry_date, '')='' or expiry_date >= '%(posting_date)s') and name like '%(txt)s' %(mcond)s order by name desc limit %(start)s, %(page_len)s""" % {'item_code': filters['item_code'], 'posting_date': filters['posting_date'], 'txt': "%%%s%%" % txt, 'mcond':get_match_cond(doctype, searchfield),'start': start, - 'page_len': page_len}) \ No newline at end of file + 'page_len': page_len}) From 252d14a85e9a1605ac6506d35fccb0d5691bd68c Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 27 Aug 2013 11:52:17 +0530 Subject: [PATCH 07/34] [fix] [minor] validate warehouse user for sales order --- selling/doctype/sales_order/sales_order.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py index ec2406f0512..8e3ed701ff3 100644 --- a/selling/doctype/sales_order/sales_order.py +++ b/selling/doctype/sales_order/sales_order.py @@ -152,7 +152,8 @@ class DocType(SellingController): def validate_warehouse_user(self): from stock.utils import validate_warehouse_user - warehouses = list(set([d.reserved_warehouse for d in self.doclist.get({"doctype": self.tname})])) + warehouses = list(set([d.reserved_warehouse for d in + self.doclist.get({"doctype": self.tname}) if d.reserved_warehouse])) for w in warehouses: validate_warehouse_user(w) From 047f8d734bd20c71722c13bbfbb67fe369e371a6 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 27 Aug 2013 14:20:00 +0530 Subject: [PATCH 08/34] [fix] [minor] get customer default only if customer has value --- utilities/transaction_base.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utilities/transaction_base.py b/utilities/transaction_base.py index d2bffcfeac6..aace0cb78e2 100644 --- a/utilities/transaction_base.py +++ b/utilities/transaction_base.py @@ -55,6 +55,8 @@ class TransactionBase(StatusUpdater): return self._party_type_and_name def get_customer_defaults(self): + if not self.doc.customer: return {} + out = self.get_default_address_and_contact("customer") customer = webnotes.doc("Customer", self.doc.customer) From ee1044fde509745c42aca3c3c41412e0dbec0b18 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 27 Aug 2013 14:49:04 +0530 Subject: [PATCH 09/34] [minor] [demo] show banner on login --- utilities/demo/make_erpnext_demo.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/utilities/demo/make_erpnext_demo.py b/utilities/demo/make_erpnext_demo.py index 16d57bb8562..2a957f61291 100644 --- a/utilities/demo/make_erpnext_demo.py +++ b/utilities/demo/make_erpnext_demo.py @@ -77,6 +77,10 @@ def make_demo_on_login_script(): with open(os.path.join(os.path.dirname(__file__), "demo_control_panel.py"), "r") as dfile: s.doc.script = dfile.read() s.insert() + + cp = webnotes.bean("Control Panel") + cp.doc.custom_startup_code = """wn.ui.toolbar.show_banner('You are using ERPNext Demo. To start your own ERPNext Trial, click here')""" + cp.save() webnotes.conn.commit() From 8d2e716697e0227653adf2160ed6760a8924be8e Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 27 Aug 2013 15:26:12 +0530 Subject: [PATCH 10/34] [minor] [demo] form_dict --- utilities/demo/make_demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utilities/demo/make_demo.py b/utilities/demo/make_demo.py index 7600b2b5fea..634a52d624d 100644 --- a/utilities/demo/make_demo.py +++ b/utilities/demo/make_demo.py @@ -406,7 +406,7 @@ def import_data(dt, submit=False): for doctype in dt: print "Importing", doctype.replace("_", " "), "..." - webnotes.form_dict = {} + webnotes.form_dict = _dict() if submit: webnotes.form_dict["params"] = json.dumps({"_submit": 1}) webnotes.uploaded_file = os.path.join(os.path.dirname(__file__), "demo_docs", doctype+".csv") From cb4c0ea1d5bd046ec8573c4912df1db349cbf887 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 27 Aug 2013 15:39:31 +0530 Subject: [PATCH 11/34] [minor] [demo] form_dict --- utilities/demo/make_demo.py | 2 +- utilities/demo/make_erpnext_demo.py | 47 +++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/utilities/demo/make_demo.py b/utilities/demo/make_demo.py index 634a52d624d..3d7d6487d4e 100644 --- a/utilities/demo/make_demo.py +++ b/utilities/demo/make_demo.py @@ -406,7 +406,7 @@ def import_data(dt, submit=False): for doctype in dt: print "Importing", doctype.replace("_", " "), "..." - webnotes.form_dict = _dict() + webnotes.form_dict = webnotes._dict() if submit: webnotes.form_dict["params"] = json.dumps({"_submit": 1}) webnotes.uploaded_file = os.path.join(os.path.dirname(__file__), "demo_docs", doctype+".csv") diff --git a/utilities/demo/make_erpnext_demo.py b/utilities/demo/make_erpnext_demo.py index 2a957f61291..384dfbfa098 100644 --- a/utilities/demo/make_erpnext_demo.py +++ b/utilities/demo/make_erpnext_demo.py @@ -9,6 +9,23 @@ def make_demo_app(): utilities.demo.make_demo.make(reset=True) def make_demo_user(): + roles = ["Accounts Manager", "Analytics", "Expense Approver", "Accounts User", + "Leave Approver", "Blogger", "Customer", "Sales Manager", "Employee", "Support Manager", + "HR Manager", "HR User", "Maintenance Manager", "Maintenance User", "Material Manager", + "Material Master Manager", "Material User", "Partner", "Manufacturing Manager", + "Manufacturing User", "Projects User", "Purchase Manager", "Purchase Master Manager", + "Purchase User", "Quality Manager", "Report Manager", "Sales Master Manager", + "Sales User", "Supplier", "Support Team"] + + def add_roles(bean): + for role in roles: + p.doclist.append({ + "doctype": "UserRole", + "parentfield": "user_roles", + "role": role + }) + + # make demo user if webnotes.conn.exists("Profile", "demo@erpnext.com"): webnotes.delete_doc("Profile", "demo@erpnext.com") @@ -21,20 +38,24 @@ def make_demo_user(): p.doc.send_invite_email = 0 p.doc.new_password = "demo" p.insert() + add_roles(p) + p.save() - for role in ("Accounts Manager", "Analytics", "Expense Approver", "Accounts User", - "Leave Approver", "Blogger", "Customer", "Sales Manager", "Employee", "Support Manager", - "HR Manager", "HR User", "Maintenance Manager", "Maintenance User", "Material Manager", - "Material Master Manager", "Material User", "Partner", "Manufacturing Manager", - "Manufacturing User", "Projects User", "Purchase Manager", "Purchase Master Manager", - "Purchase User", "Quality Manager", "Report Manager", "Sales Master Manager", "Sales User", - "Supplier", "Support Team"): - p.doclist.append({ - "doctype": "UserRole", - "parentfield": "user_roles", - "role": role - }) - + # make system manager user + if webnotes.conn.exists("Profile", "admin@erpnext.com"): + webnotes.delete_doc("Profile", "admin@erpnext.com") + + p = webnotes.new_bean("Profile") + p.doc.email = "admin@erpnext.com" + p.doc.first_name = "Admin" + p.doc.last_name = "User" + p.doc.enabled = 1 + p.doc.user_type = "System User" + p.doc.send_invite_email = 0 + p.doc.new_password = "admin010123" + p.insert() + roles.append("System Manager") + add_roles(p) p.save() # only read for newsletter From 85ef479db8146b99c073a69c7a4104f1c9baf9fd Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 27 Aug 2013 23:21:19 +0530 Subject: [PATCH 12/34] [demo] [minor] disable signup and don't allow editing profile --- utilities/demo/make_erpnext_demo.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/utilities/demo/make_erpnext_demo.py b/utilities/demo/make_erpnext_demo.py index 384dfbfa098..31dc4008742 100644 --- a/utilities/demo/make_erpnext_demo.py +++ b/utilities/demo/make_erpnext_demo.py @@ -61,6 +61,8 @@ def make_demo_user(): # only read for newsletter webnotes.conn.sql("""update `tabDocPerm` set `write`=0, `create`=0, `cancel`=0 where parent='Newsletter'""") + webnotes.conn.sql("""update `tabDocPerm` set `write`=0, `create`=0, `cancel`=0 + where parent='Profile' and role='All'""") webnotes.conn.commit() @@ -87,6 +89,7 @@ def make_demo_login_page(): p.insert() webnotes.conn.set_value("Website Settings", None, "home_page", "demo-login") + webnotes.conn.set_value("Website Settings", None, "disable_signup", 1) webnotes.conn.commit() From 993c5c3bd712d5fdd665285ea743e2ab502bfc46 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 28 Aug 2013 14:06:15 +0530 Subject: [PATCH 13/34] [fix] [minor] --- stock/report/items_to_be_requested/items_to_be_requested.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stock/report/items_to_be_requested/items_to_be_requested.txt b/stock/report/items_to_be_requested/items_to_be_requested.txt index c149c969409..91e8ca3f269 100644 --- a/stock/report/items_to_be_requested/items_to_be_requested.txt +++ b/stock/report/items_to_be_requested/items_to_be_requested.txt @@ -2,7 +2,7 @@ { "creation": "2013-08-20 15:08:10", "docstatus": 0, - "modified": "2013-08-20 15:10:43", + "modified": "2013-08-20 15:10:45", "modified_by": "Administrator", "owner": "Administrator" }, @@ -10,7 +10,7 @@ "doctype": "Report", "is_standard": "Yes", "name": "__common__", - "query": "SELECT\n tabBin.item_code as \"Item:Link/Item:120\",\n tabBin.warehouse as \"Item:Link/Warehouse:120\",\n tabBin.actual_qty as \"Actual:Float:90\",\n tabBin.indented_qty as \"Requested:Float:90\",\n tabBin.reserved_qty as \"Reserved:Float:90\",\n tabBin.ordered_qty as \"Ordered:Float:90\",\n tabBin.projected_qty as \"Projected:Float:90\"\nFROM\n tabBin, tabItem\nWHERE\n tabBin.item_code = tabItem.name\n AND tabItem.is_purchase_item = \"Yes\"\n AND tabBin.projected_qty < 0\nORDER BY\n tabBin.projected_qty ASC", + "query": "SELECT\n tabBin.item_code as \"Item:Link/Item:120\",\n tabBin.warehouse as \"Warehouse:Link/Warehouse:120\",\n tabBin.actual_qty as \"Actual:Float:90\",\n tabBin.indented_qty as \"Requested:Float:90\",\n tabBin.reserved_qty as \"Reserved:Float:90\",\n tabBin.ordered_qty as \"Ordered:Float:90\",\n tabBin.projected_qty as \"Projected:Float:90\"\nFROM\n tabBin, tabItem\nWHERE\n tabBin.item_code = tabItem.name\n AND tabItem.is_purchase_item = \"Yes\"\n AND tabBin.projected_qty < 0\nORDER BY\n tabBin.projected_qty ASC", "ref_doctype": "Item", "report_name": "Items To Be Requested", "report_type": "Query Report" From fccbb3f33159f349218424de4c637e7defcf9390 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 28 Aug 2013 18:30:14 +0530 Subject: [PATCH 14/34] [fix] [minor] made resolution details editable in support ticket --- .../doctype/support_ticket/support_ticket.txt | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/support/doctype/support_ticket/support_ticket.txt b/support/doctype/support_ticket/support_ticket.txt index 53d1c7ca41d..dcb45204fd2 100644 --- a/support/doctype/support_ticket/support_ticket.txt +++ b/support/doctype/support_ticket/support_ticket.txt @@ -2,7 +2,7 @@ { "creation": "2013-02-01 10:36:25", "docstatus": 0, - "modified": "2013-08-08 14:22:34", + "modified": "2013-08-28 18:29:06", "modified_by": "Administrator", "owner": "Administrator" }, @@ -224,17 +224,6 @@ "oldfieldtype": "Column Break", "read_only": 1 }, - { - "depends_on": "eval:!doc.__islocal", - "doctype": "DocField", - "fieldname": "resolution_details", - "fieldtype": "Small Text", - "label": "Resolution Details", - "no_copy": 1, - "oldfieldname": "resolution_details", - "oldfieldtype": "Text", - "read_only": 1 - }, { "doctype": "DocField", "fieldname": "first_responded_on", @@ -254,6 +243,17 @@ "read_only": 1, "search_index": 0 }, + { + "depends_on": "eval:!doc.__islocal", + "doctype": "DocField", + "fieldname": "resolution_details", + "fieldtype": "Small Text", + "label": "Resolution Details", + "no_copy": 1, + "oldfieldname": "resolution_details", + "oldfieldtype": "Text", + "read_only": 0 + }, { "doctype": "DocField", "fieldname": "content_type", From 46ec268e9b3f457f665d9f57425028874f515692 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 29 Aug 2013 13:53:36 +0530 Subject: [PATCH 15/34] [communications] [minor] Code cleanup so it can be extended by custom script --- selling/doctype/lead/get_leads.py | 20 +++++--------------- utilities/doctype/contact/contact.py | 2 +- website/helpers/contact.py | 4 ++-- website/templates/js/contact.js | 7 ++++++- 4 files changed, 14 insertions(+), 19 deletions(-) diff --git a/selling/doctype/lead/get_leads.py b/selling/doctype/lead/get_leads.py index c376f450a4a..c63468e2f04 100644 --- a/selling/doctype/lead/get_leads.py +++ b/selling/doctype/lead/get_leads.py @@ -9,17 +9,8 @@ from core.doctype.communication.communication import make def add_sales_communication(subject, content, sender, real_name, mail=None, status="Open", date=None): - def set_status(doctype, name): - w = webnotes.bean(doctype, name) - w.ignore_permissions = True - w.doc.status = is_system_user and "Replied" or status - w.doc.save() - if mail: - mail.save_attachments_in_doc(w.doc) - lead_name = webnotes.conn.get_value("Lead", {"email_id": sender}) contact_name = webnotes.conn.get_value("Contact", {"email_id": sender}) - is_system_user = webnotes.conn.get_value("Profile", sender) if not (lead_name or contact_name): # none, create a new Lead @@ -34,14 +25,13 @@ def add_sales_communication(subject, content, sender, real_name, mail=None, lead.insert() lead_name = lead.doc.name - make(content=content, sender=sender, subject=subject, + message = make(content=content, sender=sender, subject=subject, lead=lead_name, contact=contact_name, date=date) - if contact_name: - set_status("Contact", contact_name) - elif lead_name: - set_status("Lead", lead_name) - + if mail: + # save attachments to parent if from mail + bean = webnotes.bean("Contact" if contact_name else "Lead", contact_name or lead_name) + mail.save_attachments_in_doc(bean.doc) class SalesMailbox(POP3Mailbox): def setup(self, args=None): diff --git a/utilities/doctype/contact/contact.py b/utilities/doctype/contact/contact.py index 89cfc8e0df8..961bb52153a 100644 --- a/utilities/doctype/contact/contact.py +++ b/utilities/doctype/contact/contact.py @@ -7,7 +7,7 @@ from webnotes.utils import cstr from utilities.transaction_base import TransactionBase -class DocType(TransactionBase): +class DocType(TransactionBase): def __init__(self, doc, doclist=[]): self.doc = doc self.doclist = doclist diff --git a/website/helpers/contact.py b/website/helpers/contact.py index 05ae4f797e1..35446a3d241 100644 --- a/website/helpers/contact.py +++ b/website/helpers/contact.py @@ -20,7 +20,7 @@ def send_message(subject="Website Query", message="", sender="", status="Open"): # make lead / communication from selling.doctype.lead.get_leads import add_sales_communication - add_sales_communication(subject or "Website Query", message, sender, sender, + message = add_sales_communication(subject or "Website Query", message, sender, sender, mail=None, status=status) # guest method, cap max writes per hour @@ -29,4 +29,4 @@ def send_message(subject="Website Query", message="", sender="", status="Open"): webnotes.response["message"] = "Sorry: we believe we have received an unreasonably high number of requests of this kind. Please try later" return - webnotes.response["message"] = 'Thank You' \ No newline at end of file + webnotes.response.status = "okay" diff --git a/website/templates/js/contact.js b/website/templates/js/contact.js index a28abba2466..caec94512a7 100644 --- a/website/templates/js/contact.js +++ b/website/templates/js/contact.js @@ -26,7 +26,12 @@ $(document).ready(function() { sender: email, message: message, callback: function(r) { - msgprint(r.message); + if(r.status==="okay") { + msgprint(r.message or "Sent") + } else { + msgprint("There were errors"); + console.log(r.exc); + } $(':input').val(''); } }); From 1c8ec406aec8d108d4025fc04a8a270188cf4f8b Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 29 Aug 2013 13:58:47 +0530 Subject: [PATCH 16/34] [fix] [minor] lead validate --- selling/doctype/lead/lead.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/selling/doctype/lead/lead.py b/selling/doctype/lead/lead.py index b2016aa7a90..2bf1aa38457 100644 --- a/selling/doctype/lead/lead.py +++ b/selling/doctype/lead/lead.py @@ -39,17 +39,14 @@ class DocType(SellingController): def validate(self): if self.doc.status == 'Lead Lost' and not self.doc.order_lost_reason: - msgprint("Please Enter Lost Reason under More Info section") - raise Exception + webnotes.throw("Please Enter Lost Reason under More Info section") if self.doc.source == 'Campaign' and not self.doc.campaign_name and session['user'] != 'Guest': - msgprint("Please specify campaign name") - raise Exception + webnotes.throw("Please specify campaign name") if self.doc.email_id: if not validate_email_add(self.doc.email_id): - msgprint('Please enter valid email id.') - raise Exception + webnotes.throw('Please enter valid email id.') def on_update(self): self.check_email_id_is_unique() From e752e771e5212ddd4a0217b723ef99c3264e636c Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 29 Aug 2013 15:14:37 +0530 Subject: [PATCH 17/34] [communications] [minor] Code cleanup so it can be extended by custom script --- website/css/website.css | 1 + 1 file changed, 1 insertion(+) diff --git a/website/css/website.css b/website/css/website.css index 88bf7fd3183..015e500d31f 100644 --- a/website/css/website.css +++ b/website/css/website.css @@ -56,6 +56,7 @@ img { div.web-footer { padding-top: 10px; + padding-bottom: 20px; } .web-footer-menu ul { From e89c533eaaa5feedefe1190b1d67e0be1f46b733 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 29 Aug 2013 15:32:46 +0530 Subject: [PATCH 18/34] [sales/purchase] [minor] Set tax table on insert if tax master set, but table missing --- controllers/buying_controller.py | 3 ++- controllers/selling_controller.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/controllers/buying_controller.py b/controllers/buying_controller.py index 63244c5fcec..043099a70df 100644 --- a/controllers/buying_controller.py +++ b/controllers/buying_controller.py @@ -17,7 +17,6 @@ class BuyingController(StockController): def onload_post_render(self): # contact, address, item details self.set_missing_values() - self.set_taxes("purchase_tax_details", "purchase_other_charges") def validate(self): super(BuyingController, self).validate() @@ -40,6 +39,8 @@ class BuyingController(StockController): self.doc.fields[fieldname] = val self.set_missing_item_details(get_item_details) + if self.doc.fields.get("__islocal"): + self.set_taxes("purchase_tax_details", "purchase_other_charges") def set_supplier_from_item_default(self): if self.meta.get_field("supplier") and not self.doc.supplier: diff --git a/controllers/selling_controller.py b/controllers/selling_controller.py index 086c42e3981..4b4b1c71a3c 100644 --- a/controllers/selling_controller.py +++ b/controllers/selling_controller.py @@ -14,15 +14,15 @@ class SellingController(StockController): def onload_post_render(self): # contact, address, item details and pos details (if applicable) self.set_missing_values() - self.set_taxes("other_charges", "charge") def set_missing_values(self, for_validate=False): super(SellingController, self).set_missing_values(for_validate) # set contact and address details for customer, if they are not mentioned self.set_missing_lead_customer_details() - self.set_price_list_and_item_details() + if self.doc.fields.get("__islocal"): + self.set_taxes("other_charges", "charge") def set_missing_lead_customer_details(self): if self.doc.customer: From cf90b6f3aee7f1f20132c1641b5824004ea54bac Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 29 Aug 2013 19:01:34 +0530 Subject: [PATCH 19/34] [communication] [minor] ignore status updates for support tickets --- website/css/website.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/website/css/website.css b/website/css/website.css index 015e500d31f..68fd7440069 100644 --- a/website/css/website.css +++ b/website/css/website.css @@ -18,10 +18,6 @@ img { padding-bottom: 30px; } -.outer { - padding: 0px 20px; -} - .navbar { margin: 0px -20px; } From f55631a51aed35b51cd6cfdfd3855cf07dbfdcbb Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 29 Aug 2013 22:12:17 +0530 Subject: [PATCH 20/34] [website] [style] [minor] Navbar goes out --- website/templates/html/outer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/templates/html/outer.html b/website/templates/html/outer.html index 0f0f4002ea1..462f4dd7969 100644 --- a/website/templates/html/outer.html +++ b/website/templates/html/outer.html @@ -1,6 +1,7 @@ {% extends "lib/templates/base.html" %} {% block body %} + {% include "app/website/templates/html/navbar.html" %}
{% if shopping_cart_enabled -%} @@ -23,7 +24,6 @@
{{ banner_html }}
{% endif %}
- {% include "app/website/templates/html/navbar.html" %}
{%- block content -%} {%- endblock -%} From 010de37fcbb0e5a08c6b6327240a72c1ea88990b Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 29 Aug 2013 22:28:58 +0530 Subject: [PATCH 21/34] [website] [style] [minor] padding in blog categories --- utilities/demo/demo-login.html | 2 +- website/templates/html/blog_footer.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/utilities/demo/demo-login.html b/utilities/demo/demo-login.html index ef24678e27a..4595cb7d355 100644 --- a/utilities/demo/demo-login.html +++ b/utilities/demo/demo-login.html @@ -8,7 +8,7 @@

+ class="form-control" placeholder="Your Email Id (optional)">