diff options
| author | Xavier Morel <xmo@odoo.com> | 2020-07-20 07:22:33 +0000 |
|---|---|---|
| committer | Xavier Morel <xmo@odoo.com> | 2020-07-28 13:03:13 +0000 |
| commit | c8063af7a085eda61e470fa5c861e94388429644 (patch) | |
| tree | 4138a64b383e2ee9cc50d5275d85e4fb03c2c568 /odoo | |
| parent | 6835aeb0de6895f7f4d6b23e0b4654465ef21d6a (diff) | |
[IMP] core, account, lunch: make <menuitem> recursive
For clarity, some data files are formatted as pseudo-tree
structure. This is somewhat confusing and dangerous when the structure
has no meaning... so add meaning:
* allow nesting menuitems, nested items are set as children to the
parent they're nested in
* update schema to allow an icon *or* a parent on regular menu items,
and neither on nested (they have an implicit parent meaning can't
have an icon)
* remove attributes which don't actually exist from the menuitem
schema
* also type sequence as an integer while at it
Convert two large-ish menuitem data files to recursive form.
closes odoo/odoo#54564
Related: odoo/enterprise#11887
Signed-off-by: Xavier Morel (xmo) <xmo@odoo.com>
Diffstat (limited to 'odoo')
| -rw-r--r-- | odoo/addons/base/wizard/base_module_update_views.xml | 3 | ||||
| -rw-r--r-- | odoo/import_xml.rng | 49 | ||||
| -rw-r--r-- | odoo/tools/convert.py | 15 |
3 files changed, 44 insertions, 23 deletions
diff --git a/odoo/addons/base/wizard/base_module_update_views.xml b/odoo/addons/base/wizard/base_module_update_views.xml index 2b1b8a00ffb..18382ce8f10 100644 --- a/odoo/addons/base/wizard/base_module_update_views.xml +++ b/odoo/addons/base/wizard/base_module_update_views.xml @@ -44,8 +44,7 @@ id="menu_view_base_module_update" groups="base.group_no_one" parent="menu_management" - sequence="40" - icon="fa-exchange"/> + sequence="40"/> </data> </odoo> diff --git a/odoo/import_xml.rng b/odoo/import_xml.rng index 1a182ce6ffc..016f21dca8b 100644 --- a/odoo/import_xml.rng +++ b/odoo/import_xml.rng @@ -224,23 +224,42 @@ </rng:element> </rng:define> + <rng:define name="menuitem_attrs"> + <rng:attribute name="id" /> + <rng:optional><rng:attribute name="name"/></rng:optional> + <rng:optional> + <rng:attribute name="sequence"> + <rng:data type="int"/> + </rng:attribute> + </rng:optional> + <rng:optional><rng:attribute name="groups"/></rng:optional> + <rng:optional><rng:attribute name="active"/></rng:optional> + <rng:optional> + <!-- menu can't have both children and action --> + <rng:choice> + <rng:attribute name="action"/> + <rng:oneOrMore> + <rng:ref name="submenuitem"/> + </rng:oneOrMore> + </rng:choice> + </rng:optional> + </rng:define> <rng:define name="menuitem"> <rng:element name="menuitem"> - <!-- TODO: id should probably be mandatory --> - <rng:optional> <rng:attribute name="id" /></rng:optional> - <rng:optional> <rng:attribute name="name"/></rng:optional> - <rng:optional> <rng:attribute name="parent"/> </rng:optional> - <rng:optional> <rng:attribute name="action"/> </rng:optional> - <rng:optional> <rng:attribute name="sequence"/> </rng:optional> - <rng:optional> <rng:attribute name="groups"/> </rng:optional> - <rng:optional> <rng:attribute name="active"/> </rng:optional> - <!-- TODO: remove icon stuff --> - <rng:optional> <rng:attribute name="icon"/> </rng:optional> - <rng:optional> <rng:attribute name="web_icon"/> </rng:optional> - <rng:optional> <rng:attribute name="web_icon_hover"/> </rng:optional> - <!-- string doesn't seem used anywhere --> - <rng:optional> <rng:attribute name="string"/> </rng:optional> - <rng:empty /> + <rng:ref name="menuitem_attrs"/> + <rng:optional> + <rng:choice> + <!-- can't have submenus with icons --> + <rng:attribute name="parent"/> + <rng:attribute name="web_icon"/> + </rng:choice> + </rng:optional> + </rng:element> + </rng:define> + <!-- menuitem except no parent (is implicit) or web_icon attributes --> + <rng:define name="submenuitem"> + <rng:element name="menuitem"> + <rng:ref name="menuitem_attrs"/> </rng:element> </rng:define> diff --git a/odoo/tools/convert.py b/odoo/tools/convert.py index 0a6a0c23da8..54b9b0d9ef4 100644 --- a/odoo/tools/convert.py +++ b/odoo/tools/convert.py @@ -419,7 +419,7 @@ form: module.record_id""" % (xml_id,) data = dict(xml_id=xid, values=res, noupdate=self.noupdate) self.env['ir.actions.act_window']._load_records([data], self.mode == 'update') - def _tag_menuitem(self, rec): + def _tag_menuitem(self, rec, parent=None): rec_id = rec.attrib["id"] self._test_xml_id(rec_id) @@ -433,11 +433,12 @@ form: module.record_id""" % (xml_id,) if rec.get('sequence'): values['sequence'] = int(rec.get('sequence')) - if rec.get('parent'): + if parent is not None: + values['parent_id'] = parent + elif rec.get('parent'): values['parent_id'] = self.id_get(rec.attrib['parent']) - else: - if rec.get('web_icon'): - values['web_icon'] = rec.attrib['web_icon'] + elif rec.get('web_icon'): + values['web_icon'] = rec.attrib['web_icon'] if rec.get('name'): @@ -475,7 +476,9 @@ form: module.record_id""" % (xml_id,) 'values': values, 'noupdate': self.noupdate, } - self.env['ir.ui.menu']._load_records([data], self.mode == 'update') + menu = self.env['ir.ui.menu']._load_records([data], self.mode == 'update') + for child in rec.iterchildren('menuitem'): + self._tag_menuitem(child, parent=menu.id) def _tag_record(self, rec): rec_model = rec.get("model") |
