40
40
from frappe .modules import load_doctype_module
41
41
from frappe .utils import cast , cint , cstr
42
42
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
+
43
57
44
58
def get_meta (doctype , cached = True ) -> "Meta" :
45
59
if cached :
@@ -86,32 +100,33 @@ def load_doctype_from_file(doctype):
86
100
class Meta (Document ):
87
101
_metaclass = True
88
102
default_fields = list (default_fields )[1 :]
89
- special_doctypes = (
103
+ special_doctypes = {
90
104
"DocField" ,
91
105
"DocPerm" ,
92
106
"DocType" ,
93
107
"Module Def" ,
94
108
"DocType Action" ,
95
109
"DocType Link" ,
96
110
"DocType State" ,
97
- )
111
+ }
98
112
standard_set_once_fields = [
99
113
frappe ._dict (fieldname = "creation" , fieldtype = "Datetime" ),
100
114
frappe ._dict (fieldname = "owner" , fieldtype = "Data" ),
101
115
]
102
116
103
117
def __init__ (self , doctype ):
104
- self . _fields = {}
118
+ # from cache
105
119
if isinstance (doctype , dict ):
106
120
super ().__init__ (doctype )
121
+ self .init_field_map ()
122
+ return
107
123
108
- elif isinstance (doctype , Document ):
124
+ if isinstance (doctype , Document ):
109
125
super ().__init__ (doctype .as_dict ())
110
- self .process ()
111
-
112
126
else :
113
127
super ().__init__ ("DocType" , doctype )
114
- self .process ()
128
+
129
+ self .process ()
115
130
116
131
def load_from_db (self ):
117
132
try :
@@ -126,10 +141,12 @@ def process(self):
126
141
# don't process for special doctypes
127
142
# prevent's circular dependency
128
143
if self .name in self .special_doctypes :
144
+ self .init_field_map ()
129
145
return
130
146
131
147
self .add_custom_fields ()
132
148
self .apply_property_setters ()
149
+ self .init_field_map ()
133
150
self .sort_fields ()
134
151
self .get_valid_columns ()
135
152
self .set_custom_permissions ()
@@ -233,36 +250,24 @@ def get_table_field_doctype(self, fieldname):
233
250
234
251
def get_field (self , fieldname ):
235
252
"""Return docfield from meta"""
236
- if not self ._fields :
237
- for f in self .get ("fields" ):
238
- self ._fields [f .fieldname ] = f
239
253
240
254
return self ._fields .get (fieldname )
241
255
242
256
def has_field (self , fieldname ):
243
257
"""Returns True if fieldname exists"""
244
- return True if self .get_field (fieldname ) else False
258
+
259
+ return fieldname in self ._fields
245
260
246
261
def get_label (self , fieldname ):
247
262
"""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" )
266
271
267
272
def get_options (self , fieldname ):
268
273
return self .get_field (fieldname ).options
@@ -273,12 +278,9 @@ def get_link_doctype(self, fieldname):
273
278
if df .fieldtype == "Link" :
274
279
return df .options
275
280
276
- elif df .fieldtype == "Dynamic Link" :
281
+ if df .fieldtype == "Dynamic Link" :
277
282
return self .get_options (df .options )
278
283
279
- else :
280
- return None
281
-
282
284
def get_search_fields (self ):
283
285
search_fields = self .search_fields or "name"
284
286
search_fields = [d .strip () for d in search_fields .split ("," )]
@@ -340,20 +342,20 @@ def get_translatable_fields(self):
340
342
341
343
def is_translatable (self , fieldname ):
342
344
"""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
345
348
346
349
def get_workflow (self ):
347
350
return get_workflow_name (self .name )
348
351
349
352
def get_naming_series_options (self ) -> list [str ]:
350
353
"""Get list naming series options."""
351
354
352
- field = self .get_field ("naming_series" )
353
- if field :
355
+ if field := self .get_field ("naming_series" ):
354
356
options = field .options or ""
355
-
356
357
return options .split ("\n " )
358
+
357
359
return []
358
360
359
361
def add_custom_fields (self ):
@@ -450,6 +452,9 @@ def add_custom_links_and_actions(self):
450
452
451
453
self .set (fieldname , new_list )
452
454
455
+ def init_field_map (self ):
456
+ self ._fields = {field .fieldname : field for field in self .fields }
457
+
453
458
def sort_fields (self ):
454
459
"""sort on basis of insert_after"""
455
460
custom_fields = sorted (self .get_custom_fields (), key = lambda df : df .idx )
0 commit comments