diff --git a/frappe/__init__.py b/frappe/__init__.py index a4c721c8ab..34eb1c0792 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -14,7 +14,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template, get_email_from_template -__version__ = '8.7.3' +__version__ = '8.7.4' __title__ = "Frappe Framework" local = Local() 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 diff --git a/frappe/public/js/frappe/ui/page.js b/frappe/public/js/frappe/ui/page.js index 7844c1ee89..8fb77c625c 100644 --- a/frappe/public/js/frappe/ui/page.js +++ b/frappe/public/js/frappe/ui/page.js @@ -248,7 +248,7 @@ frappe.ui.Page = Class.extend({ $group = $('
\ \ -
').appendTo(this.inner_toolbar.removeClass("hide")); + ').appendTo(this.inner_toolbar); } return $group; }, @@ -280,6 +280,7 @@ frappe.ui.Page = Class.extend({ }; if(group) { var $group = this.get_inner_group_button(group); + $(this.inner_toolbar).removeClass("hide"); return $('
  • '+label+'
  • ') .on('click', _action) .appendTo($group.find(".dropdown-menu"));