From e562368069a5e604d22b2bdcac34368c92fee9fd Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Mon, 21 Feb 2022 13:43:53 +0530 Subject: [PATCH 1/3] fix: Fix if table_field exists in meta of link.parent_doctype --- frappe/core/doctype/doctype/doctype.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 6d0409521e..7d75ef7ba9 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -784,10 +784,9 @@ def validate_links_table_fieldnames(meta): if not meta.links or frappe.flags.in_patch or frappe.flags.in_fixtures: return - fieldnames = tuple(field.fieldname for field in meta.fields) for index, link in enumerate(meta.links, 1): link_meta = frappe.get_meta(link.link_doctype) - if not link_meta.get_field(link.link_fieldname): + if not frappe.get_meta(link.link_doctype).has_field(link.link_fieldname): message = _("Document Links Row #{0}: Could not find field {1} in {2} DocType").format(index, frappe.bold(link.link_fieldname), frappe.bold(link.link_doctype)) frappe.throw(message, InvalidFieldNameError, _("Invalid Fieldname")) @@ -802,7 +801,7 @@ def validate_links_table_fieldnames(meta): message = _("Document Links Row #{0}: Table Fieldname is mandatory for internal links").format(index) frappe.throw(message, frappe.ValidationError, _("Table Fieldname Missing")) - if link.table_fieldname not in fieldnames: + if not frappe.get_meta(link.parent_doctype).has_field(link.table_fieldname): message = _("Document Links Row #{0}: Could not find field {1} in {2} DocType").format(index, frappe.bold(link.table_fieldname), frappe.bold(meta.name)) frappe.throw(message, frappe.ValidationError, _("Invalid Table Fieldname")) From 88791c22648ab25fb95543441646b81a2c7ca60a Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Mon, 21 Feb 2022 14:25:34 +0530 Subject: [PATCH 2/3] test: Set correct parent doctype for document link --- frappe/custom/doctype/customize_form/test_customize_form.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/custom/doctype/customize_form/test_customize_form.py b/frappe/custom/doctype/customize_form/test_customize_form.py index 0fe39e0008..d131f06127 100644 --- a/frappe/custom/doctype/customize_form/test_customize_form.py +++ b/frappe/custom/doctype/customize_form/test_customize_form.py @@ -257,7 +257,7 @@ class TestCustomizeForm(unittest.TestCase): frappe.clear_cache() d = self.get_customize_form("User Group") - d.append('links', dict(link_doctype='User Group Member', parent_doctype='User', + d.append('links', dict(link_doctype='User Group Member', parent_doctype='User Group', link_fieldname='user', table_fieldname='user_group_members', group='Tests', custom=1)) d.run_method("save_customization") @@ -267,7 +267,7 @@ class TestCustomizeForm(unittest.TestCase): # check links exist self.assertTrue([d.name for d in user_group.links if d.link_doctype == 'User Group Member']) - self.assertTrue([d.name for d in user_group.links if d.parent_doctype == 'User']) + self.assertTrue([d.name for d in user_group.links if d.parent_doctype == 'User Group']) # remove the link d = self.get_customize_form("User Group") From 585086c0a8381fd1eb7b14f1429fd651d9ebc6dc Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 22 Feb 2022 10:20:40 +0530 Subject: [PATCH 3/3] fix: Use meta if parent doctype is same as current doctype --- frappe/core/doctype/doctype/doctype.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 7d75ef7ba9..dca0a05281 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -784,10 +784,12 @@ def validate_links_table_fieldnames(meta): if not meta.links or frappe.flags.in_patch or frappe.flags.in_fixtures: return + fieldnames = tuple(field.fieldname for field in meta.fields) for index, link in enumerate(meta.links, 1): - link_meta = frappe.get_meta(link.link_doctype) if not frappe.get_meta(link.link_doctype).has_field(link.link_fieldname): - message = _("Document Links Row #{0}: Could not find field {1} in {2} DocType").format(index, frappe.bold(link.link_fieldname), frappe.bold(link.link_doctype)) + message = _("Document Links Row #{0}: Could not find field {1} in {2} DocType").format( + index, frappe.bold(link.link_fieldname), frappe.bold(link.link_doctype) + ) frappe.throw(message, InvalidFieldNameError, _("Invalid Fieldname")) if not link.is_child_table: @@ -801,8 +803,15 @@ def validate_links_table_fieldnames(meta): message = _("Document Links Row #{0}: Table Fieldname is mandatory for internal links").format(index) frappe.throw(message, frappe.ValidationError, _("Table Fieldname Missing")) - if not frappe.get_meta(link.parent_doctype).has_field(link.table_fieldname): - message = _("Document Links Row #{0}: Could not find field {1} in {2} DocType").format(index, frappe.bold(link.table_fieldname), frappe.bold(meta.name)) + if meta.name == link.parent_doctype: + field_exists = link.table_fieldname in fieldnames + else: + field_exists = frappe.get_meta(link.parent_doctype).has_field(link.table_fieldname) + + if not field_exists: + message = _("Document Links Row #{0}: Could not find field {1} in {2} DocType").format( + index, frappe.bold(link.table_fieldname), frappe.bold(meta.name) + ) frappe.throw(message, frappe.ValidationError, _("Invalid Table Fieldname")) def validate_fields_for_doctype(doctype):