summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2018-08-09 17:50:00 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2018-08-13 18:26:04 +0200
commit03452f53b22c55c0b527d76433dbbd7dc52fe6dc (patch)
tree9fc8f7a188e54dd18f5be1054ea442389ae0ee38 /ishtar_common
parenta9597946a8c9a1a7de2c590ef0b87d2949994920 (diff)
downloadIshtar-03452f53b22c55c0b527d76433dbbd7dc52fe6dc.tar.bz2
Ishtar-03452f53b22c55c0b527d76433dbbd7dc52fe6dc.zip
search vector update: prevent circular referencing
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/models.py35
1 files changed, 27 insertions, 8 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 678e2ce41..cb225d0f6 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -1091,6 +1091,8 @@ class FullSearch(models.Model):
INT_SEARCH_VECTORS = []
M2M_SEARCH_VECTORS = []
PARENT_SEARCH_VECTORS = []
+ # prevent circular dependency
+ PARENT_ONLY_SEARCH_VECTORS = []
class Meta:
abstract = True
@@ -1105,7 +1107,7 @@ class FullSearch(models.Model):
if issubclass(rel_model, (GeneralType, HierarchicalType)):
yield k
- def update_search_vector(self, save=True):
+ def update_search_vector(self, save=True, exclude_parent=False):
"""
Update the search vector
:param save: True if you want to save the object immediately
@@ -1153,14 +1155,27 @@ class FullSearch(models.Model):
search_vectors.append(
"'{}':1".format(q.all()[0][INT_SEARCH_VECTOR]))
- # copy parent vector fields
- for PARENT_SEARCH_VECTOR in self.PARENT_SEARCH_VECTORS:
- parent = getattr(self, PARENT_SEARCH_VECTOR)
+ if not exclude_parent:
+ # copy parent vector fields
+ for PARENT_SEARCH_VECTOR in self.PARENT_SEARCH_VECTORS:
+ parent = getattr(self, PARENT_SEARCH_VECTOR)
+ if hasattr(parent, 'all'): # m2m
+ for p in parent.all():
+ search_vectors.append(p.search_vector)
+ 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():
- search_vectors.append(p.search_vector)
+ search_vectors.append(
+ p.update_search_vector(save=False, exclude_parent=True)
+ )
elif parent:
- search_vectors.append(parent.search_vector)
+ search_vectors.append(
+ parent.update_search_vector(save=False, exclude_parent=True)
+ )
if self.BASE_SEARCH_VECTORS:
# query "simple" fields
@@ -1194,11 +1209,15 @@ class FullSearch(models.Model):
[data])
row = cursor.fetchone()
search_vectors.append(row[0])
- self.search_vector = merge_tsvectors(search_vectors)
- changed = old_search != self.search_vector
+ # self.search_vector = merge_tsvectors(search_vectors)
+ new_search_vector = merge_tsvectors(search_vectors)
+ changed = old_search != new_search_vector
if save and changed:
+ self.search_vector = new_search_vector
self.skip_history_when_saving = True
self.save()
+ elif not save:
+ return new_search_vector
return changed