From 5c8bd63a7c6980a9fac6ec297f99699fcc0d982e Mon Sep 17 00:00:00 2001 From: mbauskar Date: Fri, 11 Aug 2017 11:44:11 +0530 Subject: [PATCH] [hotfix] don't allow no value fields in the search fields --- frappe/core/doctype/doctype/doctype.py | 14 ++++++++++---- frappe/core/doctype/doctype/test_doctype.py | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 40207a24dd..68d1e4831e 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -512,14 +512,20 @@ def validate_fields(meta): else: frappe.throw(_("Fold can not be at the end of the form")) - def check_search_fields(meta): + def check_search_fields(meta, fields): """Throw exception if `search_fields` don't contain valid fields.""" if not meta.search_fields: return - for fieldname in (meta.search_fields or "").split(","): + # No value fields should not be included in search field + search_fields = [field.strip() for field in (meta.search_fields or "").split(",")] + fieldtype_mapper = { field.fieldname: field.fieldtype \ + for field in filter(lambda field: field.fieldname in search_fields, fields) } + + for fieldname in search_fields: fieldname = fieldname.strip() - if fieldname not in fieldname_list: + if (fieldtype_mapper.get(fieldname) in no_value_fields) or \ + (fieldname not in fieldname_list): frappe.throw(_("Search field {0} is not valid").format(fieldname)) def check_title_field(meta): @@ -616,7 +622,7 @@ def validate_fields(meta): check_unique_and_text(d) check_fold(fields) - check_search_fields(meta) + check_search_fields(meta, fields) check_title_field(meta) check_timeline_field(meta) check_is_published_field(meta) diff --git a/frappe/core/doctype/doctype/test_doctype.py b/frappe/core/doctype/doctype/test_doctype.py index 6a0794c7a1..81320c2f38 100644 --- a/frappe/core/doctype/doctype/test_doctype.py +++ b/frappe/core/doctype/doctype/test_doctype.py @@ -54,3 +54,21 @@ class TestDocType(unittest.TestCase): doc2.insert() doc1.delete() doc2.delete() + + def test_validate_search_fields(self): + doc = self.new_doctype("Test Search Fields") + doc.search_fields = "some_fieldname" + doc.insert() + self.assertEqual(doc.name, "Test Search Fields") + + # check if invalid fieldname is allowed or not + doc.search_fields = "some_fieldname_1" + self.assertRaises(frappe.ValidationError, doc.save) + + # check if no value fields are allowed in search fields + field = doc.append("fields", {}) + field.fieldname = "some_html_field" + field.fieldtype = "HTML" + field.label = "Some HTML Field" + doc.search_fields = "some_fieldname,some_html_field" + self.assertRaises(frappe.ValidationError, doc.save) \ No newline at end of file