summaryrefslogtreecommitdiff
path: root/odoo
diff options
context:
space:
mode:
authorXavier Morel <xmo@odoo.com>2020-07-20 07:22:33 +0000
committerXavier Morel <xmo@odoo.com>2020-07-28 13:03:13 +0000
commitc8063af7a085eda61e470fa5c861e94388429644 (patch)
tree4138a64b383e2ee9cc50d5275d85e4fb03c2c568 /odoo
parent6835aeb0de6895f7f4d6b23e0b4654465ef21d6a (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.xml3
-rw-r--r--odoo/import_xml.rng49
-rw-r--r--odoo/tools/convert.py15
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")