From 9a33bc6417c1bc7d5f282c4c20280c74f9926d35 Mon Sep 17 00:00:00 2001 From: Nabin Hait <nabinhait@gmail.com> Date: Thu, 9 Aug 2018 10:47:09 +0530 Subject: [PATCH] optimizing transactions by caching --- erpnext/accounts/doctype/account/account.py | 2 +- .../doctype/sales_invoice/sales_invoice.py | 14 ++++----- erpnext/accounts/party.py | 30 +++++++++---------- erpnext/controllers/accounts_controller.py | 1 + erpnext/selling/doctype/customer/customer.py | 4 +-- erpnext/stock/get_item_details.py | 2 +- 6 files changed, 27 insertions(+), 26 deletions(-) diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py index 7669eded2e..566baa55f5 100644 --- a/erpnext/accounts/doctype/account/account.py +++ b/erpnext/accounts/doctype/account/account.py @@ -179,7 +179,7 @@ def get_account_currency(account): if not account: return def generator(): - account_currency, company = frappe.db.get_value("Account", account, ["account_currency", "company"]) + account_currency, company = frappe.get_cached_value("Account", account, ["account_currency", "company"]) if not account_currency: account_currency = frappe.get_cached_value('Company', company, "default_currency") diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 2a17d80bf3..5d7e79b823 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -259,7 +259,7 @@ class SalesInvoice(SellingController): from erpnext.selling.doctype.customer.customer import check_credit_limit validate_against_credit_limit = False - bypass_credit_limit_check_at_sales_order = cint(frappe.db.get_value("Customer", self.customer, + bypass_credit_limit_check_at_sales_order = cint(frappe.get_cached_value("Customer", self.customer, "bypass_credit_limit_check_at_sales_order")) if bypass_credit_limit_check_at_sales_order: validate_against_credit_limit = True @@ -388,7 +388,7 @@ class SalesInvoice(SellingController): return frappe.db.sql("select abbr from tabCompany where name=%s", self.company)[0][0] def validate_debit_to_acc(self): - account = frappe.db.get_value("Account", self.debit_to, + account = frappe.get_cached_value("Account", self.debit_to, ["account_type", "report_type", "account_currency"], as_dict=True) if not account: @@ -460,9 +460,9 @@ class SalesInvoice(SellingController): """check in manage account if sales order / delivery note required or not.""" dic = {'Sales Order':['so_required', 'is_pos'],'Delivery Note':['dn_required', 'update_stock']} for i in dic: - if frappe.db.get_value('Selling Settings', None, dic[i][0]) == 'Yes': + if frappe.db.get_single_value('Selling Settings', dic[i][0]) == 'Yes': for d in self.get('items'): - if frappe.db.get_value('Item', d.item_code, 'is_stock_item') == 1 \ + if frappe.get_cached_value('Item', d.item_code, 'is_stock_item') == 1 \ and not d.get(i.lower().replace(' ','_')) and not self.get(dic[i][1]): msgprint(_("{0} is mandatory for Item {1}").format(i,d.item_code), raise_exception=1) @@ -1153,7 +1153,7 @@ def validate_inter_company_party(doctype, party, company, inter_company_invoice_ ref_party = doc.supplier if doctype == "Sales Invoice" else doc.customer if not frappe.db.get_value(partytype, {"represents_company": doc.company}, "name") == party: frappe.throw(_("Invalid {0} for Inter Company Invoice.").format(partytype)) - if not frappe.db.get_value(ref_partytype, {"name": ref_party}, "represents_company") == company: + if not frappe.get_cached_value(ref_partytype, ref_party, "represents_company") == company: frappe.throw(_("Invalid Company for Inter Company Invoice.")) elif frappe.db.get_value(partytype, {"name": party, internal: 1}, "name") == party: @@ -1260,10 +1260,10 @@ def set_account_for_mode_of_payment(self): def get_inter_company_details(doc, doctype): if doctype == "Sales Invoice": party = frappe.db.get_value("Supplier", {"disabled": 0, "is_internal_supplier": 1, "represents_company": doc.company}, "name") - company = frappe.db.get_value("Customer", {"name": doc.customer}, "represents_company") + company = frappe.get_cached_value("Customer", doc.customer, "represents_company") else: party = frappe.db.get_value("Customer", {"disabled": 0, "is_internal_customer": 1, "represents_company": doc.company}, "name") - company = frappe.db.get_value("Supplier", {"name": doc.supplier}, "represents_company") + company = frappe.get_cached_value("Supplier", doc.supplier, "represents_company") return { "party": party, diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 2619cd5049..454c52b2aa 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -142,8 +142,8 @@ def get_default_price_list(party): return party.default_price_list if party.doctype == "Customer": - price_list = frappe.db.get_value("Customer Group", - party.customer_group, "default_price_list", cache=True) + price_list = frappe.get_cached_value("Customer Group", + party.customer_group, "default_price_list") if price_list: return price_list @@ -203,7 +203,7 @@ def get_party_account(party_type, party, company): if not account and party_type in ['Customer', 'Supplier']: party_group_doctype = "Customer Group" if party_type=="Customer" else "Supplier Group" - group = frappe.db.get_value(party_type, party, scrub(party_group_doctype)) + group = frappe.get_cached_value(party_type, party, scrub(party_group_doctype)) account = frappe.db.get_value("Party Account", {"parenttype": party_group_doctype, "parent": group, "company": company}, "account") @@ -215,7 +215,7 @@ def get_party_account(party_type, party, company): existing_gle_currency = get_party_gle_currency(party_type, party, company) if existing_gle_currency: if account: - account_currency = frappe.db.get_value("Account", account, "account_currency") + account_currency = frappe.db.get_value("Account", account, "account_currency", cache=True) if (account and account_currency != existing_gle_currency) or not account: account = get_party_gle_account(party_type, party, company) @@ -224,7 +224,7 @@ def get_party_account(party_type, party, company): def get_party_account_currency(party_type, party, company): def generator(): party_account = get_party_account(party_type, party, company) - return frappe.db.get_value("Account", party_account, "account_currency") + return frappe.db.get_value("Account", party_account, "account_currency", cache=True) return frappe.local_cache("party_account_currency", (party_type, party, company), generator) @@ -271,7 +271,7 @@ def validate_party_accounts(doc): else: companies.append(account.company) - party_account_currency = frappe.db.get_value("Account", account.account, "account_currency") + party_account_currency = frappe.db.get_value("Account", account.account, "account_currency", cache=True) existing_gle_currency = get_party_gle_currency(doc.doctype, doc.name, account.company) company_default_currency = frappe.get_cached_value('Company', frappe.db.get_default("Company"), "default_currency") @@ -296,8 +296,8 @@ def get_due_date(posting_date, party_type, party, company=None, bill_date=None): due_date = get_due_date_from_template(template_name, posting_date, bill_date).strftime("%Y-%m-%d") else: if party_type == "Supplier": - supplier_group = frappe.db.get_value(party_type, party, fieldname="supplier_group") - template_name = frappe.db.get_value("Supplier Group", supplier_group, fieldname="payment_terms") + supplier_group = frappe.get_cached_value(party_type, party, "supplier_group") + template_name = frappe.get_cached_value("Supplier Group", supplier_group, "payment_terms") if template_name: due_date = get_due_date_from_template(template_name, posting_date, bill_date).strftime("%Y-%m-%d") # If due date is calculated from bill_date, check this condition @@ -387,19 +387,19 @@ def get_pyt_term_template(party_name, party_type, company=None): return template = None if party_type == 'Customer': - customer = frappe.db.get_value("Customer", party_name, + customer = frappe.get_cached_value("Customer", party_name, fieldname=['payment_terms', "customer_group"], as_dict=1) template = customer.payment_terms if not template and customer.customer_group: - template = frappe.db.get_value("Customer Group", - customer.customer_group, fieldname='payment_terms') + template = frappe.get_cached_value("Customer Group", + customer.customer_group, 'payment_terms') else: - supplier = frappe.db.get_value("Supplier", party_name, + supplier = frappe.get_cached_value("Supplier", party_name, fieldname=['payment_terms', "supplier_group"], as_dict=1) template = supplier.payment_terms if not template and supplier.supplier_group: - template = frappe.db.get_value("Supplier Group", supplier.supplier_group, fieldname='payment_terms') + template = frappe.get_cached_value("Supplier Group", supplier.supplier_group, 'payment_terms') if not template and company: template = frappe.get_cached_value('Company', company, fieldname='payment_terms') @@ -408,11 +408,11 @@ def get_pyt_term_template(party_name, party_type, company=None): def validate_party_frozen_disabled(party_type, party_name): if party_type and party_name: if party_type in ("Customer", "Supplier"): - party = frappe.db.get_value(party_type, party_name, ["is_frozen", "disabled"], as_dict=True) + party = frappe.get_cached_value(party_type, party_name, ["is_frozen", "disabled"], as_dict=True) if party.disabled: frappe.throw(_("{0} {1} is disabled").format(party_type, party_name), PartyDisabled) elif party.get("is_frozen"): - frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,'frozen_accounts_modifier') + frozen_accounts_modifier = frappe.db.get_single_value( 'Accounts Settings', 'frozen_accounts_modifier') if not frozen_accounts_modifier in frappe.get_roles(): frappe.throw(_("{0} {1} is frozen").format(party_type, party_name), PartyFrozen) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index dc8c1e4218..122e66db87 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -605,6 +605,7 @@ class AccountsController(TransactionBase): @property def company_abbr(self): + self._abbr = None if not hasattr(self, "_abbr") and self.company: self._abbr = frappe.get_cached_value('Company', self.company, "abbr") diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index fc88bf889b..bd01ec9a91 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -315,11 +315,11 @@ def get_credit_limit(customer, company): credit_limit = None if customer: - credit_limit, customer_group = frappe.db.get_value("Customer", + credit_limit, customer_group = frappe.get_cached_value("Customer", customer, ["credit_limit", "customer_group"]) if not credit_limit: - credit_limit = frappe.db.get_value("Customer Group", customer_group, "credit_limit") + credit_limit = frappe.get_cached_value("Customer Group", customer_group, "credit_limit") if not credit_limit: credit_limit = frappe.get_cached_value('Company', company, "credit_limit") diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index 198940c18c..e73c6270af 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -547,7 +547,7 @@ def get_party_item_code(args, item_doc, out): if customer_item_code: out.customer_item_code = customer_item_code[0].ref_code else: - customer_group = frappe.db.get_value("Customer", args.customer, "customer_group", cache=True) + customer_group = frappe.get_cached_value("Customer", args.customer, "customer_group") customer_group_item_code = item_doc.get("customer_items", {"customer_group": customer_group}) if customer_group_item_code and not customer_group_item_code[0].customer_name: out.customer_item_code = customer_group_item_code[0].ref_code