How to customize an existing module in Odoo: A comprehensive guide

3 min read
zen8labs how to customise an existing module in odoo - a comprehensive guide 1

Odoo is a powerful open-source ERP system that is highly customizable to meet the specific needs of businesses. One of the key strengths of Odoo is its modular architecture, which allows developers to extend and modify existing modules to tailor the system precisely to their requirements.  In this blog post, we will explore How to customize an existing module in Odoo 17. 

Understanding model and view inheritance in Odoo 

Understanding the ideas behind model and view inheritance is crucial before attempting to customize any of the already-built Odoo modules. These are some of the basic methods that let developers add more features to Odoo modules without changing the main codebase. 

Model inheritance

In Odoo, model inheritance allows you to create new models that inherit attributes and behaviors from existing ones. This technique is commonly used to add new fields, methods, or constraints to existing models. 

When inheriting a model, you specify the _inherit attribute, indicating which base model you are extending. You can then add new fields, override existing methods, or define new ones within your custom model. 

from odoo import models, fields 
 
class CustomSaleOrder(models.Model): 
    _inherit = 'sale.order' 
 
    x_custom_field = fields.Char(string="Custom Field") 

In this example, we’re inheriting the sale.order model and adding a new custom field called x_custom_field.

View inheritance

View inheritance in Odoo allows you to modify the structure and appearance of existing views without directly modifying their XML definitions. This is achieved through XML templates that specify how to extend or modify the existing views. 

When inheriting a view, you typically identify the target view using its XML ID and specify the modifications you want to make using XPath expressions. 

<odoo> 
    <record id="view_order_form_custom" model="ir.ui.view"> 
        <field name="name">sale.order.form.custom</field> 
        <field name="model">sale.order</field> 
        <field name="inherit_id" ref="sale.view_order_form"/> 
        <field name="arch" type="xml"> 
            <xpath expr="//sheet//group" position="inside"> 
                <field name="x_custom_field"/> 
            </xpath> 
        </field> 
    </record> 
</odoo> 

In this example, we’re inheriting the sale.view_order_form view and adding our custom field x_custom_field inside a specified group.

Steps to customize an existing module in Odoo 17 

1. Identify the module to customize 

Identify the existing module you want to customize. For this example, let’s say you want to customize the Sales module

Locate the module: Find the module in your Odoo addons directory. Typically, this path is odoo/addons/sale

2. Create a custom module

To avoid modifying the core files directly, create a new custom module that inherits the existing module. Create a new directory for your custom module, for example, custom_sale

custom_sale/ 
├── __init__.py 
├── __manifest__.py 
├── models/ 
│   ├── __init__.py 
│   └── sale_order.py 
└── views/ 
    └── sale_order_views.xml 

Define your modules manifest in __manifest__.py

{ 
    "name": "Custom Sales Module", 
    "version": "1.0", 
    "depends": ["sale"], 
    "data": [ 
        "views/sale_order_views.xml", 
   ], 
} 

3. Inherit and extend existing models 

In models/sale_order.py, create a new model that inherits from the existing Sales Order mode 

from odoo import models, fields 
 
 
class CustomSaleOrder(models.Model): 
    _inherit = "sale.order" 
 
    x_custom_field = fields.Char(string="Custom Field") 

Update the Views: Modify the existing views to include your new field. Create views/sale_order_views.xml

<odoo> 
    <record id="view_order_form_custom" model="ir.ui.view"> 
        <field name="name">sale.order.form.custom</field> 
        <field name="model">sale.order</field> 
        <field name="inherit_id" ref="sale.view_order_form"/> 
        <field name="arch" type="xml"> 
            <xpath expr="//sheet//group" position="inside"> 
                <field name="x_custom_field"/> 
            </xpath> 
        </field> 
    </record> 
</odoo>

4. Install and test your module 

  • Update Odoo: Update the module list in Odoo by navigating to Apps and clicking on the “Update Apps List” button. 
  • Install the Module: Find your custom modules in the Apps list and install it. 
  • Test the Customization: Navigate to the Sales module and create a new Sales Order to see your custom field in action. 

Conclusion  

The functionality of your ERP system can be greatly improved and brought into better alignment with your company processes by customizing an already-existing Odoo module. The techniques in this article will help you develop a custom module that enhances the functionality of the default Odoo modules in a manner which is both scalable and maintainable. 

Keep in mind that Odoo’s modular architecture is meant to be adaptable, so feel free to experiment and modify the system to meet your needs. You can learn more at zen8labs website till then have fun with coding!

Tuyen Tran, Software Engineer

Related posts

Our work with Golang continues as we solve the fan-in, fan-out pattern. We aim to make it run smoothly so that you can Golang can help you to run project calmly.
4 min read
Programming is often seen as a complex and technical field, but at its heart, it's really about solving the problem. Our new blog introduces a creative approach
4 min read
Did you know two features of Sales and Purchase order used in Odoo? Check this blog to get a better understanding of both Sales and Purchase orders used in Odoo
5 min read