diff options
Diffstat (limited to 'ishtar_common/views_item.py')
| -rw-r--r-- | ishtar_common/views_item.py | 54 | 
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"] | 
