Active Record
This commit is contained in:
@@ -1,6 +1,15 @@
|
||||
#This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
#this repository contains the full copyright notices and license terms.
|
||||
|
||||
from trytond.pool import Pool
|
||||
from .dashboard import *
|
||||
from .res import *
|
||||
from .ir import *
|
||||
|
||||
|
||||
def register():
|
||||
Pool.register(
|
||||
DashboardAction,
|
||||
User,
|
||||
View,
|
||||
module='dashboard', type_='model')
|
||||
|
||||
+11
-10
@@ -4,11 +4,12 @@ from trytond.model import ModelView, ModelSQL, fields
|
||||
from trytond.transaction import Transaction
|
||||
from trytond.backend import TableHandler
|
||||
|
||||
__all__ = ['DashboardAction']
|
||||
|
||||
|
||||
class DashboardAction(ModelSQL, ModelView):
|
||||
"Dashboard Action"
|
||||
_name = "dashboard.action"
|
||||
|
||||
__name__ = "dashboard.action"
|
||||
user = fields.Many2One('res.user', 'User', required=True,
|
||||
select=True)
|
||||
sequence = fields.Integer('Sequence',
|
||||
@@ -20,17 +21,17 @@ class DashboardAction(ModelSQL, ModelView):
|
||||
('res_model', '!=', ''),
|
||||
])
|
||||
|
||||
def __init__(self):
|
||||
super(DashboardAction, self).__init__()
|
||||
self._order.insert(0, ('sequence', 'ASC'))
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super(DashboardAction, cls).__setup__()
|
||||
cls._order.insert(0, ('sequence', 'ASC'))
|
||||
|
||||
def init(self, module_name):
|
||||
@classmethod
|
||||
def __register__(cls, module_name):
|
||||
cursor = Transaction().cursor
|
||||
table = TableHandler(cursor, self, module_name)
|
||||
table = TableHandler(cursor, cls, module_name)
|
||||
|
||||
super(DashboardAction, self).init(module_name)
|
||||
super(DashboardAction, cls).__register__(module_name)
|
||||
|
||||
# Migration from 2.4: drop required on sequence
|
||||
table.not_null_action('sequence', action='remove')
|
||||
|
||||
DashboardAction()
|
||||
|
||||
@@ -2,67 +2,62 @@
|
||||
#this repository contains the full copyright notices and license terms.
|
||||
import math
|
||||
from lxml import etree
|
||||
from trytond.model import Model
|
||||
from trytond.transaction import Transaction
|
||||
from trytond.cache import Cache
|
||||
from trytond.pool import Pool
|
||||
from trytond.pool import Pool, PoolMeta
|
||||
|
||||
__all__ = ['View']
|
||||
__metaclass__ = PoolMeta
|
||||
|
||||
|
||||
class View(Model):
|
||||
_name = 'ir.ui.view'
|
||||
class View:
|
||||
__name__ = 'ir.ui.view'
|
||||
_dashboard_cache = Cache('ir.ui.view.dashboard_id')
|
||||
|
||||
def dashboard_id(self):
|
||||
@staticmethod
|
||||
def dashboard_id():
|
||||
'''
|
||||
Return the database id of view_dashboard
|
||||
|
||||
:param user: the user id
|
||||
:return: an integer
|
||||
'''
|
||||
model_data_obj = Pool().get('ir.model.data')
|
||||
model_data_ids = model_data_obj.search([
|
||||
('fs_id', '=', 'view_dashboard'),
|
||||
('module', '=', 'dashboard'),
|
||||
('inherit', '=', None),
|
||||
], limit=1)
|
||||
if not model_data_ids:
|
||||
ModelData = Pool().get('ir.model.data')
|
||||
models_data = ModelData.search([
|
||||
('fs_id', '=', 'view_dashboard'),
|
||||
('module', '=', 'dashboard'),
|
||||
('inherit', '=', None),
|
||||
], limit=1)
|
||||
if not models_data:
|
||||
return 0
|
||||
model_data = model_data_obj.browse(model_data_ids[0])
|
||||
model_data, = models_data
|
||||
return model_data.db_id
|
||||
|
||||
dashboard_id = Cache('ir.ui.view.dashboard_id')(dashboard_id)
|
||||
|
||||
def _dashboard_element_action(self, action):
|
||||
@staticmethod
|
||||
def _dashboard_element_action(action):
|
||||
'''
|
||||
Return etree Element for the given dashboard action.
|
||||
|
||||
:param action: a BrowseRecord of dashboard.action
|
||||
:return: an etree Element
|
||||
'''
|
||||
return etree.Element('action', {
|
||||
'name': str(action.act_window.id),
|
||||
})
|
||||
'name': str(action.act_window.id),
|
||||
})
|
||||
|
||||
def dashboard_view(self, arch):
|
||||
@classmethod
|
||||
def dashboard_view(cls, arch):
|
||||
'''
|
||||
Add action to view arch of dashboard
|
||||
|
||||
:param arch: a string with the xml arch of dashboard
|
||||
:return: a string with the new xml arch
|
||||
'''
|
||||
user_obj = Pool().get('res.user')
|
||||
User = Pool().get('res.user')
|
||||
tree = etree.fromstring(arch)
|
||||
root = tree.getroottree().getroot()
|
||||
user = user_obj.browse(Transaction().user)
|
||||
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(self._dashboard_element_action(action))
|
||||
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 = self._dashboard_element_action(action)
|
||||
element = cls._dashboard_element_action(action)
|
||||
if group is None:
|
||||
root.append(element)
|
||||
group = etree.Element('group', {
|
||||
@@ -83,7 +78,7 @@ class View(Model):
|
||||
root.append(group)
|
||||
first = True
|
||||
for action in user.dashboard_actions:
|
||||
element = self._dashboard_element_action(action)
|
||||
element = cls._dashboard_element_action(action)
|
||||
if first:
|
||||
first = False
|
||||
root.append(element)
|
||||
@@ -98,7 +93,7 @@ class View(Model):
|
||||
root.append(group)
|
||||
first = True
|
||||
for action in user.dashboard_actions:
|
||||
element = self._dashboard_element_action(action)
|
||||
element = cls._dashboard_element_action(action)
|
||||
if first:
|
||||
first = False
|
||||
root.append(element)
|
||||
@@ -112,7 +107,7 @@ class View(Model):
|
||||
})
|
||||
first = True
|
||||
for action in user.dashboard_actions:
|
||||
element = self._dashboard_element_action(action)
|
||||
element = cls._dashboard_element_action(action)
|
||||
if first:
|
||||
first = False
|
||||
root.append(element)
|
||||
@@ -122,23 +117,19 @@ class View(Model):
|
||||
arch = etree.tostring(tree, encoding='utf-8')
|
||||
return arch
|
||||
|
||||
def read(self, ids, fields_names=None):
|
||||
res = super(View, self).read(ids, fields_names=fields_names)
|
||||
@classmethod
|
||||
def read(cls, ids, fields_names=None):
|
||||
res = super(View, cls).read(ids, fields_names=fields_names)
|
||||
if Transaction().user == 0:
|
||||
return res
|
||||
dashboard_id = self.dashboard_id()
|
||||
dashboard_id = cls.dashboard_id()
|
||||
if not dashboard_id:
|
||||
# Restart the cache
|
||||
self.dashboard_id.reset()
|
||||
cls._dashboard_cache.reset()
|
||||
if fields_names is None \
|
||||
or 'arch' in fields_names:
|
||||
if isinstance(ids, (int, long)):
|
||||
if dashboard_id == ids:
|
||||
res['arch'] = self.dashboard_view(res['arch'])
|
||||
elif dashboard_id in ids:
|
||||
if dashboard_id in ids:
|
||||
for res2 in res:
|
||||
if res2['id'] == dashboard_id:
|
||||
res2['arch'] = self.dashboard_view(res2['arch'])
|
||||
res2['arch'] = cls.dashboard_view(res2['arch'])
|
||||
return res
|
||||
|
||||
View()
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
#This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
#this repository contains the full copyright notices and license terms.
|
||||
from trytond.model import Model, fields
|
||||
from trytond.model import fields
|
||||
from trytond.backend import TableHandler
|
||||
from trytond.transaction import Transaction
|
||||
from trytond.pool import PoolMeta
|
||||
|
||||
__all__ = ['User']
|
||||
__metaclass__ = PoolMeta
|
||||
|
||||
|
||||
class User(Model):
|
||||
_name = "res.user"
|
||||
|
||||
class User:
|
||||
__name__ = "res.user"
|
||||
dashboard_layout = fields.Selection([
|
||||
('square', 'Square'),
|
||||
('stack_right', 'Stack Right'),
|
||||
@@ -18,22 +21,23 @@ class User(Model):
|
||||
dashboard_actions = fields.One2Many('dashboard.action', 'user',
|
||||
'Dashboard Actions')
|
||||
|
||||
def __init__(self):
|
||||
super(User, self).__init__()
|
||||
self._preferences_fields += [
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super(User, cls).__setup__()
|
||||
cls._preferences_fields += [
|
||||
'dashboard_layout',
|
||||
'dashboard_actions',
|
||||
]
|
||||
]
|
||||
|
||||
def init(self, module_name):
|
||||
super(User, self).init(module_name)
|
||||
@classmethod
|
||||
def __register__(cls, module_name):
|
||||
super(User, cls).__register__(module_name)
|
||||
cursor = Transaction().cursor
|
||||
table = TableHandler(cursor, self, module_name)
|
||||
table = TableHandler(cursor, cls, module_name)
|
||||
|
||||
# Migration from 1.6
|
||||
table.not_null_action('dashboard_layout', action='remove')
|
||||
|
||||
def default_dashboard_layout(self):
|
||||
@staticmethod
|
||||
def default_dashboard_layout():
|
||||
return 'square'
|
||||
|
||||
User()
|
||||
|
||||
Reference in New Issue
Block a user