From 5870518f64a3a3961e30163e6ada557abe64e3e0 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Fri, 15 Mar 2019 21:19:00 +0100 Subject: Celery: manage stats generation on sheets --- ishtar_common/utils.py | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) (limited to 'ishtar_common/utils.py') diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py index 55301af14..3d9cfc13f 100644 --- a/ishtar_common/utils.py +++ b/ishtar_common/utils.py @@ -324,16 +324,20 @@ def force_cached_label_changed(sender, **kwargs): cached_label_changed(sender, **kwargs) -def serialize_args_for_tasks(sender, **kwargs): +def serialize_args_for_tasks(sender, instance, kwargs, extra_kwargs=None): 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) + if extra_kwargs: + for kw in extra_kwargs: + if getattr(instance, kw, None): + kwargs[kw] = getattr(instance, kw) return sender, kwargs -def deserialize_args_for_tasks(sender, **kwargs): +def deserialize_args_for_tasks(sender, kwargs, extra_kwargs=None): if "instance" not in kwargs: return sender, None if not isinstance(sender, (tuple, list)): # not task @@ -343,9 +347,19 @@ def deserialize_args_for_tasks(sender, **kwargs): instance = sender.objects.get(pk=kwargs['instance']) except sender.DoesNotExist: return sender, None # object is not here anymore + if extra_kwargs: + for kw in extra_kwargs: + if kw in kwargs: + setattr(instance, kw, kwargs[kw]) return sender, instance +EXTRA_KWARGS_TRIGGER = [ + "_cascade_change", "_cached_labels_bulk_update", "skip_history_when_saving", + "_post_saved_geo", "_search_updated", "_cached_label_checked" +] + + def cached_label_changed(sender, **kwargs): if not kwargs.get('instance'): return @@ -361,13 +375,18 @@ def cached_label_changed(sender, **kwargs): if not settings.USE_BACKGROUND_TASK: return _cached_label_changed(sender, **kwargs) - sender, kwargs = serialize_args_for_tasks(sender, **kwargs) + if getattr(instance, "_cascade_change", False): + kwargs["cascade_change"] = True + + sender, kwargs = serialize_args_for_tasks( + sender, instance, kwargs, EXTRA_KWARGS_TRIGGER) return _cached_label_changed.delay(sender, **kwargs) @task() def _cached_label_changed(sender, **kwargs): - sender, instance = deserialize_args_for_tasks(sender, **kwargs) + sender, instance = deserialize_args_for_tasks(sender, kwargs, + EXTRA_KWARGS_TRIGGER) if not instance: return @@ -376,7 +395,6 @@ def _cached_label_changed(sender, **kwargs): 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'): @@ -558,7 +576,8 @@ def post_save_geo(sender, **kwargs): if not settings.USE_BACKGROUND_TASK: return _post_save_geo(sender, **kwargs) - sender, kwargs = serialize_args_for_tasks(sender, **kwargs) + sender, kwargs = serialize_args_for_tasks(sender, kwargs.get('instance'), + kwargs, EXTRA_KWARGS_TRIGGER) return _post_save_geo.delay(sender, **kwargs) @@ -573,7 +592,8 @@ def _post_save_geo(sender, **kwargs): profile = get_current_profile() if not profile.mapping: return - sender, instance = deserialize_args_for_tasks(sender, **kwargs) + sender, instance = deserialize_args_for_tasks(sender, kwargs, + EXTRA_KWARGS_TRIGGER) if not instance: return -- cgit v1.2.3