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"/>
Menu with Parent
xml
<menuitem id="menu_child"
name="Child Menu"
parent="menu_main_root"
sequence="20"/>
Menu with Actions
Menu with Window Action
xml
<menuitem id="menu_with_action"
name="Records List"
parent="menu_main_root"
action="action_model_list"
sequence="10"/>
Menu with Multiple Actions
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"/>
Menu with Report Action
xml
<menuitem id="menu_report"
name="Reports"
parent="menu_main_root"
action="action_report_main"
sequence="90"/>
Advanced Menu Configurations
Menu with Security Groups
xml
<menuitem id="menu_admin_only"
name="Administration"
parent="menu_main_root"
groups="base.group_system"
sequence="100"/>
Menu with Multiple Groups
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"/>
Menu Categories and Organization
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"/>
Menu Icons and Styling
Menu with Web Icon
xml
<menuitem id="menu_with_icon"
name="Dashboard"
parent="menu_main_root"
web_icon="fa-dashboard"
sequence="1"/>
Menu with Custom Icon
xml
<menuitem id="menu_custom_icon"
name="Custom Module"
web_icon="custom_module,static/description/icon.png"
sequence="5"/>
Menu with Font Awesome Icon
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"/>
Menu Hierarchies
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"/>
Menu Positioning and Sequencing
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>
Menu Customization Patterns
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"/>
Menu Inheritance and Extension
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>
Menu Testing and Validation
Menu Access Testing
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"/>
Menu Naming Conventions
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"/>
Menu Documentation
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
-->