fix: Call Redisearch index creation functions on enabling redisearch in settings
This commit is contained in:
parent
901d8eac57
commit
7e207c8901
@ -47,6 +47,7 @@
|
|||||||
"item_search_settings_section",
|
"item_search_settings_section",
|
||||||
"redisearch_warning",
|
"redisearch_warning",
|
||||||
"search_index_fields",
|
"search_index_fields",
|
||||||
|
"is_redisearch_enabled",
|
||||||
"show_categories_in_search_autocomplete",
|
"show_categories_in_search_autocomplete",
|
||||||
"is_redisearch_loaded",
|
"is_redisearch_loaded",
|
||||||
"shop_by_category_section",
|
"shop_by_category_section",
|
||||||
@ -303,6 +304,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"default": "1",
|
"default": "1",
|
||||||
|
"depends_on": "is_redisearch_enabled",
|
||||||
"fieldname": "show_categories_in_search_autocomplete",
|
"fieldname": "show_categories_in_search_autocomplete",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Show Categories in Search Autocomplete",
|
"label": "Show Categories in Search Autocomplete",
|
||||||
@ -365,12 +367,19 @@
|
|||||||
"fieldname": "show_price_in_quotation",
|
"fieldname": "show_price_in_quotation",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Show Price in Quotation"
|
"label": "Show Price in Quotation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "is_redisearch_enabled",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Enable Redisearch",
|
||||||
|
"read_only_depends_on": "eval:!doc.is_redisearch_loaded"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2021-09-02 14:02:44.785824",
|
"modified": "2022-03-31 16:01:46.308663",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "E-commerce",
|
"module": "E-commerce",
|
||||||
"name": "E Commerce Settings",
|
"name": "E Commerce Settings",
|
||||||
@ -389,5 +398,6 @@
|
|||||||
],
|
],
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
|
"states": [],
|
||||||
"track_changes": 1
|
"track_changes": 1
|
||||||
}
|
}
|
||||||
@ -9,6 +9,7 @@ from frappe.utils import comma_and, flt, unique
|
|||||||
|
|
||||||
from erpnext.e_commerce.redisearch_utils import (
|
from erpnext.e_commerce.redisearch_utils import (
|
||||||
create_website_items_index,
|
create_website_items_index,
|
||||||
|
define_autocomplete_dictionary,
|
||||||
get_indexable_web_fields,
|
get_indexable_web_fields,
|
||||||
is_search_module_loaded,
|
is_search_module_loaded,
|
||||||
)
|
)
|
||||||
@ -21,6 +22,8 @@ class ShoppingCartSetupError(frappe.ValidationError):
|
|||||||
class ECommerceSettings(Document):
|
class ECommerceSettings(Document):
|
||||||
def onload(self):
|
def onload(self):
|
||||||
self.get("__onload").quotation_series = frappe.get_meta("Quotation").get_options("naming_series")
|
self.get("__onload").quotation_series = frappe.get_meta("Quotation").get_options("naming_series")
|
||||||
|
|
||||||
|
# flag >> if redisearch is installed and loaded
|
||||||
self.is_redisearch_loaded = is_search_module_loaded()
|
self.is_redisearch_loaded = is_search_module_loaded()
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
@ -34,6 +37,20 @@ class ECommerceSettings(Document):
|
|||||||
|
|
||||||
frappe.clear_document_cache("E Commerce Settings", "E Commerce Settings")
|
frappe.clear_document_cache("E Commerce Settings", "E Commerce Settings")
|
||||||
|
|
||||||
|
self.is_redisearch_enabled_pre_save = frappe.db.get_single_value(
|
||||||
|
"E Commerce Settings", "is_redisearch_enabled"
|
||||||
|
)
|
||||||
|
|
||||||
|
def after_save(self):
|
||||||
|
self.create_redisearch_indexes()
|
||||||
|
|
||||||
|
def create_redisearch_indexes(self):
|
||||||
|
# if redisearch is enabled (value changed) create indexes and dictionary
|
||||||
|
value_changed = self.is_redisearch_enabled != self.is_redisearch_enabled_pre_save
|
||||||
|
if self.is_redisearch_loaded and self.is_redisearch_enabled and value_changed:
|
||||||
|
define_autocomplete_dictionary()
|
||||||
|
create_website_items_index()
|
||||||
|
|
||||||
def validate_field_filters(self):
|
def validate_field_filters(self):
|
||||||
if not (self.enable_field_filters and self.filter_fields):
|
if not (self.enable_field_filters and self.filter_fields):
|
||||||
return
|
return
|
||||||
|
|||||||
@ -22,6 +22,12 @@ def get_indexable_web_fields():
|
|||||||
return [df.fieldname for df in valid_fields]
|
return [df.fieldname for df in valid_fields]
|
||||||
|
|
||||||
|
|
||||||
|
def is_redisearch_enabled():
|
||||||
|
"Return True only if redisearch is loaded and enabled."
|
||||||
|
is_redisearch_enabled = frappe.db.get_single_value("E Commerce Settings", "is_redisearch_enabled")
|
||||||
|
return is_search_module_loaded() and is_redisearch_enabled
|
||||||
|
|
||||||
|
|
||||||
def is_search_module_loaded():
|
def is_search_module_loaded():
|
||||||
try:
|
try:
|
||||||
cache = frappe.cache()
|
cache = frappe.cache()
|
||||||
@ -35,11 +41,11 @@ def is_search_module_loaded():
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def if_redisearch_loaded(function):
|
def if_redisearch_enabled(function):
|
||||||
"Decorator to check if Redisearch is loaded."
|
"Decorator to check if Redisearch is enabled."
|
||||||
|
|
||||||
def wrapper(*args, **kwargs):
|
def wrapper(*args, **kwargs):
|
||||||
if is_search_module_loaded():
|
if is_redisearch_enabled():
|
||||||
func = function(*args, **kwargs)
|
func = function(*args, **kwargs)
|
||||||
return func
|
return func
|
||||||
return
|
return
|
||||||
@ -51,7 +57,7 @@ def make_key(key):
|
|||||||
return "{0}|{1}".format(frappe.conf.db_name, key).encode("utf-8")
|
return "{0}|{1}".format(frappe.conf.db_name, key).encode("utf-8")
|
||||||
|
|
||||||
|
|
||||||
@if_redisearch_loaded
|
@if_redisearch_enabled
|
||||||
def create_website_items_index():
|
def create_website_items_index():
|
||||||
"Creates Index Definition."
|
"Creates Index Definition."
|
||||||
|
|
||||||
@ -91,7 +97,7 @@ def to_search_field(field):
|
|||||||
return TextField(field)
|
return TextField(field)
|
||||||
|
|
||||||
|
|
||||||
@if_redisearch_loaded
|
@if_redisearch_enabled
|
||||||
def insert_item_to_index(website_item_doc):
|
def insert_item_to_index(website_item_doc):
|
||||||
# Insert item to index
|
# Insert item to index
|
||||||
key = get_cache_key(website_item_doc.name)
|
key = get_cache_key(website_item_doc.name)
|
||||||
@ -104,7 +110,7 @@ def insert_item_to_index(website_item_doc):
|
|||||||
insert_to_name_ac(website_item_doc.web_item_name, website_item_doc.name)
|
insert_to_name_ac(website_item_doc.web_item_name, website_item_doc.name)
|
||||||
|
|
||||||
|
|
||||||
@if_redisearch_loaded
|
@if_redisearch_enabled
|
||||||
def insert_to_name_ac(web_name, doc_name):
|
def insert_to_name_ac(web_name, doc_name):
|
||||||
ac = AutoCompleter(make_key(WEBSITE_ITEM_NAME_AUTOCOMPLETE), conn=frappe.cache())
|
ac = AutoCompleter(make_key(WEBSITE_ITEM_NAME_AUTOCOMPLETE), conn=frappe.cache())
|
||||||
ac.add_suggestions(Suggestion(web_name, payload=doc_name))
|
ac.add_suggestions(Suggestion(web_name, payload=doc_name))
|
||||||
@ -120,14 +126,14 @@ def create_web_item_map(website_item_doc):
|
|||||||
return web_item
|
return web_item
|
||||||
|
|
||||||
|
|
||||||
@if_redisearch_loaded
|
@if_redisearch_enabled
|
||||||
def update_index_for_item(website_item_doc):
|
def update_index_for_item(website_item_doc):
|
||||||
# Reinsert to Cache
|
# Reinsert to Cache
|
||||||
insert_item_to_index(website_item_doc)
|
insert_item_to_index(website_item_doc)
|
||||||
define_autocomplete_dictionary()
|
define_autocomplete_dictionary()
|
||||||
|
|
||||||
|
|
||||||
@if_redisearch_loaded
|
@if_redisearch_enabled
|
||||||
def delete_item_from_index(website_item_doc):
|
def delete_item_from_index(website_item_doc):
|
||||||
cache = frappe.cache()
|
cache = frappe.cache()
|
||||||
key = get_cache_key(website_item_doc.name)
|
key = get_cache_key(website_item_doc.name)
|
||||||
@ -141,7 +147,7 @@ def delete_item_from_index(website_item_doc):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
@if_redisearch_loaded
|
@if_redisearch_enabled
|
||||||
def delete_from_ac_dict(website_item_doc):
|
def delete_from_ac_dict(website_item_doc):
|
||||||
"""Removes this items's name from autocomplete dictionary"""
|
"""Removes this items's name from autocomplete dictionary"""
|
||||||
cache = frappe.cache()
|
cache = frappe.cache()
|
||||||
@ -149,7 +155,7 @@ def delete_from_ac_dict(website_item_doc):
|
|||||||
name_ac.delete(website_item_doc.web_item_name)
|
name_ac.delete(website_item_doc.web_item_name)
|
||||||
|
|
||||||
|
|
||||||
@if_redisearch_loaded
|
@if_redisearch_enabled
|
||||||
def define_autocomplete_dictionary():
|
def define_autocomplete_dictionary():
|
||||||
"""Creates an autocomplete search dictionary for `name`.
|
"""Creates an autocomplete search dictionary for `name`.
|
||||||
Also creats autocomplete dictionary for `categories` if
|
Also creats autocomplete dictionary for `categories` if
|
||||||
@ -182,7 +188,7 @@ def define_autocomplete_dictionary():
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
@if_redisearch_loaded
|
@if_redisearch_enabled
|
||||||
def reindex_all_web_items():
|
def reindex_all_web_items():
|
||||||
items = frappe.get_all("Website Item", fields=get_fields_indexed(), filters={"published": True})
|
items = frappe.get_all("Website Item", fields=get_fields_indexed(), filters={"published": True})
|
||||||
|
|
||||||
@ -208,9 +214,3 @@ def get_fields_indexed():
|
|||||||
fields_to_index = fields_to_index + mandatory_fields
|
fields_to_index = fields_to_index + mandatory_fields
|
||||||
|
|
||||||
return fields_to_index
|
return fields_to_index
|
||||||
|
|
||||||
|
|
||||||
# TODO: Remove later
|
|
||||||
# # Figure out a way to run this at startup
|
|
||||||
define_autocomplete_dictionary()
|
|
||||||
create_website_items_index()
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@ from erpnext.e_commerce.redisearch_utils import (
|
|||||||
WEBSITE_ITEM_CATEGORY_AUTOCOMPLETE,
|
WEBSITE_ITEM_CATEGORY_AUTOCOMPLETE,
|
||||||
WEBSITE_ITEM_INDEX,
|
WEBSITE_ITEM_INDEX,
|
||||||
WEBSITE_ITEM_NAME_AUTOCOMPLETE,
|
WEBSITE_ITEM_NAME_AUTOCOMPLETE,
|
||||||
is_search_module_loaded,
|
is_redisearch_enabled,
|
||||||
make_key,
|
make_key,
|
||||||
)
|
)
|
||||||
from erpnext.e_commerce.shopping_cart.product_info import set_product_info_for_website
|
from erpnext.e_commerce.shopping_cart.product_info import set_product_info_for_website
|
||||||
@ -74,8 +74,8 @@ def search(query):
|
|||||||
def product_search(query, limit=10, fuzzy_search=True):
|
def product_search(query, limit=10, fuzzy_search=True):
|
||||||
search_results = {"from_redisearch": True, "results": []}
|
search_results = {"from_redisearch": True, "results": []}
|
||||||
|
|
||||||
if not is_search_module_loaded():
|
if not is_redisearch_enabled():
|
||||||
# Redisearch module not loaded
|
# Redisearch module not enabled
|
||||||
search_results["from_redisearch"] = False
|
search_results["from_redisearch"] = False
|
||||||
search_results["results"] = get_product_data(query, 0, limit)
|
search_results["results"] = get_product_data(query, 0, limit)
|
||||||
return search_results
|
return search_results
|
||||||
@ -121,8 +121,8 @@ def convert_to_dict(redis_search_doc):
|
|||||||
def get_category_suggestions(query):
|
def get_category_suggestions(query):
|
||||||
search_results = {"results": []}
|
search_results = {"results": []}
|
||||||
|
|
||||||
if not is_search_module_loaded():
|
if not is_redisearch_enabled():
|
||||||
# Redisearch module not loaded, query db
|
# Redisearch module not enabled, query db
|
||||||
categories = frappe.db.get_all(
|
categories = frappe.db.get_all(
|
||||||
"Item Group",
|
"Item Group",
|
||||||
filters={"name": ["like", "%{0}%".format(query)], "show_in_website": 1},
|
filters={"name": ["like", "%{0}%".format(query)], "show_in_website": 1},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user