summaryrefslogtreecommitdiff
path: root/ishtar_common/models_common.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2023-03-21 22:27:58 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2023-04-03 12:48:00 +0200
commita847ded15c80dfa0b16dee5c1ea109da06af7b34 (patch)
treee981f729ceae0a4444105323ed3ad16b9a7a9bc6 /ishtar_common/models_common.py
parent05911c88dacbc5dd974fa5697dd08e9ab1d35d1d (diff)
downloadIshtar-a847ded15c80dfa0b16dee5c1ea109da06af7b34.tar.bz2
Ishtar-a847ded15c80dfa0b16dee5c1ea109da06af7b34.zip
Load task refactoring - manage external_id regen with tasks - cascade update from warehouse to containers (refs #5432) - containers manage history
Diffstat (limited to 'ishtar_common/models_common.py')
-rw-r--r--ishtar_common/models_common.py91
1 files changed, 65 insertions, 26 deletions
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 []