diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-10-28 16:33:57 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-10-28 16:33:57 +0100 |
commit | 331ad0aed5fdae862259c513193ca34ed63c55c2 (patch) | |
tree | bb5e5ae89f8a281b1bb39fef20cb64733384c509 /ishtar_common | |
parent | 169e22bb1b756f3457e1f2d1655940306a5ff09f (diff) | |
download | Ishtar-331ad0aed5fdae862259c513193ca34ed63c55c2.tar.bz2 Ishtar-331ad0aed5fdae862259c513193ca34ed63c55c2.zip |
Stats: fix parrallel update
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/models.py | 31 |
1 files changed, 22 insertions, 9 deletions
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, |