summaryrefslogtreecommitdiff
path: root/ishtar_common/models_common.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models_common.py')
-rw-r--r--ishtar_common/models_common.py59
1 files changed, 48 insertions, 11 deletions
diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py
index a6f9ac0e8..03fe26f0c 100644
--- a/ishtar_common/models_common.py
+++ b/ishtar_common/models_common.py
@@ -884,8 +884,36 @@ class FullSearch(models.Model):
deactivate()
return query_parameters
+ @classmethod
+ def _update_raw_search_field(cls, value):
+ result = []
+ if not value:
+ value = ""
+ for val in value.split("'"):
+ result.append(f"'{val.lower()}':1")
+ SEPS = [" ", "-", "/"]
+ values = []
+ # split ID terms
+ for idx, sep in enumerate(SEPS):
+ if not idx:
+ values = value.split(sep)
+ continue
+ new_values = []
+ for val in values:
+ new_values += val.split(sep)
+ values = new_values
+ for val in values:
+ if len(val) < 2:
+ continue
+ val = val.replace("'", "").lower()
+ result.append(f"'{val}':1")
+ return result
+
def _update_search_field(self, search_vector_conf, search_vectors, data):
for value in search_vector_conf.format(data):
+ if search_vector_conf.language == "raw":
+ search_vectors += self._update_raw_search_field(value)
+ continue
with connection.cursor() as cursor:
cursor.execute(
"SELECT to_tsvector(%s, %s)", [search_vector_conf.language, value]
@@ -921,7 +949,7 @@ class FullSearch(models.Model):
logger.warning("No search_vectors defined for {}".format(self.__class__))
return
if getattr(self, "_search_updated", None):
- return
+ return self.search_vector
JsonDataField = apps.get_model("ishtar_common", "JsonDataField")
self._search_updated = True
@@ -938,6 +966,12 @@ class FullSearch(models.Model):
for item in rel_key.values("pk").all():
query_dct = {key + "__pk": item["pk"]}
q = copy.copy(base_q).filter(**query_dct)
+ if m2m_search_vector.language == "raw":
+ q = q.values_list(m2m_search_vector.key, flat=True)
+ search_vectors += self._update_raw_search_field(q.all()[0])
+ continue
+ query_dct = {key + "__pk": item["pk"]}
+ q = copy.copy(base_q).filter(**query_dct)
q = q.annotate(
search=SearchVector(
m2m_search_vector.key, config=m2m_search_vector.language
@@ -961,17 +995,17 @@ class FullSearch(models.Model):
elif parent:
search_vectors.append(parent.search_vector)
- for PARENT_ONLY_SEARCH_VECTOR in self.PARENT_ONLY_SEARCH_VECTORS:
- parent = getattr(self, PARENT_ONLY_SEARCH_VECTOR)
- if hasattr(parent, "all"): # m2m
- for p in parent.all():
+ for PARENT_ONLY_SEARCH_VECTOR in self.PARENT_ONLY_SEARCH_VECTORS:
+ parent = getattr(self, PARENT_ONLY_SEARCH_VECTOR)
+ if hasattr(parent, "all"): # m2m
+ for p in parent.all():
+ search_vectors.append(
+ p.update_search_vector(save=False, exclude_parent=True)
+ )
+ elif parent:
search_vectors.append(
- p.update_search_vector(save=False, exclude_parent=True)
+ parent.update_search_vector(save=False, exclude_parent=True)
)
- elif parent:
- search_vectors.append(
- parent.update_search_vector(save=False, exclude_parent=True)
- )
if self.BASE_SEARCH_VECTORS:
# query "simple" fields
@@ -4110,7 +4144,10 @@ class SearchVectorConfig:
value = ""
if not self.func:
return [value]
- return self.func(value)
+ value = self.func(value)
+ if not isinstance(value, list):
+ return [value]
+ return value
class ShortMenuItem: