From 03452f53b22c55c0b527d76433dbbd7dc52fe6dc Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Thu, 9 Aug 2018 17:50:00 +0200 Subject: search vector update: prevent circular referencing --- ishtar_common/models.py | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'ishtar_common') 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 -- cgit v1.2.3