Skip to content

Code Snippet Reference

This section provides a comprehensive reference to all available code snippets for Odoo development. From defining models in Python to creating views in XML, these snippets are designed to help you write code efficiently and consistently. Ideal for both beginners and experienced developers, this guide serves as a complete resource for everyday development tasks.

Python Snippets

🔧 Model Definition

odoo new model class : Create a new Odoo model class

python
from odoo import fields,models 

class ModelName(models.Model):
    _name = 'model.name'
    _description = 'Model Description'

    name = fields.Char(string='Name', required=True)

odoo classical inherited model class : Create classical inheritance

python
from odoo import fields,models

class ModelName(models.Model):
    _name = 'model.name'
    _inherit = 'model.to.inherit'
    _description = 'Model Description'

    new_field = fields.Char(string='New Field')

odoo delegated inherited model class : Create delegation inheritance

python
from odoo import fields, models

class ModelName(models.Model):
    _name = 'model.name'
    _inherits = {'parent.model': 'parent_id'}
    _description = 'Model Description'

    parent_id = fields.Many2one('parent.model', required=True, ondelete="cascade")

odoo extended inherited model class : Extend an existing model

python
from odoo import fields, models, api

class ModelName(models.Model):
    _inherit = 'model.to.extend'

    @api.model
    def create(self, vals):
        # Custom logic before creation
        res = super().create(vals)
        # Custom logic after creation
        return res

🔧 Fields

odoo boolean field : Create Boolean field

python
fields.Boolean(string="Name", help="Help text", default=False, tracking=True)

odoo binary field : Create Binary field

python
fields.Binary(string="Name", help="Help text", attachment=True, max_size=10)

odoo char field : Create Char field

python
fields.Char(string="Name", help="Help text", required=False, tracking=True, translate=True)

odoo integer field : Create Integer field

python
fields.Integer(string="Name", help="Help text", default=0, tracking=True)

odoo image field : Create Image field

python
fields.Image(string="Name", help="Help text", max_width=1024, max_height=1024)

odoo float field : Create Float field

python
fields.Float(string="Name", help="Help text", digits=(16, 2), tracking=True)

odoo text field : Create Text field

python
fields.Text(string="Name", help="Help text", translate=True)

odoo html field : Create HTML field

python
fields.Html(string="Name", help="Help text", sanitize=True, translate=True)

odoo date field : Create Date field

python
fields.Date(string="Name", help="Help text", tracking=True)

odoo datetime field : Create Datetime field

python
fields.Datetime(string="Name", help="Help text", tracking=True)

odoo selection field : Create Selection field

python
fields.Selection([
    ('draft', 'Draft'),
    ('confirmed', 'Confirmed'),
    ('done', 'Done')
],
string="Status",
default='draft',
tracking=True,
help="Help text")

odoo many2one field : Create Many2one field

python
fields.Many2one('model.name', string="Name", help="Help text", tracking=True, ondelete='cascade', check_company=True)

odoo many2many field : Create Many2many field

python
fields.Many2many('model.name', string="Name", help="Help text", tracking=True, check_company=True)

odoo one2many field : Create One2many field

python
fields.One2many('model.name', 'connection_field', string="Name", help="Help text", tracking=True)

odoo monetary field : Create Monetary field

python
fields.Monetary(string="Name", help="Help text", currency_field="currency_id", tracking=True)

odoo reference field : Create Reference field

python
fields.Reference(string="Name", selection=[('model1', 'Model 1'), ('model2', 'Model 2')], help="Help text")

odoo json field : Create JSON field

python
fields.Json(string="Name", help="Help text")

🔧 Methods

odoo create method : Create method

python
@api.model_create_multi
def create(self, vals_list):
    # Pre-create logic (optional)
    records = super().create(vals_list)
    # Post-create logic (optional)
    return records

odoo write method : Write method

python
def write(self, values):
    # Pre-write logic (optional)
    res = super().write(values)
    # Post-write logic (optional)
    return res

odoo unlink method : Unlink method

python
def unlink(self):
    # Pre-unlink logic (optional)
    res = super().unlink()
    # Post-unlink logic (optional)
    return res

odoo onchange method : Onchange method

python
@api.onchange('field_name')
def _onchange_field_name(self):
    if self.field_name:
        self.target_field = value

odoo compute method : Compute method

python
field_name = fields.FieldType(string='Field Label', compute='_compute_field_name', store=True)

@api.depends('dependency_field')
def _compute_field_name(self):
    for rec in self:
        # Compute logic
        rec.field_name = value

odoo constraints method : Constraints method

python
@api.constrains('field_name')
def _check_field_name(self):
    for rec in self:
        if not rec.field_name:
            raise ValidationError("field_name must be set")

odoo search method : Search method

python
@api.model
def _search_name(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
    args = args or []
    domain = []
    if name:
        domain = ['|', '|',
            ('name', operator, name),
            ('field_name', operator, name),
            ('field_name', operator, name)]
    return self._search(domain + args, limit=limit, access_rights_uid=name_get_uid)

odoo default get method : Default get method

python
@api.model
def default_get(self, fields_list):
    res = super().default_get(fields_list)
    res.update({
        'field_name': default_value,
    })
    return res

odoo action method : Action method

python
def action_action_name(self):
    self.ensure_one()
    return {
        'name': _('Action Title'),
        'type': 'ir.actions.act_window',
        'res_model': 'model.name',
        'view_mode': 'list,form',
        'domain': [('field', '=', self.field)],
        'context': {'default_field': self.field},
    }

🔧 Error Handling

odoo validation error : Validation Error

python
raise ValidationError("Validation error message")

odoo missing error : Missing Error

python
raise MissingError("Missing error message")

odoo access error : Access Error

python
raise AccessError("Access error message")

odoo user error : User Error

python
raise UserError("User error message")

odoo redirect warning : Redirect Warning

python
raise RedirectWarning("Warning message", action_id, "Button Label")

🔧 Notifications

odoo info notification : Info Notification

python
return self.env.user.notify_info("Info message", sticky=True)

odoo success notification : Success Notification

python
return self.env.user.notify_success("Success message", sticky=True)

odoo warning notification : Warning Notification

python
return self.env.user.notify_warning("Warning message", sticky=True)

odoo rainbow man notification : Rainbow Man Notification

python
self.env.user.notify_success("Rainbow message", sticky=True, title="Success!", type="rainbow_man")

XML Snippets

🔧 Common Tags

odoo xml : Basic Odoo XML structure

xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <!-- Enter your Odoo XML code here -->
</odoo>

odoo record : Record tag

xml
<record id="record_id" model="model.name">
    <field name="field_name">value</field>
    <!-- Add more <field> tags here -->
</record>

🔧 Views

odoo form view : Form view

xml
<record id="model_name_view_form" model="ir.ui.view">
    <field name="name">model.name.view.form</field>
    <field name="model">model.name</field>
    <field name="arch" type="xml">
        <form string="Form Title">
            <sheet>
                <group>
                    <field name="name"/>
                    <!-- Add your fields here -->
                </group>
            </sheet>
        </form>
    </field>
</record>

odoo list view : List view

xml
<record id="model_name_view_list" model="ir.ui.view">
    <field name="name">model.name.view.list</field>
    <field name="model">model.name</field>
    <field name="arch" type="xml">
        <list string="List Title">
            <field name="name"/>
            <!-- Add your fields here -->
        </list>
    </field>
</record>

odoo pivot view : Pivot view

xml
<record id="model_name_view_pivot" model="ir.ui.view">
    <field name="name">model.name.view.pivot</field>
    <field name="model">model.name</field>
    <field name="arch" type="xml">
        <pivot string="Pivot Title">
            <field name="field_name"/>
            <field name="field_name"/>
            <field name="field_name"/>
        </pivot>
    </field>
</record>

odoo calendar view : Calendar view

xml
<record id="model_name_view_calendar" model="ir.ui.view">
    <field name="name">model.name.view.calendar</field>
    <field name="model">model.name</field>
    <field name="arch" type="xml">
        <calendar string="Calendar Title" date_start="start_date_field" date_stop="end_date_field" mode="month">
            <field name="name"/>
            <!-- Add your fields here -->
        </calendar>
    </field>
</record>

odoo graph view : Graph view

xml
<record id="model_name_view_graph" model="ir.ui.view">
    <field name="name">model.name.view.graph</field>
    <field name="model">model.name</field>
    <field name="arch" type="xml">
        <graph string="Graph Title" type="bar">
            <field name="field_name" type="row"/>
            <field name="field_name" type="measure"/>
        </graph>
    </field>
</record>

odoo search view : Search view

xml
<record id="model_name_view_search" model="ir.ui.view">
    <field name="name">model.name.view.search</field>
    <field name="model">model.name</field>
    <field name="arch" type="xml">
        <search string="Search Title">
            <field name="name"/>
            <!-- Add your fields here -->
            <filter string="Filter Name" name="filter_name" domain="[('field', '=', value)]"/>
            <group expand="0" string="Group By">
                <filter string="Group By Name" name="group_by_name" context="{'group_by': 'field'}"/>
            </group>
        </search>
    </field>
</record>

odoo kanban view : Kanban view

xml
<record id="model_name_view_kanban" model="ir.ui.view">
    <field name="name">model.name.view.kanban</field>
    <field name="model">model.name</field>
    <field name="arch" type="xml">
        <kanban string="Kanban Title" class="o_kanban_small_column">
            <field name="name"/>
            <!-- Add your fields here -->
            <templates>
                <t t-name="kanban-box">
                    <div class="oe_kanban_global_click">
                        <div class="oe_kanban_details">
                            <strong class="o_kanban_record_title">
                                <field name="name"/>
                            </strong>
                        </div>
                    </div>
                </t>
            </templates>
        </kanban>
    </field>
</record>

🔧 View Components

odoo button box : Button box

xml
<div class="oe_button_box" name="button_box">
    <!-- Add smart buttons here -->
</div>

odoo smart button : Smart button

xml
<button name="action_view_records" type="object" class="oe_stat_button" icon="fa-list">
    <field name="record_count" widget="statinfo" string="Records"/>
</button>

odoo header : Header with buttons and statusbar

xml
<header>
    <button name="action_confirm" string="Confirm" type="object" states="draft" class="btn-primary"/>
    <button name="action_cancel" string="Cancel" type="object" states="confirmed"/>
    <field name="state" widget="statusbar" statusbar_visible="draft,confirmed,done"/>
</header>

odoo sheet : Sheet with group and fields

xml
<sheet>
    <group>
        <field name="field_name"/>
        <!-- Add more fields here -->
    </group>
</sheet>

odoo notebook : Notebook with pages

xml
<notebook>
    <page string="Page Title" name="page_name">
        <!-- Add your page content here -->
    </page>
</notebook>

odoo chatter : Chatter component

xml
<div class="oe_chatter">
    <field name="message_follower_ids"/>
    <field name="activity_ids"/>
    <field name="message_ids"/>
</div>

🔧 Actions and Menus

odoo action : Window action

xml
<record id="action_model_name" model="ir.actions.act_window">
    <field name="name">Action Name</field>
    <field name="res_model">model.name</field>
    <field name="view_mode">list,form</field>
    <field name="help" type="html">
        <p class="o_view_nocontent_smiling_face">
            Create your first record!
        </p>
    </field>
</record>

odoo menu root : Root menu item

xml
<menuitem id="menu_root_name"
    name="Root Menu Name"
    web_icon="module_name,static/description/icon.png"
    sequence="10"/>

odoo menu category : Category menu item

xml
<menuitem id="menu_category_name"
    name="Category Name"
    sequence="10"/>

odoo menu action : Action menu item

xml
<menuitem id="menu_menu_name"
    name="Menu Name"
    action="action_name"
    parent="parent_menu"
    sequence="10"/>

🔧 Inheritance

odoo view inherit : View inheritance

xml
<record id="model_name_view_view_type_inherit" model="ir.ui.view">
    <field name="name">model.name.inherit.view_type</field>
    <field name="model">model.name</field>
    <field name="inherit_id" ref="module.view_id"/>
    <field name="arch" type="xml">
        <!-- Add your xpath modifications here -->
    </field>
</record>

odoo xpath : XPath expression

xml
<xpath expr="//field[@name='field_name']" position="after">
    <!-- Add your content here -->
</xpath>

🔧 Field Attributes

odoo field : Basic field

xml
<field name="field_name"/>

odoo field widget : Field with widget

xml
<field name="field_name" widget="many2many_tags"/>

odoo field invisible : Invisible field

xml
<field name="field_name" invisible="True"/>

odoo field readonly : Readonly field

xml
<field name="field_name" readonly="True"/>

odoo field required : Required field

xml
<field name="field_name" required="True"/>

odoo field state : State field

xml
<field name="state" widget="statusbar" statusbar_visible="draft,confirmed,done"/>

odoo options : Field options

xml
options="{'option_name': option_value}"

odoo domain : Field domain

xml
domain="[('field_name', '=', value)]"

odoo groups : Groups restriction

xml
groups="base.group_user"