summaryrefslogtreecommitdiff
path: root/ishtar_common/utils.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/utils.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/utils.py')
-rw-r--r--ishtar_common/utils.py98
1 files changed, 47 insertions, 51 deletions
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index 7c7e6a6a5..65b937339 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -503,41 +503,42 @@ def revoke_old_task(kwargs, action_name, task_id, instance_cls):
cache.set(key, task_id, settings.CACHE_TIMEOUT * 4)
-def cached_label_changed(sender, **kwargs):
- if not kwargs.get("instance"):
+def load_task(task_func, task_name, checks, sender, **kwargs):
+ instance = kwargs.get("instance", None)
+ if not instance:
return
- instance = kwargs.get("instance")
if hasattr(instance, "test_obj"):
instance.test_obj.reached(sender, **kwargs)
- # cache_key, value = get_cache(
- # sender, ["cached_label_changed", kwargs['instance'].pk]
- # )
- # if value and not settings.DISABLE_TASK_TIMEOUT:
- # # multiple request too quick
- # return
- # cache.set(cache_key, True, settings.CACHE_TASK_TIMEOUT)
+ if checks:
+ for check in checks:
+ if getattr(instance, check, None):
+ return
if (
- not settings.USE_BACKGROUND_TASK
- or not instance.pk
- or not sender.objects.filter(pk=instance.pk).count()
+ not settings.USE_BACKGROUND_TASK
+ or not instance.pk
+ or not sender.objects.filter(pk=instance.pk).count()
):
# no background task or not yet fully saved
- return _cached_label_changed(sender, **kwargs)
-
+ return task_func(sender, **kwargs)
if getattr(instance, "_cascade_change", False):
kwargs["cascade_change"] = True
sender, kwargs = serialize_args_for_tasks(
sender, instance, kwargs, EXTRA_KWARGS_TRIGGER
)
- task_item = _cached_label_changed.delay(sender, **kwargs)
- revoke_old_task(kwargs, "cached_label_changed", task_item.id, instance.__class__)
+ task_item = task_func.delay(sender, **kwargs)
+ revoke_old_task(kwargs, task_name, task_item.id, instance.__class__)
return task_item
+def cached_label_changed(sender, **kwargs):
+ return load_task(_cached_label_changed, "cached_label_changed", None, sender,
+ **kwargs)
+
+
@task()
def _cached_label_changed(sender, **kwargs):
sender, instance = deserialize_args_for_tasks(sender, kwargs, EXTRA_KWARGS_TRIGGER)
@@ -613,6 +614,30 @@ def regenerate_all_cached_labels(model):
cached_label_changed(model, instance=item)
+def external_id_changed(sender, **kwargs):
+ return load_task(_external_id_changed, "external_id_changed",
+ ["_external_id_changed"], sender, **kwargs)
+
+
+@task()
+def _external_id_changed(sender, **kwargs):
+ sender, instance = deserialize_args_for_tasks(sender, kwargs, EXTRA_KWARGS_TRIGGER)
+ if not instance:
+ return
+ updated = False
+ instance.no_post_process()
+ if not instance.external_id or instance.auto_external_id:
+ external_id = get_generated_id(instance.SLUG + "_external_id", instance)
+ if external_id != instance.external_id:
+ updated = True
+ instance.auto_external_id = True
+ instance.external_id = external_id
+ updated |= instance.regenerate_all_ids(save=False)
+ if updated:
+ instance.save()
+
+
+
def shortify(lbl, number=20):
SHORTIFY_STR = ugettext(" (...)")
if not lbl:
@@ -749,19 +774,8 @@ def get_srid_obj_from_point(point):
def post_save_geodata(sender, **kwargs):
- instance = kwargs.get("instance", None)
- if not instance:
- return
- if hasattr(instance, "_no_geo_check") and instance._no_geo_check:
- return
- if not settings.USE_BACKGROUND_TASK:
- return _post_save_geodata(sender, **kwargs)
- sender, kwargs = serialize_args_for_tasks(
- sender, instance, kwargs, EXTRA_KWARGS_TRIGGER
- )
- task_item = _post_save_geodata.delay(sender, **kwargs)
- revoke_old_task(kwargs, "post_save_geodata", task_item.id, instance.__class__)
- return task_item
+ return load_task(_post_save_geodata, "post_save_geodata", ["_no_geo_check"], sender,
+ **kwargs)
@task()
@@ -817,26 +831,8 @@ def post_save_geo(sender, **kwargs):
"""
Convert raw x, y, z point to real geo field
"""
- if not kwargs.get("instance"):
- return
- # cache_key, value = get_cache(
- # sender, ["post_save_geo", kwargs['instance'].pk])
- # if value and not settings.DISABLE_TASK_TIMEOUT:
- # # multiple request too quick
- # return
- # cache.set(cache_key, True, settings.CACHE_TASK_TIMEOUT)
-
- instance = kwargs.get("instance")
- if hasattr(instance, "_no_geo_check") and instance._no_geo_check:
- return
- if not settings.USE_BACKGROUND_TASK:
- return _post_save_geo(sender, **kwargs)
- sender, kwargs = serialize_args_for_tasks(
- sender, instance, kwargs, EXTRA_KWARGS_TRIGGER
- )
- task_item = _post_save_geo.delay(sender, **kwargs)
- revoke_old_task(kwargs, "post_save_geo", task_item.id, instance.__class__)
- return task_item
+ return load_task(_post_save_geo, "post_save_geo", ["_no_geo_check"],
+ sender, **kwargs)
@task()
@@ -1966,7 +1962,7 @@ def get_generated_id(key, item):
profile = get_current_profile()
if not hasattr(profile, key):
return
- formula = getattr(profile, key)
+ formula = getattr(profile, key, None)
if not formula:
return ""