diff --git a/frappe/desk/search.py b/frappe/desk/search.py index ce02b400e9..b518993acb 100644 --- a/frappe/desk/search.py +++ b/frappe/desk/search.py @@ -168,7 +168,9 @@ def search_widget( } search_fields = ["name"] if meta.title_field: - search_fields.append(meta.title_field) + is_virtual_field = getattr(meta.get_field(meta.title_field), "is_virtual", False) + if not is_virtual_field: + search_fields.append(meta.title_field) if meta.search_fields: search_fields.extend(meta.get_search_fields()) @@ -348,7 +350,12 @@ def build_for_autosuggest(res: list[tuple], doctype: str) -> list[LinkSearchResu for item in res: item = list(item) if len(item) == 1: - item = [item[0], item[0]] + title_field = meta.title_field + docfield = meta.get_field(title_field) + if docfield and docfield.is_virtual: + doc = frappe.get_doc(meta.name, item[0]) + title_value = doc.get_virtual_field_value(docfield) + item = [item[0], title_value or item[0]] label = _(item[1]) if meta.translated_doctype else item[1] item[1] = item[0] diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index c4930e2048..2ffe98bc0b 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -541,6 +541,15 @@ class BaseDocument: eval_locals={"doc": self}, ) + def get_virtual_field_value(self, df): + fieldname = df.fieldname + + if (prop := getattr(type(self), fieldname, None)) and is_a_property(prop): + return getattr(self, fieldname) + + elif options := getattr(df, "options", None): + return self._evaluate_virtual_field_options(options) + def get_valid_dict( self, sanitize=True, convert_dates_to_str=False, ignore_nulls=False, ignore_virtual=False ) -> _dict: @@ -563,12 +572,7 @@ class BaseDocument: if is_virtual_field: if ignore_virtual or fieldname not in self.permitted_fieldnames: continue - - if (prop := getattr(type(self), fieldname, None)) and is_a_property(prop): - value = getattr(self, fieldname) - - elif options := getattr(df, "options", None): - value = self._evaluate_virtual_field_options(options) + value = self.get_virtual_field_value(df) fieldtype = df.fieldtype if isinstance(value, list) and fieldtype not in table_fields: