summaryrefslogtreecommitdiff
path: root/ishtar_common/views_item.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2023-01-09 17:37:19 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2023-01-09 17:37:19 +0100
commit821732925ee1952b16ff6d119724095df7b26f23 (patch)
tree49b6133816178c99b45915b34ec5a73d7b6a5c28 /ishtar_common/views_item.py
parent67a504e8f8db29c323c0d81e8323b2c9e4ade49a (diff)
downloadIshtar-821732925ee1952b16ff6d119724095df7b26f23.tar.bz2
Ishtar-821732925ee1952b16ff6d119724095df7b26f23.zip
Fix strange bug on statistics with criteria
Diffstat (limited to 'ishtar_common/views_item.py')
-rw-r--r--ishtar_common/views_item.py54
1 files changed, 53 insertions, 1 deletions
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py
index e9d28e306..191836834 100644
--- a/ishtar_common/views_item.py
+++ b/ishtar_common/views_item.py
@@ -1452,7 +1452,7 @@ def _format_modality(value):
return value
-def _get_json_stats(
+def _get_json_stats_optimized(
items, stats_sum_variable, stats_modality_1, stats_modality_2, multiply=1
):
q = items
@@ -1492,6 +1492,58 @@ def _get_json_stats(
return HttpResponse(data, content_type="application/json")
+def _get_json_stats(
+ items, stats_sum_variable, stats_modality_1, stats_modality_2, multiply=1
+):
+ # _get_json_stats_optimized should work
+ # but problem on container with criteria on CVL
+ q = items
+ value_keys = []
+ for stat in (stats_modality_1, stats_modality_2):
+ if not stat:
+ continue
+ if stat.endswith("__year"):
+ q = q.annotate(**{stat: ExtractYear(stat[:-len("__year")])})
+ value_keys.append(stat)
+ value_keys.append(stats_sum_variable)
+ q = q.values(*value_keys)
+ data = []
+ if stats_modality_2 and stats_modality_2 != stats_modality_1:
+ q = q.order_by(stats_modality_1, stats_modality_2)
+ results = {}
+ for values in q.all():
+ value = values[stats_sum_variable] or 0
+ if stats_sum_variable == "pk":
+ value = 1
+ modality_1 = _format_modality(values[stats_modality_1])
+ modality_2 = _format_modality(values[stats_modality_2])
+ key = (modality_1, modality_2)
+ if key not in results:
+ results[key] = 0
+ results[key] += value * multiply
+
+ for key in results:
+ modality_1, modality_2 = key
+ if not data or data[-1][0] != modality_1:
+ data.append([modality_1, []])
+ data[-1][1].append((modality_2, results[key]))
+ else:
+ q = q.order_by(stats_modality_1)
+ results = {}
+ for values in q.all():
+ value = values[stats_sum_variable] or 0
+ if stats_sum_variable == "pk":
+ value = 1
+ modality_1 = _format_modality(values[stats_modality_1])
+ if modality_1 not in results:
+ results[modality_1] = 0
+ results[modality_1] += value * multiply
+ for modality_1 in results:
+ data.append([modality_1, results[modality_1]])
+ data = json.dumps({"data": data})
+ return HttpResponse(data, content_type="application/json")
+
+
DEFAULT_ROW_NUMBER = 10
# length is used by ajax DataTables requests
EXCLUDED_FIELDS = ["length"]