Merge pull request #18491 from resilient-tech/perf-set-document_naming
perf: cache document naming rule to avoid recurring db calls
This commit is contained in:
commit
0175fafde3
3 changed files with 34 additions and 28 deletions
|
|
@ -8,11 +8,19 @@ from frappe.desk.notifications import clear_notifications, delete_notification_c
|
|||
|
||||
common_default_keys = ["__default", "__global"]
|
||||
|
||||
doctype_map_keys = (
|
||||
"energy_point_rule_map",
|
||||
"assignment_rule_map",
|
||||
"milestone_tracker_map",
|
||||
)
|
||||
doctypes_for_mapping = {
|
||||
"Energy Point Rule",
|
||||
"Assignment Rule",
|
||||
"Milestone Tracker",
|
||||
"Document Naming Rule",
|
||||
}
|
||||
|
||||
|
||||
def get_doctype_map_key(doctype):
|
||||
return frappe.scrub(doctype) + "_map"
|
||||
|
||||
|
||||
doctype_map_keys = tuple(map(get_doctype_map_key, doctypes_for_mapping))
|
||||
|
||||
bench_cache_keys = ("assets_json",)
|
||||
|
||||
|
|
@ -66,7 +74,7 @@ doctype_cache_keys = (
|
|||
"notifications",
|
||||
"workflow",
|
||||
"data_import_column_header_map",
|
||||
) + doctype_map_keys
|
||||
)
|
||||
|
||||
|
||||
def clear_user_cache(user=None):
|
||||
|
|
@ -161,23 +169,11 @@ def clear_controller_cache(doctype=None):
|
|||
|
||||
|
||||
def get_doctype_map(doctype, name, filters=None, order_by=None):
|
||||
cache = frappe.cache()
|
||||
cache_key = frappe.scrub(doctype) + "_map"
|
||||
doctype_map = cache.hget(cache_key, name)
|
||||
|
||||
if doctype_map is not None:
|
||||
# cached, return
|
||||
items = json.loads(doctype_map)
|
||||
else:
|
||||
# non cached, build cache
|
||||
try:
|
||||
items = frappe.get_all(doctype, filters=filters, order_by=order_by)
|
||||
cache.hset(cache_key, name, json.dumps(items))
|
||||
except frappe.db.TableMissingError:
|
||||
# executed from inside patch, ignore
|
||||
items = []
|
||||
|
||||
return items
|
||||
return frappe.cache().hget(
|
||||
get_doctype_map_key(doctype),
|
||||
name,
|
||||
lambda: frappe.get_all(doctype, filters=filters, order_by=order_by, ignore_ddl=True),
|
||||
)
|
||||
|
||||
|
||||
def clear_doctype_map(doctype, name):
|
||||
|
|
|
|||
|
|
@ -12,6 +12,15 @@ class DocumentNamingRule(Document):
|
|||
def validate(self):
|
||||
self.validate_fields_in_conditions()
|
||||
|
||||
def clear_doctype_map(self):
|
||||
frappe.cache_manager.clear_doctype_map(self.doctype, self.document_type)
|
||||
|
||||
def on_update(self):
|
||||
self.clear_doctype_map()
|
||||
|
||||
def on_trash(self):
|
||||
self.clear_doctype_map()
|
||||
|
||||
def validate_fields_in_conditions(self):
|
||||
if self.has_value_changed("document_type"):
|
||||
docfields = [x.fieldname for x in frappe.get_meta(self.document_type).fields]
|
||||
|
|
|
|||
|
|
@ -235,13 +235,14 @@ def set_naming_from_document_naming_rule(doc):
|
|||
if doc.doctype in log_types:
|
||||
return
|
||||
|
||||
# ignore_ddl if naming is not yet bootstrapped
|
||||
for d in frappe.get_all(
|
||||
document_naming_rules = frappe.cache_manager.get_doctype_map(
|
||||
"Document Naming Rule",
|
||||
dict(document_type=doc.doctype, disabled=0),
|
||||
doc.doctype,
|
||||
filters={"document_type": doc.doctype, "disabled": 0},
|
||||
order_by="priority desc",
|
||||
ignore_ddl=True,
|
||||
):
|
||||
)
|
||||
|
||||
for d in document_naming_rules:
|
||||
frappe.get_cached_doc("Document Naming Rule", d.name).apply(doc)
|
||||
if doc.name:
|
||||
break
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue