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:
Cédric Krier committed 2011-06-23 17:04:52 +02:00
1 parent cc30f46de4
commit 4048a7ee0f
3 files changed
+58 -18

No files matched your search

+41 -12
View File
@@ -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
View File
@@ -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
View File
@@ -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">