Skip to content

Commit df8399f

Browse files
sagarvoraankush
authored andcommitted
perf: initialise field map when initialising meta
1 parent fc3ee12 commit df8399f

File tree

1 file changed

+43
-38
lines changed

1 file changed

+43
-38
lines changed

frappe/model/meta.py

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,20 @@
4040
from frappe.modules import load_doctype_module
4141
from frappe.utils import cast, cint, cstr
4242

43+
DEFAULT_FIELD_LABELS = {
44+
"name": lambda: _("ID"),
45+
"creation": lambda: _("Created On"),
46+
"docstatus": lambda: _("Document Status"),
47+
"idx": lambda: _("Index"),
48+
"modified": lambda: _("Last Updated On"),
49+
"modified_by": lambda: _("Last Updated By"),
50+
"owner": lambda: _("Created By"),
51+
"_user_tags": lambda: _("Tags"),
52+
"_liked_by": lambda: _("Liked By"),
53+
"_comments": lambda: _("Comments"),
54+
"_assign": lambda: _("Assigned To"),
55+
}
56+
4357

4458
def get_meta(doctype, cached=True) -> "Meta":
4559
if cached:
@@ -86,32 +100,33 @@ def load_doctype_from_file(doctype):
86100
class Meta(Document):
87101
_metaclass = True
88102
default_fields = list(default_fields)[1:]
89-
special_doctypes = (
103+
special_doctypes = {
90104
"DocField",
91105
"DocPerm",
92106
"DocType",
93107
"Module Def",
94108
"DocType Action",
95109
"DocType Link",
96110
"DocType State",
97-
)
111+
}
98112
standard_set_once_fields = [
99113
frappe._dict(fieldname="creation", fieldtype="Datetime"),
100114
frappe._dict(fieldname="owner", fieldtype="Data"),
101115
]
102116

103117
def __init__(self, doctype):
104-
self._fields = {}
118+
# from cache
105119
if isinstance(doctype, dict):
106120
super().__init__(doctype)
121+
self.init_field_map()
122+
return
107123

108-
elif isinstance(doctype, Document):
124+
if isinstance(doctype, Document):
109125
super().__init__(doctype.as_dict())
110-
self.process()
111-
112126
else:
113127
super().__init__("DocType", doctype)
114-
self.process()
128+
129+
self.process()
115130

116131
def load_from_db(self):
117132
try:
@@ -126,10 +141,12 @@ def process(self):
126141
# don't process for special doctypes
127142
# prevent's circular dependency
128143
if self.name in self.special_doctypes:
144+
self.init_field_map()
129145
return
130146

131147
self.add_custom_fields()
132148
self.apply_property_setters()
149+
self.init_field_map()
133150
self.sort_fields()
134151
self.get_valid_columns()
135152
self.set_custom_permissions()
@@ -233,36 +250,24 @@ def get_table_field_doctype(self, fieldname):
233250

234251
def get_field(self, fieldname):
235252
"""Return docfield from meta"""
236-
if not self._fields:
237-
for f in self.get("fields"):
238-
self._fields[f.fieldname] = f
239253

240254
return self._fields.get(fieldname)
241255

242256
def has_field(self, fieldname):
243257
"""Returns True if fieldname exists"""
244-
return True if self.get_field(fieldname) else False
258+
259+
return fieldname in self._fields
245260

246261
def get_label(self, fieldname):
247262
"""Get label of the given fieldname"""
248-
df = self.get_field(fieldname)
249-
if df:
250-
label = df.label
251-
else:
252-
label = {
253-
"name": _("ID"),
254-
"creation": _("Created On"),
255-
"docstatus": _("Document Status"),
256-
"idx": _("Index"),
257-
"modified": _("Last Updated On"),
258-
"modified_by": _("Last Updated By"),
259-
"owner": _("Created By"),
260-
"_user_tags": _("Tags"),
261-
"_liked_by": _("Liked By"),
262-
"_comments": _("Comments"),
263-
"_assign": _("Assigned To"),
264-
}.get(fieldname) or _("No Label")
265-
return label
263+
264+
if df := self.get_field(fieldname):
265+
return df.label
266+
267+
if fieldname in DEFAULT_FIELD_LABELS:
268+
return DEFAULT_FIELD_LABELS[fieldname]()
269+
270+
return _("No Label")
266271

267272
def get_options(self, fieldname):
268273
return self.get_field(fieldname).options
@@ -273,12 +278,9 @@ def get_link_doctype(self, fieldname):
273278
if df.fieldtype == "Link":
274279
return df.options
275280

276-
elif df.fieldtype == "Dynamic Link":
281+
if df.fieldtype == "Dynamic Link":
277282
return self.get_options(df.options)
278283

279-
else:
280-
return None
281-
282284
def get_search_fields(self):
283285
search_fields = self.search_fields or "name"
284286
search_fields = [d.strip() for d in search_fields.split(",")]
@@ -340,20 +342,20 @@ def get_translatable_fields(self):
340342

341343
def is_translatable(self, fieldname):
342344
"""Return true of false given a field"""
343-
field = self.get_field(fieldname)
344-
return field and field.translatable
345+
346+
if field := self.get_field(fieldname):
347+
return field.translatable
345348

346349
def get_workflow(self):
347350
return get_workflow_name(self.name)
348351

349352
def get_naming_series_options(self) -> list[str]:
350353
"""Get list naming series options."""
351354

352-
field = self.get_field("naming_series")
353-
if field:
355+
if field := self.get_field("naming_series"):
354356
options = field.options or ""
355-
356357
return options.split("\n")
358+
357359
return []
358360

359361
def add_custom_fields(self):
@@ -450,6 +452,9 @@ def add_custom_links_and_actions(self):
450452

451453
self.set(fieldname, new_list)
452454

455+
def init_field_map(self):
456+
self._fields = {field.fieldname: field for field in self.fields}
457+
453458
def sort_fields(self):
454459
"""sort on basis of insert_after"""
455460
custom_fields = sorted(self.get_custom_fields(), key=lambda df: df.idx)

0 commit comments

Comments
 (0)