Merge pull request #35148 from akhilnarang/get-lazy-doc-check-permission

feat(get_lazy_doc): add `check_permission` parameter
This commit is contained in:
Akhil Narang 2025-12-10 17:43:13 +05:30 committed by GitHub
commit 461bb22a68
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 21 additions and 29 deletions

View file

@ -365,8 +365,7 @@ def attach_file(
:param is_private: Attach file as private file (1 or 0)
:param docfield: file to attach to (optional)"""
doc = frappe.get_lazy_doc(doctype, docname)
doc.check_permission()
doc = frappe.get_lazy_doc(doctype, docname, check_permission=True)
file = frappe.get_doc(
{

View file

@ -94,8 +94,7 @@ def get_docinfo(doc=None, doctype=None, name=None):
from frappe.share import _get_users as get_docshares
if not doc:
doc = frappe.get_lazy_doc(doctype, name)
doc.check_permission("read")
doc = frappe.get_lazy_doc(doctype, name, check_permission=True)
all_communications = _get_communications(doc.doctype, doc.name, limit=21)
automated_messages = [
@ -204,8 +203,7 @@ def get_versions(doc: "Document") -> list[dict]:
def get_communications(doctype, name, start=0, limit=20):
from frappe.utils import cint
doc = frappe.get_lazy_doc(doctype, name)
doc.check_permission("read")
frappe.get_lazy_doc(doctype, name).check_permission()
return _get_communications(doctype, name, cint(start), cint(limit))

View file

@ -27,8 +27,7 @@ def add_comment(
reference_doctype: str, reference_name: str, content: str, comment_email: str, comment_by: str
) -> "Comment":
"""Allow logged user with permission to read document to add a comment"""
reference_doc = frappe.get_lazy_doc(reference_doctype, reference_name)
reference_doc.check_permission()
reference_doc = frappe.get_lazy_doc(reference_doctype, reference_name, check_permission=True)
comment = frappe.new_doc("Comment")
comment.update(
@ -58,8 +57,7 @@ def update_comment(name, content):
frappe.throw(_("Comment can only be edited by the owner"), frappe.PermissionError)
if doc.reference_doctype and doc.reference_name:
reference_doc = frappe.get_lazy_doc(doc.reference_doctype, doc.reference_name)
reference_doc.check_permission()
reference_doc = frappe.get_lazy_doc(doc.reference_doctype, doc.reference_name, check_permission=True)
doc.content = extract_images_from_html(reference_doc, content, is_private=True)
else:

View file

@ -264,8 +264,7 @@ def get_open_count(doctype: str, name: str, items=None):
def _get_linked_document_counts(doctype: str, name: str, items=None):
doc = frappe.get_lazy_doc(doctype, name)
doc.check_permission()
doc = frappe.get_lazy_doc(doctype, name, check_permission=True)
meta = doc.meta
links = meta.get_dashboard_data()

View file

@ -211,15 +211,13 @@ def check_write_permission(doctype: str | None = None, name: str | None = None):
return
try:
doc = frappe.get_lazy_doc(doctype, name)
frappe.get_lazy_doc(doctype, name, check_permission="write")
except frappe.DoesNotExistError:
# doc has not been inserted yet, name is set to "new-some-doctype"
# If doc inserts fine then only this attachment will be linked see file/utils.py:relink_mismatched_files
frappe.new_doc(doctype).check_permission("write")
return
doc.check_permission("write")
@frappe.whitelist(allow_guest=True)
def download_file(file_url: str):

View file

@ -59,7 +59,9 @@ def get_doc(doctype: str, /) -> _SingleDocument:
@overload
def get_doc(doctype: str, name: str, /, *, for_update: bool | None = None) -> "Document":
def get_doc(
doctype: str, name: str, /, *, for_update: bool | None = None, check_permission: str | bool | None = None
) -> "Document":
"""Retrieve DocType from DB, doctype and name must be positional argument."""
pass
@ -142,14 +144,16 @@ def get_doc_from_dict(data: dict[str, Any], **kwargs) -> "Document":
raise ImportError(data["doctype"])
def get_lazy_doc(doctype: str, name: str, *, for_update=None) -> "Document":
def get_lazy_doc(
doctype: str, name: str, *, for_update=None, check_permission: str | bool | None = None
) -> "Document":
if doctype == "DocType":
warnings.warn("DocType doesn't support lazy loading", stacklevel=1)
return get_doc(doctype, name)
return get_doc(doctype, name, check_permission=check_permission)
controller = get_lazy_controller(doctype)
if controller:
return controller(doctype, name, for_update=for_update)
if controller := get_lazy_controller(doctype):
doc = controller(doctype, name, for_update=for_update)
return get_doc_permission_check(doc, check_permission)
raise ImportError(doctype)

View file

@ -340,11 +340,9 @@ def get_html_and_style(
"""Return `html` and `style` of print format, used in PDF etc."""
if isinstance(name, str):
document = frappe.get_lazy_doc(doc, name)
document = frappe.get_lazy_doc(doc, name, check_permission=True)
else:
document = frappe.get_doc(json.loads(doc))
document.check_permission()
document = frappe.get_doc(json.loads(doc), check_permission=True)
print_format = get_print_format_doc(print_format, meta=document.meta)
set_link_titles(document)
@ -371,11 +369,9 @@ def get_rendered_raw_commands(doc: str, name: str | None = None, print_format: s
"""Return Rendered Raw Commands of print format, used to send directly to printer."""
if isinstance(name, str):
document = frappe.get_lazy_doc(doc, name)
document = frappe.get_lazy_doc(doc, name, check_permission=True)
else:
document = frappe.get_doc(json.loads(doc))
document.check_permission()
document = frappe.get_doc(json.loads(doc), check_permission=True)
print_format = get_print_format_doc(print_format, meta=document.meta)