XML is a core configuration structure in Odoo. It defines UI architecture, system behavior, permissions, automation, and initial data. It provides declarative, modular control over major system functions.
XML Usement with Examples:
1. View Definitions
Purpose: layout, field behavior, user interaction
Example: Form view for a model
<record id="view_employee_form" model="ir.ui.view">
<field name="name">employee.form</field>
<field name="model">hr.employee</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="name"/>
<field name="job_title"/>
</group>
</sheet>
</form>
</field>
</record>
2. Menu and Action Binding
Purpose: navigation and interface structure
Example: Action linked to form view via menu
<record id="action_employee" model="ir.actions.act_window">
<field name="name">Employees</field>
<field name="res_model">hr.employee</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_hr_employee"
name="Employees"
parent="hr.menu_hr_root"
action="action_employee"/>
3. Access Control and Record Security
Purpose: role-based permissions, data filtering
Example: Record rule
<record id="rule_employee_own" model="ir.rule">
<field name="name">Employee Own Records</field>
<field name="model_id" ref="hr.model_hr_employee"/>
<field name="domain_force">[('user_id', '=', user.id)]</field>
</record>
4. Data Initialization and Configuration
Purpose: preload essential master data
Example: Loading a sequence
<record id="seq_employee_code" model="ir.sequence">
<field name="name">Employee Code</field>
<field name="code">hr.employee.code</field>
<field name="padding">5</field>
<field name="prefix">EMP</field>
</record>
5. QWeb Templates
Purpose: UI rendering for reports, emails, website
Example: Simple report template
<t t-name="report.employee_card">
<div>
<h3><t t-esc="doc.name"/></h3>
<p><t t-esc="doc.job_title"/></p>
</div>
</t>
6. Server Actions and Automation
Purpose: execute internal operations automatically
Example: Scheduled action (cron job)
<record id="ir_cron_employee_check" model="ir.cron">
<field name="name">Check Employee Status</field>
<field name="model_id" ref="hr.model_hr_employee"/>
<field name="state">code</field>
<field name="code">model.check_employee_status()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
</record>
7. Inject Default Data
Purpose: Injecting default data for your master data
Example: Injecting custom data to custom model
<record id="default_custom_data" model="custom.model">
<field name="name">Default Name</field>
<field name="description">Initial data loaded at module install</field>
<field name="active">True</field>
</record>
