Files
tradon/modules/dashboard/ir.py
2026-03-14 09:42:12 +00:00

129 lines
4.4 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import math
from lxml import etree
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
class View(metaclass=PoolMeta):
__name__ = 'ir.ui.view'
@staticmethod
def dashboard_id():
'''
Return the database id of view_dashboard
'''
ModelData = Pool().get('ir.model.data')
models_data = ModelData.search([
('fs_id', '=', 'view_dashboard'),
('module', '=', 'dashboard'),
], limit=1)
if not models_data:
return 0
model_data, = models_data
return model_data.db_id
@staticmethod
def _dashboard_element_action(action):
'''
Return etree Element for the given dashboard action.
'''
return etree.Element('action', {
'name': str(action.act_window.id),
})
@classmethod
def dashboard_view(cls, arch):
'''
Add action to view arch of dashboard
'''
User = Pool().get('res.user')
tree = etree.fromstring(arch)
root = tree.getroottree().getroot()
user = User(Transaction().user)
if user.dashboard_layout == 'square':
root.set('col', str(int(math.ceil(math.sqrt(
len(user.dashboard_actions))))))
for action in user.dashboard_actions:
root.append(cls._dashboard_element_action(action))
elif user.dashboard_layout == 'stack_right':
group = None
root.set('col', '2')
for action in user.dashboard_actions:
element = cls._dashboard_element_action(action)
if group is None:
root.append(element)
group = etree.Element('group', {
'col': '1',
'yexpand': '1',
'yfill': '1',
})
root.append(group)
else:
group.append(element)
elif user.dashboard_layout == 'stack_left':
root.set('col', '2')
group = etree.Element('group', {
'col': '1',
'yexpand': '1',
'yfill': '1',
})
root.append(group)
first = True
for action in user.dashboard_actions:
element = cls._dashboard_element_action(action)
if first:
first = False
root.append(element)
else:
group.append(element)
elif user.dashboard_layout == 'stack_top':
root.set('col', '1')
group = etree.Element('group', {
'col': str(len(user.dashboard_actions) - 1),
'xexpand': '1',
})
root.append(group)
first = True
for action in user.dashboard_actions:
element = cls._dashboard_element_action(action)
if first:
first = False
root.append(element)
else:
group.append(element)
elif user.dashboard_layout == 'stack_bottom':
root.set('col', '1')
group = etree.Element('group', {
'col': str(len(user.dashboard_actions) - 1),
'xexpand': '1',
})
first = True
for action in user.dashboard_actions:
element = cls._dashboard_element_action(action)
if first:
first = False
root.append(element)
else:
group.append(element)
root.append(group)
arch = etree.tostring(tree, encoding='utf-8').decode('utf-8')
return arch
@classmethod
def read(cls, ids, fields_names):
res = super().read(ids, fields_names)
if Transaction().user == 0:
return res
dashboard_id = cls.dashboard_id()
if fields_names is None \
or 'arch' in fields_names:
if dashboard_id in ids:
for res2 in res:
if res2['id'] == dashboard_id:
res2['arch'] = cls.dashboard_view(res2['arch'])
return res