summaryrefslogtreecommitdiff
path: root/ishtar_common
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
commitf29f108e4983b35ec24f70b1956d1ad00073feee (patch)
treeeb79f424c92c37189346e956f9fe5b8f89ba4f22 /ishtar_common
parentfd0cad6737e1b10ca8574428e1884e8c4755146e (diff)
downloadIshtar-f29f108e4983b35ec24f70b1956d1ad00073feee.tar.bz2
Ishtar-f29f108e4983b35ec24f70b1956d1ad00073feee.zip
Celery: manage cached_label update with tasks
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/models_imports.py10
-rw-r--r--ishtar_common/utils.py71
2 files changed, 72 insertions, 9 deletions
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py
index 904f3f013..20c3bf9c4 100644
--- a/ishtar_common/models_imports.py
+++ b/ishtar_common/models_imports.py
@@ -47,11 +47,7 @@ from ishtar_common.data_importer import Importer, ImportFormater, \
IntegerFormater, FloatFormater, UnicodeFormater, DateFormater, \
TypeFormater, YearFormater, StrToBoolean, FileFormater, InseeFormater, \
ImporterError
-
-if settings.USE_BACKGROUND_TASK:
- from background_task import background
-else:
- background = lambda x: x
+from ishtar_common.utils import task
logger = logging.getLogger(__name__)
@@ -859,7 +855,7 @@ delayed_check = None
if settings.USE_BACKGROUND_TASK:
- @background(schedule=1)
+ @task()
def delayed_import(import_pk, session_key):
try:
imp = Import.objects.get(pk=import_pk)
@@ -867,7 +863,7 @@ if settings.USE_BACKGROUND_TASK:
pass
imp.importation(session_key=session_key)
- @background(schedule=1)
+ @task()
def delayed_check(import_pk, session_key):
try:
imp = Import.objects.get(pk=import_pk)
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)