Reviewers: ,
Please review this at http://codereview.tryton.org/49003/
Affected files:
M trytond/ir/ui/menu.py
M trytond/ir/ui/menu.xml
M trytond/res/ir.xml
Index: trytond/ir/ui/menu.py
===================================================================
--- a/trytond/ir/ui/menu.py
+++ b/trytond/ir/ui/menu.py
@@ -58,6 +58,7 @@
'tryton-system',
'tryton-undo',
'tryton-web-browser')]
+SEPARATOR = ' / '
class UIMenu(ModelSQL, ModelView):
@@ -72,7 +73,7 @@
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 @@
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 @@
return sorted(CLIENT_ICONS
+ [(name, name) for _, name in icon_obj.list_icons()])
- def get_full_name(self, ids, name):
+ def check_name(self, ids):
+ for menu in self.browse(ids):
+ 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] = self._get_one_full_name(menu)
+ 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):
Index: trytond/ir/ui/menu.xml
===================================================================
--- a/trytond/ir/ui/menu.xml
+++ b/trytond/ir/ui/menu.xml
@@ -24,7 +24,7 @@
<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>
@@ -69,14 +69,25 @@
<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>
Index: trytond/res/ir.xml
===================================================================
--- a/trytond/res/ir.xml
+++ b/trytond/res/ir.xml
@@ -444,7 +444,7 @@
<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">
--
[email protected] mailing list