1+ from typing import List
12import frappe
23from frappe .model import default_fields , no_value_fields
34from frappe .model .meta import Meta
@@ -8,6 +9,10 @@ def get_allowed_fieldnames_for_doctype(doctype: str, parent_doctype: str = None)
89 Gets a list of fieldnames that's allowed for the current User to
910 read on the specified doctype. This includes default_fields
1011 """
12+ _from_locals = _get_allowed_fieldnames_from_locals (doctype , parent_doctype )
13+ if _from_locals is not None :
14+ return _from_locals
15+
1116 fieldnames = list (default_fields )
1217 fieldnames .remove ("doctype" )
1318
@@ -25,6 +30,12 @@ def get_allowed_fieldnames_for_doctype(doctype: str, parent_doctype: str = None)
2530
2631 fieldnames .append (df .fieldname )
2732
33+ _set_allowed_fieldnames_to_locals (
34+ allowed_fields = fieldnames ,
35+ doctype = doctype ,
36+ parent_doctype = parent_doctype
37+ )
38+
2839 return fieldnames
2940
3041
@@ -45,3 +56,30 @@ def _get_permlevel_read_access(meta: Meta):
4556 _has_access_to .append (perm .get ("permlevel" ))
4657
4758 return _has_access_to
59+
60+
61+ def _get_allowed_fieldnames_from_locals (doctype : str , parent_doctype : str = None ):
62+
63+ if not hasattr (frappe .local , "permlevel_fields" ):
64+ frappe .local .permlevel_fields = dict ()
65+
66+ k = doctype
67+ if parent_doctype :
68+ k = (doctype , parent_doctype )
69+
70+ return frappe .local .permlevel_fields .get (k )
71+
72+
73+ def _set_allowed_fieldnames_to_locals (
74+ allowed_fields : List [str ],
75+ doctype : str ,
76+ parent_doctype : str = None ):
77+
78+ if not hasattr (frappe .local , "permlevel_fields" ):
79+ frappe .local .permlevel_fields = dict ()
80+
81+ k = doctype
82+ if parent_doctype :
83+ k = (doctype , parent_doctype )
84+
85+ frappe .local .permlevel_fields [k ] = allowed_fields
0 commit comments