diff --git a/frappe/model/__init__.py b/frappe/model/__init__.py index f171e4b1be..d7baa0815d 100644 --- a/frappe/model/__init__.py +++ b/frappe/model/__init__.py @@ -192,7 +192,10 @@ def delete_fields(args_dict, delete=0): def get_permitted_fields( - doctype: str, parenttype: str | None = None, user: str | None = None + doctype: str, + parenttype: str | None = None, + user: str | None = None, + permission_type: str | None = None, ) -> list[str]: meta = frappe.get_meta(doctype) valid_columns = meta.get_valid_columns() @@ -204,7 +207,9 @@ def get_permitted_fields( if set(valid_columns).issubset(default_fields): return valid_columns - if permitted_fields := meta.get_permitted_fieldnames(parenttype=parenttype, user=user): + if permitted_fields := meta.get_permitted_fieldnames( + parenttype=parenttype, user=user, permission_type=permission_type + ): meta_fields = meta.default_fields.copy() optional_meta_fields = [x for x in optional_fields if x in valid_columns] diff --git a/frappe/model/meta.py b/frappe/model/meta.py index d8d26c9a71..66a4fe513d 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -532,7 +532,7 @@ class Meta(Document): return self.high_permlevel_fields - def get_permitted_fieldnames(self, parenttype=None, *, user=None): + def get_permitted_fieldnames(self, parenttype=None, *, user=None, permission_type="read"): """Build list of `fieldname` with read perm level and all the higher perm levels defined. Note: If permissions are not defined for DocType, return all the fields with value. @@ -545,7 +545,12 @@ class Meta(Document): if not self.get_permissions(parenttype=parenttype): return self.get_fieldnames_with_value() - permlevel_access = set(self.get_permlevel_access("read", parenttype, user=user)) + if not permission_type: + permission_type = "select" if frappe.only_has_select_perm(self.name, user=user) else "read" + + permlevel_access = set( + self.get_permlevel_access(permission_type=permission_type, parenttype=parenttype, user=user) + ) for df in self.get_fieldnames_with_value(with_field_meta=True, with_virtual_fields=True): if df.permlevel in permlevel_access: