summaryrefslogtreecommitdiff
path: root/ishtar_common/utils.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-03-15 18:57:45 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-06-17 13:21:27 +0200
commitde20f704453581bb34ec0152825111e85808ccc2 (patch)
treeeb79f424c92c37189346e956f9fe5b8f89ba4f22 /ishtar_common/utils.py
parente76cfa15af8a156b9851236eebb74c22858db481 (diff)
downloadIshtar-de20f704453581bb34ec0152825111e85808ccc2.tar.bz2
Ishtar-de20f704453581bb34ec0152825111e85808ccc2.zip
Celery: manage cached_label update with tasks
Diffstat (limited to 'ishtar_common/utils.py')
-rw-r--r--ishtar_common/utils.py71
1 files changed, 69 insertions, 2 deletions
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index d0bfee02a..55301af14 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -62,10 +62,22 @@ def dict_to_tuple(dct):
def debug_line_no():
- cf = currentframe()
return currentframe().f_back.f_lineno
+def fake_task(*args):
+ def fake(func):
+ return func
+ return fake
+
+
+if settings.USE_BACKGROUND_TASK:
+ from celery import shared_task
+ task = shared_task
+else:
+ task = fake_task
+
+
class BColors:
"""
Bash colors. Don't forget to finish your colored string with ENDC.
@@ -312,6 +324,28 @@ def force_cached_label_changed(sender, **kwargs):
cached_label_changed(sender, **kwargs)
+def serialize_args_for_tasks(sender, **kwargs):
+ if 'signal' in kwargs:
+ kwargs.pop('signal')
+ if 'instance' in kwargs:
+ kwargs['instance'] = kwargs["instance"].pk
+ sender = (sender._meta.app_label, sender._meta.object_name)
+ return sender, kwargs
+
+
+def deserialize_args_for_tasks(sender, **kwargs):
+ if "instance" not in kwargs:
+ return sender, None
+ if not isinstance(sender, (tuple, list)): # not task
+ return sender, kwargs["instance"]
+ sender = apps.get_model(*sender)
+ try:
+ instance = sender.objects.get(pk=kwargs['instance'])
+ except sender.DoesNotExist:
+ return sender, None # object is not here anymore
+ return sender, instance
+
+
def cached_label_changed(sender, **kwargs):
if not kwargs.get('instance'):
return
@@ -324,9 +358,25 @@ def cached_label_changed(sender, **kwargs):
if not force_update and hasattr(instance, '_cached_label_checked') \
and instance._cached_label_checked:
return
+ if not settings.USE_BACKGROUND_TASK:
+ return _cached_label_changed(sender, **kwargs)
+
+ sender, kwargs = serialize_args_for_tasks(sender, **kwargs)
+ return _cached_label_changed.delay(sender, **kwargs)
+
+
+@task()
+def _cached_label_changed(sender, **kwargs):
+ sender, instance = deserialize_args_for_tasks(sender, **kwargs)
+ if not instance:
+ return
+
+ force_update = kwargs.get('force_update', False)
+
if hasattr(instance, "refresh_cache"):
instance.refresh_cache()
+ # print(sender, "cached_label_changed")
instance._cached_label_checked = True
cached_labels = ['cached_label']
if hasattr(sender, 'CACHED_LABELS'):
@@ -505,19 +555,36 @@ def post_save_geo(sender, **kwargs):
if not kwargs.get('instance') or getattr(kwargs['instance'],
'_post_saved_geo', False):
return
+
+ if not settings.USE_BACKGROUND_TASK:
+ return _post_save_geo(sender, **kwargs)
+ sender, kwargs = serialize_args_for_tasks(sender, **kwargs)
+ return _post_save_geo.delay(sender, **kwargs)
+
+
+@task()
+def _post_save_geo(sender, **kwargs):
+ """
+ Convert raw x, y, z point to real geo field
+ """
from ishtar_common.models import get_current_profile # not clean but utils
# is loaded before models
profile = get_current_profile()
if not profile.mapping:
return
- instance = kwargs.get('instance')
+ sender, instance = deserialize_args_for_tasks(sender, **kwargs)
+ if not instance:
+ return
+
kls_name = instance.__class__.__name__
if not profile.locate_warehouses and ("Container" in kls_name
or "Warehouse" in kls_name):
return
+ # print(sender, "post_save_geo")
+
current_source = "default"
if hasattr(instance.__class__, "_meta"):
current_source = str(instance.__class__._meta.verbose_name)