Skip to content

Commit

Permalink
Merge pull request #41871 from blaggacao/perf/reduce-critical-path
Browse files Browse the repository at this point in the history
perf: hot path in page load
  • Loading branch information
blaggacao committed Sep 5, 2024
2 parents e93ff9b + 41e395a commit 2ae1704
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 64 deletions.
104 changes: 58 additions & 46 deletions erpnext/accounts/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,18 +53,28 @@ class PaymentEntryUnlinkError(frappe.ValidationError):

@frappe.whitelist()
def get_fiscal_year(
date=None, fiscal_year=None, label="Date", verbose=1, company=None, as_dict=False, boolean=False
date=None,
fiscal_year=None,
label="Date",
verbose=1,
company=None,
as_dict=False,
boolean=None,
raise_on_missing=True,
):
if isinstance(raise_on_missing, str):
raise_on_missing = loads(raise_on_missing)

# backwards compat
if isinstance(boolean, str):
boolean = loads(boolean)
if boolean is not None:
raise_on_missing = not boolean

fiscal_years = get_fiscal_years(
date, fiscal_year, label, verbose, company, as_dict=as_dict, boolean=boolean
date, fiscal_year, label, verbose, company, as_dict=as_dict, raise_on_missing=raise_on_missing
)
if boolean:
return fiscal_years
else:
return fiscal_years[0]
return False if not fiscal_years else fiscal_years[0]


def get_fiscal_years(
Expand All @@ -74,8 +84,48 @@ def get_fiscal_years(
verbose=1,
company=None,
as_dict=False,
boolean=False,
boolean=None,
raise_on_missing=True,
):
if transaction_date:
transaction_date = getdate(transaction_date)
# backwards compat
if boolean is not None:
raise_on_missing = not boolean

all_fiscal_years = _get_fiscal_years(company=company)

# No restricting selectors
if not transaction_date and not fiscal_year:
return all_fiscal_years

for fy in all_fiscal_years:
if (fiscal_year and fy.name == fiscal_year) or (
transaction_date
and getdate(fy.year_start_date) <= transaction_date
and getdate(fy.year_end_date) >= transaction_date
):
if as_dict:
return (fy,)
else:
return ((fy.name, fy.year_start_date, fy.year_end_date),)

# No match for restricting selectors
if raise_on_missing:
error_msg = _("""{0} {1} is not in any active Fiscal Year""").format(
label, formatdate(transaction_date)
)
if company:
error_msg = _("""{0} for {1}""").format(error_msg, frappe.bold(company))

if verbose == 1:
frappe.msgprint(error_msg)

raise FiscalYearError(error_msg)
return []


def _get_fiscal_years(company=None):
fiscal_years = frappe.cache().hget("fiscal_years", company) or []

if not fiscal_years:
Expand All @@ -86,9 +136,6 @@ def get_fiscal_years(
frappe.qb.from_(FY).select(FY.name, FY.year_start_date, FY.year_end_date).where(FY.disabled == 0)
)

if fiscal_year:
query = query.where(FY.name == fiscal_year)

if company:
FYC = DocType("Fiscal Year Company")
query = query.where(
Expand All @@ -105,42 +152,7 @@ def get_fiscal_years(
fiscal_years = query.run(as_dict=True)

frappe.cache().hset("fiscal_years", company, fiscal_years)

if not transaction_date and not fiscal_year:
return fiscal_years

if transaction_date:
transaction_date = getdate(transaction_date)

for fy in fiscal_years:
matched = False
if fiscal_year and fy.name == fiscal_year:
matched = True

if (
transaction_date
and getdate(fy.year_start_date) <= transaction_date
and getdate(fy.year_end_date) >= transaction_date
):
matched = True

if matched:
if as_dict:
return (fy,)
else:
return ((fy.name, fy.year_start_date, fy.year_end_date),)

error_msg = _("""{0} {1} is not in any active Fiscal Year""").format(label, formatdate(transaction_date))
if company:
error_msg = _("""{0} for {1}""").format(error_msg, frappe.bold(company))

if boolean:
return False

if verbose == 1:
frappe.msgprint(error_msg)

raise FiscalYearError(error_msg)
return fiscal_years


@frappe.whitelist()
Expand Down
5 changes: 2 additions & 3 deletions erpnext/public/js/financial_statements.js
Original file line number Diff line number Diff line change
Expand Up @@ -271,11 +271,10 @@ function get_filters() {
let fy_filters = filters.filter((x) => {
return ["from_fiscal_year", "to_fiscal_year"].includes(x.fieldname);
});
let fiscal_year = erpnext.utils.get_fiscal_year(frappe.datetime.get_today(), false, true);
let fiscal_year = erpnext.utils.get_fiscal_year(frappe.datetime.get_today(), false, false);
if (fiscal_year) {
let fy = erpnext.utils.get_fiscal_year(frappe.datetime.get_today(), false, false);
fy_filters.forEach((x) => {
x.default = fy;
x.default = fiscal_year;
});
}

Expand Down
40 changes: 25 additions & 15 deletions erpnext/public/js/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -424,7 +424,7 @@ $.extend(erpnext.utils, {
});
},

get_fiscal_year: function (date, with_dates = false, boolean = false) {
get_fiscal_year: function (date, with_dates = false, raise_on_missing = true) {
if (!frappe.boot.setup_complete) {
return;
}
Expand All @@ -433,20 +433,30 @@ $.extend(erpnext.utils, {
}

let fiscal_year = "";
frappe.call({
method: "erpnext.accounts.utils.get_fiscal_year",
args: {
date: date,
boolean: boolean,
},
async: false,
callback: function (r) {
if (r.message) {
if (with_dates) fiscal_year = r.message;
else fiscal_year = r.message[0];
}
},
});
if (
frappe.boot.current_fiscal_year &&
date >= frappe.boot.current_fiscal_year[1] &&
date <= frappe.boot.current_fiscal_year[2]
) {
if (with_dates) fiscal_year = frappe.boot.current_fiscal_year;
else fiscal_year = frappe.boot.current_fiscal_year[0];
} else {
frappe.call({
method: "erpnext.accounts.utils.get_fiscal_year",
type: "GET", // make it cacheable
args: {
date: date,
raise_on_missing: raise_on_missing,
},
async: false,
callback: function (r) {
if (r.message) {
if (with_dates) fiscal_year = r.message;
else fiscal_year = r.message[0];
}
},
});
}
return fiscal_year;
},
});
Expand Down
5 changes: 5 additions & 0 deletions erpnext/startup/boot.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import frappe
from frappe.utils import cint

import erpnext.accounts.utils


def boot_session(bootinfo):
"""boot session - send website info if guest"""
Expand Down Expand Up @@ -52,6 +54,9 @@ def boot_session(bootinfo):

party_account_types = frappe.db.sql(""" select name, ifnull(account_type, '') from `tabParty Type`""")
bootinfo.party_account_types = frappe._dict(party_account_types)
fiscal_year = erpnext.accounts.utils.get_fiscal_years(frappe.utils.nowdate(), raise_on_missing=False)
if fiscal_year:
bootinfo.current_fiscal_year = fiscal_year[0]

bootinfo.sysdefaults.demo_company = frappe.db.get_single_value("Global Defaults", "demo_company")

Expand Down

0 comments on commit 2ae1704

Please sign in to comment.