Files
gzth/search_panel_extension/models/models.py
T
2025-03-11 10:56:36 +08:00

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, }