mirror of
https://github.com/frappe/erpnext.git
synced 2026-04-26 01:58:31 +00:00
perf: reduce query when validating any doc
(cherry picked from commit b863296e53)
This commit is contained in:
@@ -10,6 +10,14 @@ from frappe.model.document import Document
|
|||||||
from frappe.utils import cint, comma_and, create_batch, get_link_to_form
|
from frappe.utils import cint, comma_and, create_batch, get_link_to_form
|
||||||
from frappe.utils.background_jobs import get_job, is_job_enqueued
|
from frappe.utils.background_jobs import get_job, is_job_enqueued
|
||||||
|
|
||||||
|
LEDGER_ENTRY_DOCTYPES = frozenset(
|
||||||
|
(
|
||||||
|
"GL Entry",
|
||||||
|
"Payment Ledger Entry",
|
||||||
|
"Stock Ledger Entry",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class TransactionDeletionRecord(Document):
|
class TransactionDeletionRecord(Document):
|
||||||
# begin: auto-generated types
|
# begin: auto-generated types
|
||||||
@@ -475,31 +483,31 @@ def get_doctypes_to_be_ignored():
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def is_deletion_doc_running(company: str | None = None, err_msg: str | None = None):
|
def is_deletion_doc_running(company: str | None = None, err_msg: str | None = None):
|
||||||
if company:
|
if not company:
|
||||||
if running_deletion_jobs := frappe.db.get_all(
|
return
|
||||||
"Transaction Deletion Record",
|
|
||||||
filters={"docstatus": 1, "company": company, "status": "Running"},
|
running_deletion_job = frappe.db.get_value(
|
||||||
):
|
"Transaction Deletion Record",
|
||||||
if not err_msg:
|
{"docstatus": 1, "company": company, "status": "Running"},
|
||||||
err_msg = ""
|
"name",
|
||||||
frappe.throw(
|
)
|
||||||
title=_("Deletion in Progress!"),
|
|
||||||
msg=_("Transaction Deletion Document: {0} is running for this Company. {1}").format(
|
if not running_deletion_job:
|
||||||
get_link_to_form("Transaction Deletion Record", running_deletion_jobs[0].name), err_msg
|
return
|
||||||
),
|
|
||||||
)
|
frappe.throw(
|
||||||
|
title=_("Deletion in Progress!"),
|
||||||
|
msg=_("Transaction Deletion Document: {0} is running for this Company. {1}").format(
|
||||||
|
get_link_to_form("Transaction Deletion Record", running_deletion_job), err_msg or ""
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def check_for_running_deletion_job(doc, method=None):
|
def check_for_running_deletion_job(doc, method=None):
|
||||||
# Check if DocType has 'company' field
|
# Check if DocType has 'company' field
|
||||||
if doc.doctype not in ("GL Entry", "Payment Ledger Entry", "Stock Ledger Entry"):
|
if doc.doctype in LEDGER_ENTRY_DOCTYPES or not doc.meta.has_field("company"):
|
||||||
df = qb.DocType("DocField")
|
return
|
||||||
if (
|
|
||||||
qb.from_(df)
|
is_deletion_doc_running(
|
||||||
.select(df.parent)
|
doc.company, _("Cannot make any transactions until the deletion job is completed")
|
||||||
.where((df.fieldname == "company") & (df.parent == doc.doctype))
|
)
|
||||||
.run()
|
|
||||||
):
|
|
||||||
is_deletion_doc_running(
|
|
||||||
doc.company, _("Cannot make any transactions until the deletion job is completed")
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -475,7 +475,7 @@ def get_repeated(values):
|
|||||||
|
|
||||||
|
|
||||||
def get_documents_with_active_service_level_agreement():
|
def get_documents_with_active_service_level_agreement():
|
||||||
sla_doctypes = frappe.cache().hget("service_level_agreement", "active")
|
sla_doctypes = frappe.cache.get_value("doctypes_with_active_sla")
|
||||||
|
|
||||||
if sla_doctypes is None:
|
if sla_doctypes is None:
|
||||||
return set_documents_with_active_service_level_agreement()
|
return set_documents_with_active_service_level_agreement()
|
||||||
@@ -484,20 +484,22 @@ def get_documents_with_active_service_level_agreement():
|
|||||||
|
|
||||||
|
|
||||||
def set_documents_with_active_service_level_agreement():
|
def set_documents_with_active_service_level_agreement():
|
||||||
active = [
|
active = frozenset(
|
||||||
sla.document_type for sla in frappe.get_all("Service Level Agreement", fields=["document_type"])
|
sla.document_type for sla in frappe.get_all("Service Level Agreement", fields=["document_type"])
|
||||||
]
|
)
|
||||||
frappe.cache().hset("service_level_agreement", "active", active)
|
frappe.cache.set_value("doctypes_with_active_sla", active)
|
||||||
return active
|
return active
|
||||||
|
|
||||||
|
|
||||||
def apply(doc, method=None):
|
def apply(doc, method=None):
|
||||||
# Applies SLA to document on validate
|
# Applies SLA to document on validate
|
||||||
|
flags = frappe.local.flags
|
||||||
|
|
||||||
if (
|
if (
|
||||||
frappe.flags.in_patch
|
flags.in_patch
|
||||||
or frappe.flags.in_migrate
|
or flags.in_migrate
|
||||||
or frappe.flags.in_install
|
or flags.in_install
|
||||||
or frappe.flags.in_setup_wizard
|
or flags.in_setup_wizard
|
||||||
or doc.doctype not in get_documents_with_active_service_level_agreement()
|
or doc.doctype not in get_documents_with_active_service_level_agreement()
|
||||||
):
|
):
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user