diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-05-28 13:08:58 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-06-17 13:21:28 +0200 |
commit | 9f53334ba76bbe2a93b68607181acfa51e2e544c (patch) | |
tree | fbb2677dbf1a24cec3b037d1d646d7b14e0dabfc | |
parent | 7c217d2580ff9decf7563f675c8d822c70d9f397 (diff) | |
download | Ishtar-9f53334ba76bbe2a93b68607181acfa51e2e544c.tar.bz2 Ishtar-9f53334ba76bbe2a93b68607181acfa51e2e544c.zip |
Statistics cache: rpovide an expected type in order to fix bad cache init
-rw-r--r-- | archaeological_operations/models.py | 20 | ||||
-rw-r--r-- | ishtar_common/models.py | 15 |
2 files changed, 25 insertions, 10 deletions
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index b220ff1ec..55e90ec07 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -1388,7 +1388,8 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem, QRCodeItem, @property def nb_context_records_by_type(self, update=False): - return self._get_or_set_stats('_nb_context_records_by_type', update) + return self._get_or_set_stats('_nb_context_records_by_type', update, + expected_type=list) def _nb_context_records_by_type(self): nbs = [] @@ -1401,7 +1402,8 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem, QRCodeItem, @property def nb_context_records_by_periods(self, update=False): - return self._get_or_set_stats('_nb_context_records_by_periods', update) + return self._get_or_set_stats('_nb_context_records_by_periods', update, + expected_type=list) def _nb_context_records_by_periods(self): nbs = [] @@ -1428,7 +1430,8 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem, QRCodeItem, @property def nb_finds_by_material_type(self, update=False): - return self._get_or_set_stats('_nb_finds_by_material_type', update) + return self._get_or_set_stats('_nb_finds_by_material_type', update, + expected_type=list) def _nb_finds_by_material_type(self): from archaeological_finds.models import Find @@ -1449,7 +1452,8 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem, QRCodeItem, @property def nb_finds_by_types(self, update=False): - return self._get_or_set_stats('_nb_finds_by_types', update) + return self._get_or_set_stats('_nb_finds_by_types', update, + expected_type=list) def _nb_finds_by_types(self): from archaeological_finds.models import Find @@ -1472,7 +1476,8 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem, QRCodeItem, @property def nb_finds_by_periods(self, update=False): - return self._get_or_set_stats('_nb_finds_by_periods', update) + return self._get_or_set_stats('_nb_finds_by_periods', update, + expected_type=list) def _nb_finds_by_periods(self): from archaeological_finds.models import Find @@ -1505,7 +1510,8 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem, QRCodeItem, @property def nb_documents_by_types(self, update=False): - return self._get_or_set_stats('_nb_documents_by_types', update) + return self._get_or_set_stats('_nb_documents_by_types', update, + expected_type=list) def _nb_documents_by_types(self): docs = {} @@ -1523,7 +1529,7 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem, QRCodeItem, docs[st] = 0 docs[st] += q.filter(source_type=st).count() docs = [(str(SourceType.objects.get(pk=k)), docs[k]) for k in docs] - return sorted(docs, key=lambda x: x[0]) + return list(sorted(docs, key=lambda x: x[0])) @property def nb_stats_finds_by_ue(self, update=False): diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 8d300c64a..bb19b0913 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -2945,19 +2945,28 @@ class DashboardFormItem(object): """ def _get_or_set_stats(self, funcname, update, - timeout=settings.CACHE_TIMEOUT): + timeout=settings.CACHE_TIMEOUT, + expected_type=None): model_name = self._meta.app_label + "." + self._meta.model_name sc, __ = StatsCache.objects.get_or_create( model=model_name, model_pk=self.pk ) now = datetime.datetime.now() - if sc.values and ( + if not update and sc.values and ( sc.updated + datetime.timedelta(seconds=timeout)) > now: values = sc.values + from_cache = True else: values = update_stats(sc, self, funcname) + from_cache = False if "_raw_" in values: - return values["_raw_"] + values = values["_raw_"] + if expected_type is not None and not isinstance(values, expected_type): + if from_cache: + return self._get_or_set_stats(funcname, True, + expected_type=expected_type) + else: + return expected_type() return values @classmethod |