diff options
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 |
commit | f29f108e4983b35ec24f70b1956d1ad00073feee (patch) | |
tree | eb79f424c92c37189346e956f9fe5b8f89ba4f22 /ishtar_common/utils.py | |
parent | fd0cad6737e1b10ca8574428e1884e8c4755146e (diff) | |
download | Ishtar-f29f108e4983b35ec24f70b1956d1ad00073feee.tar.bz2 Ishtar-f29f108e4983b35ec24f70b1956d1ad00073feee.zip |
Celery: manage cached_label update with tasks
Diffstat (limited to 'ishtar_common/utils.py')
-rw-r--r-- | ishtar_common/utils.py | 71 |
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) |