summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
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
commitc3f12bbd494db0873cda87495d0f61fb01404d42 (patch)
treebb5e5ae89f8a281b1bb39fef20cb64733384c509 /ishtar_common
parent656064100a4ec06296b0be6cd6ac0b8c6c6cec73 (diff)
downloadIshtar-c3f12bbd494db0873cda87495d0f61fb01404d42.tar.bz2
Ishtar-c3f12bbd494db0873cda87495d0f61fb01404d42.zip
Stats: fix parrallel update
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/models.py31
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,