From c3f12bbd494db0873cda87495d0f61fb01404d42 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Mon, 28 Oct 2019 16:33:57 +0100 Subject: Stats: fix parrallel update --- ishtar_common/models.py | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) (limited to 'ishtar_common/models.py') diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 945a48ea8..f6ed81f9c 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -3212,23 +3212,36 @@ def update_stats(statscache, item, funcname): return statscache.values +def __get_stats_cache_values(model_name, model_pk): + q = StatsCache.objects.filter( + model=model_name, model_pk=model_pk + ) + nb = q.count() + if nb >= 1: + sc = q.all()[0] + for extra in q.order_by("-id").all()[1:]: + extra.delete() + else: + sc = StatsCache.objects.create( + model=model_name, model_pk=model_pk + ) + values = sc.values + if not values: + values = {} + return sc, values + + @task() def _update_stats(app, model, model_pk, funcname): model_name = app + "." + model - sc, __ = StatsCache.objects.get_or_create( - model=model_name, model_pk=model_pk - ) model = apps.get_model(app, model) try: item = model.objects.get(pk=model_pk) except model.DoesNotExist: return - current_values = sc.values - if not current_values: - current_values = {} value = getattr(item, funcname)() + sc, current_values = __get_stats_cache_values(model_name, model_pk) current_values[funcname] = value - sc.values = current_values sc.update_requested = None sc.updated = datetime.datetime.now() @@ -3258,8 +3271,8 @@ class DashboardFormItem(object): values = update_stats(sc, self, funcname) if funcname in values: values = values[funcname] - elif "_raw_" in values: - values = values["_raw_"] + else: + values = 0 if expected_type is not None and not isinstance(values, expected_type): if from_cache: return self._get_or_set_stats(funcname, True, -- cgit v1.2.3