diff --git a/frappe/database.py b/frappe/database.py index 5a960b6998..2724507541 100644 --- a/frappe/database.py +++ b/frappe/database.py @@ -14,6 +14,7 @@ import frappe import frappe.defaults import frappe.async import re +import redis import frappe.model.meta from frappe.utils import now, get_datetime, cstr from frappe import _ @@ -723,8 +724,16 @@ class Database: self.sql("commit") frappe.local.rollback_observers = [] self.flush_realtime_log() + if frappe.flags.update_global_search: - sync_global_search() + try: + frappe.enqueue('frappe.utils.global_search.sync_global_search', + now=frappe.flags.in_test or frappe.flags.in_install or frappe.flags.in_migrate, + flags=frappe.flags.update_global_search) + except redis.exceptions.ConnectionError: + sync_global_search() + + frappe.flags.update_global_search = [] def flush_realtime_log(self): for args in frappe.local.realtime_log: diff --git a/frappe/model/document.py b/frappe/model/document.py index c5b5ca08a7..e1bbb17b79 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -803,12 +803,7 @@ class Document(BaseDocument): self.clear_cache() self.notify_update() - try: - frappe.enqueue('frappe.utils.global_search.update_global_search', - now=frappe.flags.in_test or frappe.flags.in_install or frappe.flags.in_migrate, - doc=self) - except redis.exceptions.ConnectionError: - update_global_search(self) + update_global_search(self) if self._doc_before_save and not self.flags.ignore_version: self.save_version() diff --git a/frappe/utils/global_search.py b/frappe/utils/global_search.py index 713b8dc152..2351ee8960 100644 --- a/frappe/utils/global_search.py +++ b/frappe/utils/global_search.py @@ -244,11 +244,16 @@ def get_formatted_value(value, field): value = ' '.join(value.split()) return field.label + " : " + strip_html_tags(unicode(value)) -def sync_global_search(): - '''Add values from `frappe.flags.update_global_search` to __global_search. +def sync_global_search(flags=None): + '''Add values from `flags` (frappe.flags.update_global_search) to __global_search. This is called internally at the end of the request.''' - for value in frappe.flags.update_global_search: + if not flags: + flags = frappe.flags.update_global_search + + # Can pass flags manually as frappe.flags.update_global_search isn't reliable at a later time, + # when syncing is enqueued + for value in flags: frappe.db.sql(''' insert into __global_search (doctype, name, content, published, title, route)