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:
Mihir Kandoi
2026-07-22 15:34:49 +05:30
committed by GitHub

View File

@@ -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):