Skip to content

Commit ea01ae7

Browse files
committed
fix: cache get_allowed_fieldnames_for_doctype at the request level
1 parent 54e0715 commit ea01ae7

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

frappe_graphql/utils/permissions.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from typing import List
12
import frappe
23
from frappe.model import default_fields, no_value_fields
34
from 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

Comments
 (0)