Skip to content

Menus

Basic Menu Structure

Root Menu

xml
<record id="menu_main_root" model="ir.ui.menu">
    <field name="name">Main Application</field>
    <field name="sequence">10</field>
    <field name="web_icon">module_name,static/description/icon.png</field>
</record>

Simple Menu Item

xml
<menuitem id="menu_simple"
          name="Simple Menu"
          sequence="10"/>
xml
<menuitem id="menu_child"
          name="Child Menu"
          parent="menu_main_root"
          sequence="20"/>
xml
<menuitem id="menu_with_action"
          name="Records List"
          parent="menu_main_root"
          action="action_model_list"
          sequence="10"/>
xml
<menuitem id="menu_multi_action"
          name="Multi Action Menu"
          parent="menu_main_root"
          action="action_default"
          sequence="15">
    <!-- Additional actions can be referenced in submenus -->
</menuitem>

<menuitem id="menu_sub_action1"
          name="View 1"
          parent="menu_multi_action"
          action="action_view_1"
          sequence="1"/>

<menuitem id="menu_sub_action2"
          name="View 2"
          parent="menu_multi_action"
          action="action_view_2"
          sequence="2"/>
xml
<menuitem id="menu_report"
          name="Reports"
          parent="menu_main_root"
          action="action_report_main"
          sequence="90"/>

Advanced Menu Configurations

xml
<menuitem id="menu_admin_only"
          name="Administration"
          parent="menu_main_root"
          groups="base.group_system"
          sequence="100"/>
xml
<menuitem id="menu_multi_groups"
          name="Manager Section"
          parent="menu_main_root"
          groups="base.group_user,custom_module.group_manager"
          sequence="50"/>

Conditional Menu

xml
<menuitem id="menu_conditional"
          name="Advanced Features"
          parent="menu_main_root"
          groups="base.group_no_one"
          active="True"
          sequence="80"/>

Configuration Menu Structure

xml
<menuitem id="menu_configuration"
          name="Configuration"
          parent="menu_main_root"
          sequence="90"/>

<menuitem id="menu_config_settings"
          name="Settings"
          parent="menu_configuration"
          action="action_config_settings"
          sequence="1"/>

<menuitem id="menu_config_users"
          name="Users"
          parent="menu_configuration"
          action="action_res_users"
          groups="base.group_system"
          sequence="10"/>

<menuitem id="menu_config_companies"
          name="Companies"
          parent="menu_configuration"
          action="action_res_company"
          groups="base.group_multi_company"
          sequence="20"/>

Reporting Menu Structure

xml
<menuitem id="menu_reporting"
          name="Reporting"
          parent="menu_main_root"
          sequence="80"/>

<menuitem id="menu_reports_operational"
          name="Operational Reports"
          parent="menu_reporting"
          sequence="10"/>

<menuitem id="menu_reports_analytical"
          name="Analytical Reports"
          parent="menu_reporting"
          sequence="20"/>

<menuitem id="menu_report_daily"
          name="Daily Report"
          parent="menu_reports_operational"
          action="action_daily_report"
          sequence="1"/>
xml
<menuitem id="menu_with_icon"
          name="Dashboard"
          parent="menu_main_root"
          web_icon="fa-dashboard"
          sequence="1"/>
xml
<menuitem id="menu_custom_icon"
          name="Custom Module"
          web_icon="custom_module,static/description/icon.png"
          sequence="5"/>
xml
<menuitem id="menu_fa_icon"
          name="Analytics"
          parent="menu_main_root"
          web_icon="fa-line-chart"
          sequence="70"/>

Dynamic Menu Examples

Context-Dependent Menu

xml
<record id="menu_dynamic" model="ir.ui.menu">
    <field name="name">Dynamic Menu</field>
    <field name="parent_id" ref="menu_main_root"/>
    <field name="action" ref="action_dynamic_content"/>
    <field name="sequence">30</field>
    <field name="active" eval="bool(context.get('show_advanced_features'))"/>
</record>

Company-Specific Menu

xml
<menuitem id="menu_company_specific"
          name="Company Features"
          parent="menu_main_root"
          action="action_company_features"
          groups="base.group_multi_company"
          sequence="40"/>

Module-Dependent Menu

xml
<menuitem id="menu_module_dependent"
          name="Advanced Features"
          parent="menu_main_root"
          action="action_advanced_features"
          active="True"
          sequence="60"/>

Three-Level Menu Structure

xml
<!-- Level 1: Main Menu -->
<menuitem id="menu_sales_main"
          name="Sales"
          sequence="10"
          web_icon="fa-handshake-o"/>

<!-- Level 2: Category Menus -->
<menuitem id="menu_sales_orders"
          name="Orders"
          parent="menu_sales_main"
          sequence="10"/>

<menuitem id="menu_sales_customers"
          name="Customers"
          parent="menu_sales_main"
          sequence="20"/>

<menuitem id="menu_sales_products"
          name="Products"
          parent="menu_sales_main"
          sequence="30"/>

<!-- Level 3: Specific Action Menus -->
<menuitem id="menu_sales_quotations"
          name="Quotations"
          parent="menu_sales_orders"
          action="action_sale_quotations"
          sequence="1"/>

<menuitem id="menu_sales_orders_confirmed"
          name="Sales Orders"
          parent="menu_sales_orders"
          action="action_sale_orders"
          sequence="2"/>

<menuitem id="menu_customers_list"
          name="Customers"
          parent="menu_sales_customers"
          action="action_partner_customer"
          sequence="1"/>

Complex Nested Structure

xml
<menuitem id="menu_inventory"
          name="Inventory"
          sequence="15"
          web_icon="fa-cubes"/>

<menuitem id="menu_inventory_operations"
          name="Operations"
          parent="menu_inventory"
          sequence="10"/>

<menuitem id="menu_inventory_master_data"
          name="Master Data"
          parent="menu_inventory"
          sequence="20"/>

<menuitem id="menu_inventory_reports"
          name="Reports"
          parent="menu_inventory"
          sequence="30"/>

<menuitem id="menu_inventory_config"
          name="Configuration"
          parent="menu_inventory"
          sequence="40"/>

<!-- Operations submenus -->
<menuitem id="menu_transfers"
          name="Transfers"
          parent="menu_inventory_operations"
          action="action_picking_tree_all"
          sequence="1"/>

<menuitem id="menu_receipts"
          name="Receipts"
          parent="menu_inventory_operations"
          action="action_picking_tree_incoming"
          sequence="2"/>

<menuitem id="menu_delivery_orders"
          name="Delivery Orders"
          parent="menu_inventory_operations"
          action="action_picking_tree_outgoing"
          sequence="3"/>

Sequential Menu Ordering

xml
<menuitem id="menu_first"
          name="First Menu"
          parent="menu_main"
          sequence="10"/>

<menuitem id="menu_second"
          name="Second Menu"
          parent="menu_main"
          sequence="20"/>

<menuitem id="menu_third"
          name="Third Menu"
          parent="menu_main"
          sequence="30"/>

<menuitem id="menu_last"
          name="Last Menu"
          parent="menu_main"
          sequence="100"/>

Priority-Based Sequencing

xml
<!-- High priority menus (1-10) -->
<menuitem id="menu_dashboard"
          name="Dashboard"
          parent="menu_main"
          sequence="1"/>

<!-- Regular menus (10-90) -->
<menuitem id="menu_operations"
          name="Operations"
          parent="menu_main"
          sequence="20"/>

<menuitem id="menu_reports"
          name="Reports"
          parent="menu_main"
          sequence="80"/>

<!-- Administrative menus (90-100) -->
<menuitem id="menu_settings"
          name="Settings"
          parent="menu_main"
          sequence="95"/>

Security and Access Control

Role-Based Menu Access

xml
<menuitem id="menu_user_level"
          name="User Features"
          parent="menu_main"
          groups="base.group_user"
          sequence="10"/>

<menuitem id="menu_manager_level"
          name="Manager Features"
          parent="menu_main"
          groups="custom_module.group_manager"
          sequence="20"/>

<menuitem id="menu_admin_level"
          name="Admin Features"
          parent="menu_main"
          groups="base.group_system"
          sequence="90"/>

Multi-Group Access

xml
<menuitem id="menu_multi_access"
          name="Shared Features"
          parent="menu_main"
          groups="base.group_user,custom_module.group_specialist"
          sequence="30"/>

Conditional Access Menu

xml
<record id="menu_conditional_access" model="ir.ui.menu">
    <field name="name">Conditional Access</field>
    <field name="parent_id" ref="menu_main"/>
    <field name="action" ref="action_conditional"/>
    <field name="sequence">40</field>
    <field name="groups_id" eval="[(4, ref('base.group_user'))]"/>
    <field name="active" eval="bool(env.user.has_group('custom_module.group_advanced'))"/>
</record>

Customizable Menu Structure

xml
<menuitem id="menu_customizable"
          name="Customizable Section"
          parent="menu_main"
          sequence="50"/>

<!-- These can be hidden/shown based on user preferences -->
<menuitem id="menu_feature_1"
          name="Optional Feature 1"
          parent="menu_customizable"
          action="action_feature_1"
          sequence="1"
          active="True"/>

<menuitem id="menu_feature_2"
          name="Optional Feature 2"
          parent="menu_customizable"
          action="action_feature_2"
          sequence="2"
          active="False"/>

Industry-Specific Menus

xml
<menuitem id="menu_manufacturing"
          name="Manufacturing"
          groups="mrp.group_mrp_user"
          sequence="25"
          web_icon="fa-gears"/>

<menuitem id="menu_retail"
          name="Point of Sale"
          groups="point_of_sale.group_pos_user"
          sequence="30"
          web_icon="fa-shopping-cart"/>

<menuitem id="menu_services"
          name="Services"
          groups="project.group_project_user"
          sequence="35"
          web_icon="fa-tasks"/>

Extending Existing Menus

xml
<!-- Add new submenu to existing Sales menu -->
<menuitem id="menu_sales_custom"
          name="Custom Sales Feature"
          parent="sale.sale_menu_root"
          action="action_custom_sales"
          sequence="15"/>

Modifying Existing Menu Properties

xml
<record id="sale.menu_sale_order" model="ir.ui.menu">
    <field name="sequence">5</field>
    <field name="groups_id" eval="[(4, ref('custom_module.group_sales_manager'))]"/>
</record>

Hiding Existing Menus

xml
<record id="account.menu_finance" model="ir.ui.menu">
    <field name="active" eval="False"/>
</record>

Multi-Company Menu Support

Company-Aware Menus

xml
<menuitem id="menu_multi_company"
          name="Multi-Company Features"
          parent="menu_main"
          groups="base.group_multi_company"
          sequence="45"/>

<menuitem id="menu_company_settings"
          name="Company Settings"
          parent="menu_multi_company"
          action="action_company_settings"
          sequence="1"/>

Company-Specific Data Menus

xml
<menuitem id="menu_company_reports"
          name="Company Reports"
          parent="menu_reports"
          action="action_company_specific_reports"
          groups="base.group_multi_company"
          sequence="50"/>

Internationalization

Translatable Menu Names

xml
<menuitem id="menu_translatable"
          name="Products"
          parent="menu_main"
          action="action_product_list"
          sequence="25"/>

<!-- Translation entries -->
<record id="menu_translatable_fr" model="ir.translation">
    <field name="name">ir.ui.menu,name</field>
    <field name="res_id" ref="menu_translatable"/>
    <field name="lang">fr_FR</field>
    <field name="value">Produits</field>
</record>

<record id="menu_translatable_es" model="ir.translation">
    <field name="name">ir.ui.menu,name</field>
    <field name="res_id" ref="menu_translatable"/>
    <field name="lang">es_ES</field>
    <field name="value">Productos</field>
</record>

Performance Considerations

Optimized Menu Structure

xml
<!-- Avoid deep nesting (max 3-4 levels) -->
<menuitem id="menu_optimized_root"
          name="Optimized App"
          sequence="10"/>

<menuitem id="menu_optimized_category"
          name="Main Category"
          parent="menu_optimized_root"
          sequence="10"/>

<menuitem id="menu_optimized_action"
          name="Main Action"
          parent="menu_optimized_category"
          action="action_main"
          sequence="1"/>

Lazy-Loaded Menu Actions

xml
<menuitem id="menu_lazy_load"
          name="Heavy Data"
          parent="menu_main"
          action="action_heavy_data"
          sequence="70"/>

<!-- Corresponding action with lazy loading -->
<record id="action_heavy_data" model="ir.actions.act_window">
    <field name="name">Heavy Data</field>
    <field name="res_model">heavy.data.model</field>
    <field name="view_mode">tree,form</field>
    <field name="auto_search" eval="False"/>
    <field name="limit">50</field>
</record>
xml
<!-- Test menu for different user groups -->
<menuitem id="menu_test_user"
          name="User Test Menu"
          parent="menu_main"
          groups="base.group_user"
          sequence="999"
          active="False"/>

<menuitem id="menu_test_manager"
          name="Manager Test Menu"
          parent="menu_main"
          groups="custom_module.group_manager"
          sequence="998"
          active="False"/>

Best Practices and Patterns

Consistent Menu Structure

xml
<!-- Standard app structure -->
<menuitem id="menu_app_root"
          name="Application Name"
          sequence="10"
          web_icon="fa-icon-name"/>

<!-- Operations (10-30) -->
<menuitem id="menu_operations"
          name="Operations"
          parent="menu_app_root"
          sequence="10"/>

<!-- Master Data (30-50) -->
<menuitem id="menu_master_data"
          name="Master Data"
          parent="menu_app_root"
          sequence="30"/>

<!-- Reporting (70-80) -->
<menuitem id="menu_reporting"
          name="Reporting"
          parent="menu_app_root"
          sequence="70"/>

<!-- Configuration (90-100) -->
<menuitem id="menu_configuration"
          name="Configuration"
          parent="menu_app_root"
          sequence="90"/>
xml
<!-- Use clear, descriptive names -->
<menuitem id="menu_sales_orders"
          name="Sales Orders"
          parent="menu_sales"
          action="action_sale_order"
          sequence="10"/>

<!-- Avoid technical jargon -->
<menuitem id="menu_customer_invoices"
          name="Customer Invoices"
          parent="menu_accounting"
          action="action_account_move_out_invoice"
          sequence="20"/>

<!-- Use consistent terminology -->
<menuitem id="menu_product_variants"
          name="Product Variants"
          parent="menu_products"
          action="action_product_product"
          sequence="15"/>
xml
<!-- Document complex menu structures -->
<menuitem id="menu_complex_workflow"
          name="Complex Workflow"
          parent="menu_operations"
          sequence="50"/>
          
<!-- 
This menu provides access to the complex workflow management system.
Users can:
- Create new workflow instances
- Monitor workflow progress
- Manage workflow templates
- Access workflow reports

Required permissions: workflow.group_user
-->