80 lines
3.2 KiB
Python
80 lines
3.2 KiB
Python
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, }
|