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

Reply via email to