Improve rec_name of menu
Remove level check design Add check recursion Implement search_rec_name Use a list view in Administration menu issue1637 review49003
This commit is contained in:
1 parent
cc30f46de4
commit
4048a7ee0f
3 files changed
+58
-18
No files matched your search
+41
-12
@@ -58,6 +58,7 @@ CLIENT_ICONS = [(x, x) for x in (
|
||||
'tryton-system',
|
||||
'tryton-undo',
|
||||
'tryton-web-browser')]
|
||||
SEPARATOR = ' / '
|
||||
|
||||
|
||||
class UIMenu(ModelSQL, ModelView):
|
||||
@@ -72,7 +73,7 @@ class UIMenu(ModelSQL, ModelView):
|
||||
groups = fields.Many2Many('ir.ui.menu-res.group',
|
||||
'menu_id', 'gid', 'Groups')
|
||||
complete_name = fields.Function(fields.Char('Complete Name',
|
||||
order_field='name'), 'get_full_name')
|
||||
order_field='name'), 'get_rec_name', searcher='search_rec_name')
|
||||
icon = fields.Selection('list_icons', 'Icon')
|
||||
action = fields.Function(fields.Reference('Action',
|
||||
selection=[
|
||||
@@ -86,6 +87,14 @@ class UIMenu(ModelSQL, ModelView):
|
||||
def __init__(self):
|
||||
super(UIMenu, self).__init__()
|
||||
self._order.insert(0, ('sequence', 'ASC'))
|
||||
self._constraints += [
|
||||
('check_recursion', 'recursive_menu'),
|
||||
('check_name', 'wrong_name'),
|
||||
]
|
||||
self._error_messages.update({
|
||||
'recursive_menu': 'You can not create recursive menu!',
|
||||
'wrong_name': 'You can not use "%s" in name field!' % SEPARATOR,
|
||||
})
|
||||
|
||||
def default_icon(self):
|
||||
return 'tryton-open'
|
||||
@@ -101,20 +110,40 @@ class UIMenu(ModelSQL, ModelView):
|
||||
return sorted(CLIENT_ICONS
|
||||
+ [(name, name) for _, name in icon_obj.list_icons()])
|
||||
|
||||
def get_full_name(self, ids, name):
|
||||
res = {}
|
||||
def check_name(self, ids):
|
||||
for menu in self.browse(ids):
|
||||
res[menu.id] = self._get_one_full_name(menu)
|
||||
if SEPARATOR in menu.name:
|
||||
return False
|
||||
return True
|
||||
|
||||
def get_rec_name(self, ids, name):
|
||||
if not ids:
|
||||
return {}
|
||||
res = {}
|
||||
def _name(menu):
|
||||
if menu.id in res:
|
||||
return res[menu.id]
|
||||
elif menu.parent:
|
||||
return _name(menu.parent) + SEPARATOR + menu.name
|
||||
else:
|
||||
return menu.name
|
||||
for menu in self.browse(ids):
|
||||
res[menu.id] = _name(menu)
|
||||
return res
|
||||
|
||||
def _get_one_full_name(self, menu, level=6):
|
||||
if level <= 0:
|
||||
return '...'
|
||||
if menu.parent:
|
||||
parent_path = self._get_one_full_name(menu.parent, level-1) + "/"
|
||||
else:
|
||||
parent_path = ''
|
||||
return parent_path + menu.name
|
||||
def search_rec_name(self, name, clause):
|
||||
if isinstance(clause[2], basestring):
|
||||
values = clause[2].split(SEPARATOR)
|
||||
values.reverse()
|
||||
domain = []
|
||||
field = 'name'
|
||||
for name in values:
|
||||
domain.append((field, clause[1], name))
|
||||
field = 'parent.' + field
|
||||
ids = self.search(domain, order=[])
|
||||
return [('id', 'in', ids)]
|
||||
#TODO Handle list
|
||||
return [('name',) + tuple(clause[1:])]
|
||||
|
||||
def search(self, domain, offset=0, limit=None, order=None, count=False,
|
||||
query_string=False):
|
||||
|
||||
+16
-5
@@ -24,7 +24,7 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="arch" type="xml">
|
||||
<![CDATA[
|
||||
<tree string="Menu" fill="1">
|
||||
<field name="rec_name" icon="icon"/>
|
||||
<field name="complete_name" icon="icon" select="1"/>
|
||||
</tree>
|
||||
]]>
|
||||
</field>
|
||||
@@ -68,14 +68,25 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<field name="view" ref="menu_view_tree_tree"/>
|
||||
<field name="act_window" ref="act_menu_tree"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.act_window" id="act_menu_list">
|
||||
<field name="name">Menu</field>
|
||||
<field name="res_model">ir.ui.menu</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view"
|
||||
id="act_menu_form_view2">
|
||||
<field name="sequence" eval="2"/>
|
||||
id="act_menu_list_view1">
|
||||
<field name="sequence" eval="10"/>
|
||||
<field name="view" ref="menu_view_list"/>
|
||||
<field name="act_window" ref="act_menu_list"/>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view"
|
||||
id="act_menu_list_view2">
|
||||
<field name="sequence" eval="20"/>
|
||||
<field name="view" ref="menu_view_form"/>
|
||||
<field name="act_window" ref="act_menu_tree"/>
|
||||
<field name="act_window" ref="act_menu_list"/>
|
||||
</record>
|
||||
|
||||
<menuitem parent="menu_ui"
|
||||
action="act_menu_tree" id="menu_menu_tree"/>
|
||||
action="act_menu_list" id="menu_menu_list"/>
|
||||
</data>
|
||||
</tryton>
|
||||
+1
-1
@@ -444,7 +444,7 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<record model="ir.ui.menu" id="ir.menu_icon_form">
|
||||
<field name="groups" eval="[('add', ref('res.group_admin'))]"/>
|
||||
</record>
|
||||
<record model="ir.ui.menu" id="ir.menu_menu_tree">
|
||||
<record model="ir.ui.menu" id="ir.menu_menu_list">
|
||||
<field name="groups" eval="[('add', ref('res.group_admin'))]"/>
|
||||
</record>
|
||||
<record model="ir.ui.menu" id="ir.menu_view">
|
||||
|
||||
Reference in new issue
Block a user