From 49f582ae57229c6dc7dd0f030a78fb7d9c1018f0 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Tue, 10 Jun 2025 21:53:03 +0530 Subject: [PATCH] perf: Use lazy doc in a lot more places --- frappe/client.py | 6 +++--- frappe/core/doctype/docshare/docshare.py | 2 +- frappe/desk/doctype/desktop_icon/desktop_icon.py | 2 +- frappe/desk/doctype/tag/tag.py | 2 +- frappe/desk/form/load.py | 4 ++-- frappe/desk/form/utils.py | 4 ++-- frappe/desk/like.py | 2 +- frappe/desk/notifications.py | 2 +- frappe/email/doctype/notification/notification.py | 6 +++--- frappe/email/inbox.py | 2 +- frappe/handler.py | 4 ++-- frappe/model/document.py | 4 ++-- frappe/sessions.py | 2 +- frappe/share.py | 2 +- frappe/website/doctype/web_form/web_form.py | 12 ++++++------ frappe/www/list.py | 2 +- frappe/www/printview.py | 6 +++--- 17 files changed, 32 insertions(+), 32 deletions(-) diff --git a/frappe/client.py b/frappe/client.py index af70f4852d..8c893b5ce7 100644 --- a/frappe/client.py +++ b/frappe/client.py @@ -312,7 +312,7 @@ def get_doc_permissions(doctype: str, docname: str): :param doctype: DocType of the document to be evaluated :param docname: `name` of the document to be evaluated """ - doc = frappe.get_doc(doctype, docname) + doc = frappe.get_lazy_doc(doctype, docname) return {"permissions": frappe.permissions.get_doc_permissions(doc)} @@ -325,7 +325,7 @@ def get_password(doctype: str, name: str, fieldname: str): :param fieldname: `fieldname` of the password property """ frappe.only_for("System Manager") - return frappe.get_doc(doctype, name).get_password(fieldname) + return frappe.get_lazy_doc(doctype, name).get_password(fieldname) from frappe.deprecation_dumpster import get_js as _get_js @@ -361,7 +361,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_doc(doctype, docname) + doc = frappe.get_lazy_doc(doctype, docname) doc.check_permission() file = frappe.get_doc( diff --git a/frappe/core/doctype/docshare/docshare.py b/frappe/core/doctype/docshare/docshare.py index 9d25629328..7d354795fb 100644 --- a/frappe/core/doctype/docshare/docshare.py +++ b/frappe/core/doctype/docshare/docshare.py @@ -46,7 +46,7 @@ class DocShare(Document): def get_doc(self): if not getattr(self, "_doc", None): - self._doc = frappe.get_doc(self.share_doctype, self.share_name) + self._doc = frappe.get_lazy_doc(self.share_doctype, self.share_name) return self._doc def validate_user(self): diff --git a/frappe/desk/doctype/desktop_icon/desktop_icon.py b/frappe/desk/doctype/desktop_icon/desktop_icon.py index 9236cfde6c..77b7f01570 100644 --- a/frappe/desk/doctype/desktop_icon/desktop_icon.py +++ b/frappe/desk/doctype/desktop_icon/desktop_icon.py @@ -132,7 +132,7 @@ def get_desktop_icons(user=None): user_icons.append(standard_icon) - user_blocked_modules = frappe.get_doc("User", user).get_blocked_modules() + user_blocked_modules = frappe.get_lazy_doc("User", user).get_blocked_modules() for icon in user_icons: if icon.module_name in user_blocked_modules: icon.hidden = 1 diff --git a/frappe/desk/doctype/tag/tag.py b/frappe/desk/doctype/tag/tag.py index 3008d000ac..e105a84637 100644 --- a/frappe/desk/doctype/tag/tag.py +++ b/frappe/desk/doctype/tag/tag.py @@ -115,7 +115,7 @@ class DocTags: frappe.db.sql( "update `tab{}` set _user_tags={} where name={}".format(self.dt, "%s", "%s"), (tags, dn) ) - doc = frappe.get_doc(self.dt, dn) + doc = frappe.get_lazy_doc(self.dt, dn) update_tags(doc, tags) except Exception as e: if frappe.db.is_missing_column(e): diff --git a/frappe/desk/form/load.py b/frappe/desk/form/load.py index bae1ba4ab3..8163d1fc9d 100644 --- a/frappe/desk/form/load.py +++ b/frappe/desk/form/load.py @@ -96,7 +96,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_doc(doctype, name) + doc = frappe.get_lazy_doc(doctype, name) doc.check_permission("read") all_communications = _get_communications(doc.doctype, doc.name, limit=21) @@ -205,7 +205,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_doc(doctype, name) + doc = frappe.get_lazy_doc(doctype, name) doc.check_permission("read") return _get_communications(doctype, name, cint(start), cint(limit)) diff --git a/frappe/desk/form/utils.py b/frappe/desk/form/utils.py index 2dbd07081d..8bfa3cac69 100644 --- a/frappe/desk/form/utils.py +++ b/frappe/desk/form/utils.py @@ -27,7 +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_doc(reference_doctype, reference_name) + reference_doc = frappe.get_lazy_doc(reference_doctype, reference_name) reference_doc.check_permission() comment = frappe.new_doc("Comment") @@ -58,7 +58,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_doc(doc.reference_doctype, doc.reference_name) + reference_doc = frappe.get_lazy_doc(doc.reference_doctype, doc.reference_name) reference_doc.check_permission() doc.content = extract_images_from_html(reference_doc, content, is_private=True) diff --git a/frappe/desk/like.py b/frappe/desk/like.py index 764a80e202..6399673691 100644 --- a/frappe/desk/like.py +++ b/frappe/desk/like.py @@ -88,5 +88,5 @@ def remove_like(doctype, name): def add_comment(doctype, name): - doc = frappe.get_doc(doctype, name) + doc = frappe.get_lazy_doc(doctype, name) doc.add_comment("Like", _("Liked")) diff --git a/frappe/desk/notifications.py b/frappe/desk/notifications.py index 1dde537a5d..995c16154c 100644 --- a/frappe/desk/notifications.py +++ b/frappe/desk/notifications.py @@ -251,7 +251,7 @@ def get_open_count(doctype: str, name: str, items=None): if frappe.flags.in_migrate or frappe.flags.in_install: return {"count": []} - doc = frappe.get_doc(doctype, name) + doc = frappe.get_lazy_doc(doctype, name) doc.check_permission() meta = doc.meta links = meta.get_dashboard_data() diff --git a/frappe/email/doctype/notification/notification.py b/frappe/email/doctype/notification/notification.py index 07b8d54d25..24ddc58c81 100644 --- a/frappe/email/doctype/notification/notification.py +++ b/frappe/email/doctype/notification/notification.py @@ -233,7 +233,7 @@ def get_context(context): ) for d in doc_list: - doc = frappe.get_doc(self.document_type, d.name) + doc = frappe.get_lazy_doc(self.document_type, d.name) if self.condition and not frappe.safe_eval(self.condition, None, get_context(doc)): continue @@ -282,7 +282,7 @@ def get_context(context): self.db_set("datetime_last_run", now) # set reference now for next run for d in doc_list: - doc = frappe.get_doc(self.document_type, d.name) + doc = frappe.get_lazy_doc(self.document_type, d.name) if self.condition and not frappe.safe_eval(self.condition, None, get_context(doc)): continue @@ -443,7 +443,7 @@ def get_context(context): communication_type="Automated Message", ).get("name") # set the outgoing email account because we did in fact send it via sendmail above - comm = frappe.get_doc("Communication", communication) + comm = frappe.get_lazy_doc("Communication", communication) comm.get_outgoing_email_account() frappe.sendmail( diff --git a/frappe/email/inbox.py b/frappe/email/inbox.py index f709f3f8d2..2a299ef44a 100644 --- a/frappe/email/inbox.py +++ b/frappe/email/inbox.py @@ -42,7 +42,7 @@ def create_email_flag_queue(names, action): """create email flag queue to mark email either as read or unread""" def mark_as_seen_unseen(name, action): - doc = frappe.get_doc("Communication", name) + doc = frappe.get_lazy_doc("Communication", name) if action == "Read": doc.add_seen() else: diff --git a/frappe/handler.py b/frappe/handler.py index 1ecf8b3703..4b35660e37 100644 --- a/frappe/handler.py +++ b/frappe/handler.py @@ -128,7 +128,7 @@ def upload_file(): else: raise frappe.PermissionError else: - user: User = frappe.get_doc("User", frappe.session.user) + user: User = frappe.get_lazy_doc("User", frappe.session.user) ignore_permissions = False files = frappe.request.files @@ -210,7 +210,7 @@ def check_write_permission(doctype: str | None = None, name: str | None = None): return try: - doc = frappe.get_doc(doctype, name) + doc = frappe.get_lazy_doc(doctype, name) 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 diff --git a/frappe/model/document.py b/frappe/model/document.py index 6b621ac65a..5134d1fc31 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -139,7 +139,7 @@ def get_doc_from_dict(data: dict[str, Any], **kwargs) -> "Document": raise ImportError(data["doctype"]) -def get_lazy_doc(doctype: str, name: str): +def get_lazy_doc(doctype: str, name: str) -> "Document": assert doctype != "DocType", "DocType can not be lazy loaded" controller = get_lazy_controller(doctype) @@ -1944,7 +1944,7 @@ def _document_values_generator( @frappe.whitelist() def unlock_document(doctype: str, name: str): - frappe.get_doc(doctype, name).unlock() + frappe.get_lazy_doc(doctype, name).unlock() frappe.msgprint(frappe._("Document Unlocked"), alert=True) diff --git a/frappe/sessions.py b/frappe/sessions.py index 3e3553c8b2..f002aee08f 100644 --- a/frappe/sessions.py +++ b/frappe/sessions.py @@ -277,7 +277,7 @@ class Session: self.insert_session_record() # update user - user = frappe.get_doc("User", self.data["user"]) + user = frappe.get_lazy_doc("User", self.data["user"]) user_doctype = frappe.qb.DocType("User") ( frappe.qb.update(user_doctype) diff --git a/frappe/share.py b/frappe/share.py index 6a5d3af936..cca27c779b 100644 --- a/frappe/share.py +++ b/frappe/share.py @@ -125,7 +125,7 @@ def set_docshare_permission(doctype, name, user, permission_to, value=1, everyon @frappe.whitelist() def get_users(doctype: str, name: str) -> list: """Get list of users with which this document is shared""" - doc = frappe.get_doc(doctype, name) + doc = frappe.get_lazy_doc(doctype, name) return _get_users(doc) diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py index 0aa3dc6e3b..615a1ae16d 100644 --- a/frappe/website/doctype/web_form/web_form.py +++ b/frappe/website/doctype/web_form/web_form.py @@ -483,7 +483,7 @@ def get_context(context): return False if self.apply_document_permissions: - return frappe.get_doc(doctype, name).has_permission(permtype=ptype) + return frappe.get_last_doc(doctype, name).has_permission(permtype=ptype) # owner matches elif frappe.db.get_value(doctype, name, "owner") == frappe.session.user: @@ -558,7 +558,7 @@ def accept(web_form, data): files = [] files_to_delete = [] - web_form = frappe.get_doc("Web Form", web_form) + web_form = frappe.get_lazy_doc("Web Form", web_form) doctype = web_form.doc_type user = frappe.session.user @@ -654,7 +654,7 @@ def accept(web_form, data): @frappe.whitelist() def delete(web_form_name: str, docname: str | int): - web_form = frappe.get_doc("Web Form", web_form_name) + web_form = frappe.get_lazy_doc("Web Form", web_form_name) owner = frappe.db.get_value(web_form.doc_type, docname, "owner") if frappe.session.user == owner and web_form.allow_delete: @@ -665,7 +665,7 @@ def delete(web_form_name: str, docname: str | int): @frappe.whitelist() def delete_multiple(web_form_name: str, docnames): - web_form = frappe.get_doc("Web Form", web_form_name) + web_form = frappe.get_lazy_doc("Web Form", web_form_name) docnames = json.loads(docnames) @@ -691,7 +691,7 @@ def delete_multiple(web_form_name: str, docnames): def check_webform_perm(doctype, name): - doc = frappe.get_doc(doctype, name) + doc = frappe.get_lazy_doc(doctype, name) if hasattr(doc, "has_webform_permission"): if doc.has_webform_permission(): return True @@ -762,7 +762,7 @@ def get_in_list_view_fields(doctype): def get_link_options(web_form_name, doctype, allow_read_on_all_link_options=False): - web_form: WebForm = frappe.get_doc("Web Form", web_form_name) + web_form: WebForm = frappe.get_lazy_doc("Web Form", web_form_name) if web_form.login_required and frappe.session.user == "Guest": frappe.throw(_("You must be logged in to use this form."), frappe.PermissionError) diff --git a/frappe/www/list.py b/frappe/www/list.py index 1bdda56757..090e65ab74 100644 --- a/frappe/www/list.py +++ b/frappe/www/list.py @@ -197,7 +197,7 @@ def get_list_context(context, doctype, web_form_name=None): # get context from web form module if web_form_name: - web_form = frappe.get_doc("Web Form", web_form_name) + web_form = frappe.get_lazy_doc("Web Form", web_form_name) list_context = update_context_from_module(get_web_form_module(web_form), list_context) # get path from '/templates/' folder of the doctype diff --git a/frappe/www/printview.py b/frappe/www/printview.py index cb973d785e..32bfd013ed 100644 --- a/frappe/www/printview.py +++ b/frappe/www/printview.py @@ -60,7 +60,7 @@ def get_context(context) -> PrintContext: if frappe.form_dict.doc: doc = frappe.form_dict.doc else: - doc = frappe.get_doc(frappe.form_dict.doctype, frappe.form_dict.name) + doc = frappe.get_lazy_doc(frappe.form_dict.doctype, frappe.form_dict.name) set_link_titles(doc) @@ -340,7 +340,7 @@ def get_html_and_style( """Return `html` and `style` of print format, used in PDF etc.""" if isinstance(name, str): - document = frappe.get_doc(doc, name) + document = frappe.get_lazy_doc(doc, name) else: document = frappe.get_doc(json.loads(doc)) @@ -371,7 +371,7 @@ 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_doc(doc, name) + document = frappe.get_lazy_doc(doc, name) else: document = frappe.get_doc(json.loads(doc))