# Part of NHClinical. See LICENSE file for full copyright and licensing details
# -*- coding: utf-8 -*-
import openerp
[docs]def _read_group_fill_results(self, cr, uid, domain, groupby,
remaining_groupbys, aggregated_fields,
count_field, read_group_result,
read_group_order=None, context=None):
"""Helper method for filling in empty groups for all possible values of
the field being grouped by"""
# self._group_by_full should map groupable fields to a method that returns
# a list of all aggregated values that we want to display for this field,
# in the form of a m2o-like pair (key,label).
# This is useful to implement kanban views for instance, where all columns
# should be displayed even if they don't contain any record.
# Grab the list of all groups that should be displayed,
# including all present groups.
# NHC BEGIN
# ORIGINAL list comprehension for variable 'present_group_ids':
# [x[groupby][0] for x in read_group_result if x[groupby]]
present_group_ids = [x[groupby] for x in read_group_result if x[groupby]]
# NHC END
all_groups, folded = self._group_by_full[groupby](
self, cr, uid, present_group_ids, domain,
read_group_order=read_group_order,
access_rights_uid=openerp.SUPERUSER_ID, context=context)
# #### NHC BEGIN
all_group_tuples = {k: (k, v) for k, v in all_groups}
# ### NHC END
result_template = dict.fromkeys(aggregated_fields, False)
result_template[groupby + '_count'] = 0
if remaining_groupbys:
result_template['__context'] = {'group_by': remaining_groupbys}
# Merge the left_side (current results as dicts) with the right_side (all
# possible values as m2o pairs). Both lists are supposed to be using the
# same ordering, and can be merged in one pass.
result = []
known_values = {}
def append_left(left_side):
grouped_value = left_side[groupby] and left_side[groupby][0]
if grouped_value not in known_values:
result.append(left_side)
known_values[grouped_value] = left_side
else:
known_values[grouped_value].update(
{count_field: left_side[count_field]})
def append_right(right_side):
grouped_value = right_side[0]
if grouped_value not in known_values:
line = dict(result_template)
line[groupby] = right_side
line['__domain'] = [(groupby, '=', grouped_value)] + domain
result.append(line)
known_values[grouped_value] = line
while read_group_result or all_groups:
left_side = read_group_result[0] if read_group_result else None
right_side = all_groups[0] if all_groups else None
# #### NHC BEGIN
if left_side and not isinstance(left_side[groupby], (tuple, list)):
if left_side[groupby] and all_group_tuples[left_side[groupby]]:
left_side[groupby] = all_group_tuples[left_side[groupby]]
# ### NHC END
assert left_side is None or left_side[groupby] is False \
or isinstance(left_side[groupby], (tuple, list)), \
'M2O-like pair expected, got %r' % left_side[groupby]
assert right_side is None or isinstance(right_side, (tuple, list)), \
'M2O-like pair expected, got %r' % right_side
if left_side is None:
append_right(all_groups.pop(0))
elif right_side is None:
append_left(read_group_result.pop(0))
elif left_side[groupby] == right_side:
append_left(read_group_result.pop(0))
# discard right_side
all_groups.pop(0)
elif not left_side[groupby] or not left_side[groupby][0]:
# left side == "Undefined" entry, not present on right_side
append_left(read_group_result.pop(0))
else:
append_right(all_groups.pop(0))
if folded:
for r in result:
r['__fold'] = folded.get(r[groupby] and r[groupby][0], False)
return result
[docs]def _append_all(self, cr, uid, read_group_result, all_groups, all_group_tuples,
groupby, result_template, domain, count_field):
result = []
known_values = {}
while read_group_result or all_groups:
left_side = read_group_result[0] if read_group_result else None
right_side = all_groups[0] if all_groups else None
# #### NHC BEGIN #####
if left_side and not isinstance(left_side[groupby], (tuple, list)):
if left_side[groupby] and all_group_tuples[left_side[groupby]]:
left_side[groupby] = all_group_tuples[left_side[groupby]]
# #### NHC END #####
assert left_side is None or left_side[groupby] is False \
or isinstance(left_side[groupby], (tuple, list)), \
'M2O-like pair expected, got %r' % left_side[groupby]
assert right_side is None or isinstance(right_side, (tuple, list)), \
'M2O-like pair expected, got %r' % right_side
if left_side is None:
result, known_values = self._append_right(
all_groups.pop(0), groupby, known_values, result,
result_template, domain)
elif right_side is None:
result, known_values = self._append_left(
read_group_result.pop(0), groupby, known_values, result,
count_field)
elif left_side[groupby] == right_side:
result, known_values = self._append_left(
read_group_result.pop(0), groupby, known_values, result,
count_field)
# discard right_side
all_groups.pop(0)
elif not left_side[groupby] or not left_side[groupby][0]:
# left side == "Undefined" entry, not present on right_side
result, known_values = self._append_left(
read_group_result.pop(0), groupby, known_values, result,
count_field)
else:
result, known_values = self._append_right(
all_groups.pop(0), groupby, known_values, result,
result_template, domain)
return result
@staticmethod
def _append_left(left_side, groupby, known_values, result, count_field):
grouped_value = left_side[groupby] and left_side[groupby][0]
if grouped_value not in known_values:
result.append(left_side)
known_values[grouped_value] = left_side
else:
known_values[grouped_value].update(
{count_field: left_side[count_field]})
return result, known_values
@staticmethod
def _append_right(right_side, groupby, known_values, result, result_template,
domain):
grouped_value = right_side[0]
if grouped_value not in known_values:
line = dict(result_template)
line[groupby] = right_side
line['__domain'] = [(groupby, '=', grouped_value)] + domain
result.append(line)
known_values[grouped_value] = line
return result, known_values
openerp.models.BaseModel._append_all = _append_all
openerp.models.BaseModel._append_right = _append_right
openerp.models.BaseModel._append_left = _append_left
openerp.models.BaseModel._read_group_fill_results = _read_group_fill_results