summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common')
-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 ebe9ca07d..ce70559f9 100644
--- a/ishtar_common/views_item.py
+++ b/ishtar_common/views_item.py
@@ -1522,7 +1522,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
@@ -1562,6 +1562,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"]