mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-29 14:48:26 +00:00
Merge pull request #57356 from mihir-kandoi/company-restriction-link-scan-perf
perf: scan link fields once per table in company restriction check
This commit is contained in:
@@ -154,24 +154,28 @@ def validate_transaction_company(doc, method=None):
|
|||||||
|
|
||||||
def get_master_references(doc):
|
def get_master_references(doc):
|
||||||
references = defaultdict(set)
|
references = defaultdict(set)
|
||||||
collect_master_references(doc, references)
|
collect_master_references([doc], references)
|
||||||
for table_field in doc.meta.get_table_fields():
|
for table_field in doc.meta.get_table_fields():
|
||||||
for row in doc.get(table_field.fieldname) or []:
|
if rows := doc.get(table_field.fieldname):
|
||||||
collect_master_references(row, references)
|
collect_master_references(rows, references)
|
||||||
|
|
||||||
return references
|
return references
|
||||||
|
|
||||||
|
|
||||||
def collect_master_references(row, references):
|
def collect_master_references(rows, references):
|
||||||
meta = frappe.get_meta(row.doctype)
|
meta = frappe.get_meta(rows[0].doctype)
|
||||||
for field in meta.get_link_fields():
|
link_fields = [field for field in meta.get_link_fields() if field.options in RESTRICTABLE_MASTER_DOCTYPES]
|
||||||
if field.options in RESTRICTABLE_MASTER_DOCTYPES and (value := row.get(field.fieldname)):
|
dynamic_link_fields = meta.get_dynamic_link_fields()
|
||||||
references[field.options].add(value)
|
|
||||||
|
|
||||||
for field in meta.get_dynamic_link_fields():
|
for row in rows:
|
||||||
doctype = row.get(field.options)
|
for field in link_fields:
|
||||||
if doctype in RESTRICTABLE_MASTER_DOCTYPES and (value := row.get(field.fieldname)):
|
if value := row.get(field.fieldname):
|
||||||
references[doctype].add(value)
|
references[field.options].add(value)
|
||||||
|
|
||||||
|
for field in dynamic_link_fields:
|
||||||
|
doctype = row.get(field.options)
|
||||||
|
if doctype in RESTRICTABLE_MASTER_DOCTYPES and (value := row.get(field.fieldname)):
|
||||||
|
references[doctype].add(value)
|
||||||
|
|
||||||
|
|
||||||
def get_blocked_masters(doctype, names, company):
|
def get_blocked_masters(doctype, names, company):
|
||||||
|
|||||||
Reference in New Issue
Block a user