Skip to content

Commit fc3ee12

Browse files
authored
perf: cache FormMeta directly (frappe#18165)
* perf: cache `FormMeta` directly * perf: check if `dt` is table, use `db.get_value` instead of `get_all`
1 parent 7f1655f commit fc3ee12

File tree

3 files changed

+15
-12
lines changed

3 files changed

+15
-12
lines changed

frappe/desk/form/load.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,9 @@ def getdoctype(doctype, with_parent=False, cached_timestamp=None):
6464
parent_dt = None
6565

6666
# with parent (called from report builder)
67-
if with_parent:
68-
parent_dt = frappe.model.meta.get_parent_dt(doctype)
69-
if parent_dt:
70-
docs = get_meta_bundle(parent_dt)
71-
frappe.response["parent_dt"] = parent_dt
67+
if with_parent and (parent_dt := frappe.model.meta.get_parent_dt(doctype)):
68+
docs = get_meta_bundle(parent_dt)
69+
frappe.response["parent_dt"] = parent_dt
7270

7371
if not docs:
7472
docs = get_meta_bundle(doctype)

frappe/desk/form/meta.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,9 @@ def get_meta(doctype, cached=True):
3636
# don't cache for developer mode as js files, templates may be edited
3737
if cached and not frappe.conf.developer_mode:
3838
meta = frappe.cache().hget("form_meta", doctype)
39-
if meta:
40-
meta = FormMeta(meta)
41-
else:
39+
if not meta:
4240
meta = FormMeta(doctype)
43-
frappe.cache().hset("form_meta", doctype, meta.as_dict())
41+
frappe.cache().hset("form_meta", doctype, meta)
4442
else:
4543
meta = FormMeta(doctype)
4644

frappe/model/meta.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -666,10 +666,17 @@ def is_single(doctype):
666666

667667

668668
def get_parent_dt(dt):
669-
parent_dt = frappe.get_all(
670-
"DocField", "parent", dict(fieldtype=["in", frappe.model.table_fields], options=dt), limit=1
669+
if not frappe.is_table(dt):
670+
return ""
671+
672+
return (
673+
frappe.db.get_value(
674+
"DocField",
675+
{"fieldtype": ("in", frappe.model.table_fields), "options": dt},
676+
"parent",
677+
)
678+
or ""
671679
)
672-
return parent_dt and parent_dt[0].parent or ""
673680

674681

675682
def set_fieldname(field_id, fieldname):

0 commit comments

Comments
 (0)