from odoo import models, _, api class Base(models.AbstractModel): _inherit = 'base' @api.model def search_panel_select_all_multi_range(self, field_name, **kwargs): res = self.search_panel_select_multi_range(field_name, **kwargs) field_range = res['values'] field = self._fields[field_name] if field.type == 'selection': return { 'values': field_range, } Comodel = self.env.get(field.comodel_name).with_context(hierarchical_naming=False) limit = kwargs.get('limit') enable_counters = kwargs.get('enable_counters') group_by = kwargs.get('group_by') field_names = ['display_name'] if group_by: id_list = [record['id'] for record in field_range] id_set = set(id_list) group_set = set([record['group_id'] for record in field_range]) need_add_group_set = group_set - id_set group_by_field = Comodel._fields[group_by] field_names.append(group_by) if group_by_field.type == 'many2one': def group_id_name(value): return value or (False, _("Not Set")) elif group_by_field.type == 'selection': desc = Comodel.fields_get([group_by])[group_by] group_by_selection = dict(desc['selection']) group_by_selection[False] = _("Not Set") def group_id_name(value): return value, group_by_selection[value] else: def group_id_name(value): return (value, value) if value else (False, _("Not Set")) group_list = list(need_add_group_set) while True: if need_add_group_set.__len__() == 0: break group_ids = list(need_add_group_set) need_add_group_set.clear() comodel_records = Comodel.search_read([('id', 'in', group_ids)], field_names, limit=limit) for record in comodel_records: group_id, group_name = group_id_name(record[group_by]) values = { 'id': record['id'], 'display_name': record['display_name'], 'group_id': group_id, 'group_name': group_name, } if enable_counters: values['__count'] = 0 field_range.append(values) if group_id and group_id not in id_list: need_add_group_set.add(group_id) group_list.append(group_id) # 遍历field_range,更新__count的值 def recurve_count(record): rid = record['id'] for child in field_range: if child['group_id'] == rid: record['__count'] += recurve_count(child) return record['__count'] field_dict = {it['id']: it for it in field_range} field_range = list(field_dict.values()) for record in field_range: if not record.get('group_id'): record['__count'] = recurve_count(record) return { 'values': field_range, }