From a847ded15c80dfa0b16dee5c1ea109da06af7b34 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 21 Mar 2023 22:27:58 +0100 Subject: Load task refactoring - manage external_id regen with tasks - cascade update from warehouse to containers (refs #5432) - containers manage history --- ishtar_common/models_common.py | 91 ++++++++++++++++++++++++++++++------------ 1 file changed, 65 insertions(+), 26 deletions(-) (limited to 'ishtar_common/models_common.py') diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index 5a27f8ca9..fd12f19be 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -69,6 +69,7 @@ from ishtar_common.utils import ( get_all_field_names, merge_tsvectors, cached_label_changed, + external_id_changed, post_save_geo, post_save_geodata, task, @@ -1188,7 +1189,7 @@ class JsonData(models.Model, CachedGen): else: print("To many level in json field - fix not managed") obj.data = data - obj._no_post_process = True + obj.no_post_process() obj.save() multi = True for v in value: @@ -1248,22 +1249,6 @@ class FixAssociated: setattr(item, subkey, new_value) -class CascasdeUpdate: - DOWN_MODEL_UPDATE = [] - - def cascade_update(self): - for down_model in self.DOWN_MODEL_UPDATE: - if not settings.USE_BACKGROUND_TASK: - rel = getattr(self, down_model) - if hasattr(rel.model, "need_update"): - rel.update(need_update=True) - continue - for item in getattr(self, down_model).all(): - cached_label_changed(item.__class__, instance=item) - if hasattr(item, "main_geodata"): - post_save_geo(item.__class__, instance=item) - - class SearchAltName(object): def __init__( self, search_key, search_query, extra_query=None, distinct_query=False @@ -1436,7 +1421,6 @@ class BaseHistorizedItem( Imported, JsonData, FixAssociated, - CascasdeUpdate, ): """ Historized item with external ID management. @@ -1731,12 +1715,6 @@ class BaseHistorizedItem( def save(self, *args, **kwargs): created = not self.pk - if getattr(self, "_no_post_process", False): - self.skip_history_when_saving = True - self._cached_label_checked = True - self._post_saved_geo = True - self._no_move = True - if (not getattr(self, "skip_history_when_saving", False) and not getattr(self, "_no_last_modified_update", False)) \ or not self.last_modified: @@ -4176,7 +4154,7 @@ class CompleteIdentifierItem(models.Model, ImageContainerModel): super(CompleteIdentifierItem, self).save(*args, **kwargs) self.regenerate_all_ids() - def regenerate_all_ids(self): + def regenerate_all_ids(self, save=True): if getattr(self, "_prevent_loop", False): return modified = False @@ -4191,7 +4169,9 @@ class CompleteIdentifierItem(models.Model, ImageContainerModel): if modified: self._prevent_loop = True self.skip_history_when_saving = True - self.save() + if save: + self.save() + return modified class SearchVectorConfig: @@ -4383,10 +4363,54 @@ class MainItem(ShortMenuItem, SerializeItem): """ Item with quick actions available from tables Extra actions are available from sheets + Manage cascade updated, has_changed and no_post_process """ QUICK_ACTIONS = [] SLUG = "" + DOWN_MODEL_UPDATE = [] + INITIAL_VALUES = [] # list of field checkable if changed on save + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._initial_values = {} + for field_name in self.INITIAL_VALUES: + self._initial_values[field_name] = getattr(self, field_name) + + def has_changed(self): + """ + Check which field have a changed value between INITIAL_VALUES + :return: list of changed fields + """ + changed = [] + for field_name in self._initial_values: + value = getattr(self, field_name) + if self._initial_values[field_name] != value: + changed.append(field_name) + self._initial_values[field_name] = value + return changed + + def cascade_update(self, changed=True): + if not changed: + return + for down_model in self.DOWN_MODEL_UPDATE: + if not settings.USE_BACKGROUND_TASK: + rel = getattr(self, down_model) + if hasattr(rel.model, "need_update"): + rel.update(need_update=True) + continue + for item in getattr(self, down_model).all(): + item.cached_label_changed() + if hasattr(item, "main_geodata"): + item.post_save_geo() + + def no_post_process(self): + self.skip_history_when_saving = True + self._cached_label_checked = True + self._post_saved_geo = True + self._external_id_changed = False + self._search_updated = True + self._no_move = True @classmethod def app_label(cls): @@ -4450,6 +4474,21 @@ class MainItem(ShortMenuItem, SerializeItem): self.auto_external_id = True self.save() + def cached_label_changed(self): + self.no_post_process() + self._cached_label_checked = False + cached_label_changed(self.__class__, instance=self, created=False) + + def post_save_geo(self): + self.no_post_process() + self._post_saved_geo = False + post_save_geo(self.__class__, instance=self, created=False) + + def external_id_changed(self): + self.no_post_process() + self._external_id_changed = False + external_id_changed(self.__class__, instance=self, created=False) + def get_extra_actions(self, request): if not hasattr(self, "SLUG"): return [] -- cgit v1.2.3