Skip to content

Yosef-AlSabbah/odt_reference_mixin

Repository files navigation

Reference Code Mixin

Author: Yousef M. Y. Al Sabbah
Version: 18.0.1.0.0
Category: Technical


The Problem

In real Odoo projects, many models need:

  • A human-readable reference (e.g., SO001, PO001, REQ001)
  • Auto-generated sequence numbers
  • A consistent display name format

Without a mixin, developers copy the same logic repeatedly:

# This code is repeated in EVERY model that needs a reference!
reference = fields.Char(required=True, copy=False, default='New')

@api.model_create_multi
def create(self, vals_list):
    for vals in vals_list:
        if vals.get('reference', 'New') == 'New':
            vals['reference'] = self.env['ir.sequence'].next_by_code('my.sequence')
    return super().create(vals_list)

def name_get(self):
    return [(r.id, f"[{r.reference}] {r.name}") for r in self]

This is copied across:

  • Sales Orders
  • Purchase Orders
  • Requests, Tickets, Assets
  • Custom workflows

The Solution: A Mixin!

"This model has a reference code and knows how to display itself."

This is a CAPABILITY, not a business concept → Perfect for a Mixin!


Usage

Step 1: Inherit the Mixin

from odoo import fields, models

class MyRequest(models.Model):
    _name = 'my.request'
    _description = 'My Request'
    _inherit = ['reference.mixin']  # <-- Just add this!
    
    # Set your sequence code
    _reference_sequence = 'my.request.sequence'
    
    # Your fields (reference is inherited!)
    name = fields.Char(string='Name')

Step 2: Create a Sequence

<record id="sequence_my_request" model="ir.sequence">
    <field name="name">My Request Sequence</field>
    <field name="code">my.request.sequence</field>
    <field name="prefix">REQ</field>
    <field name="padding">5</field>
</record>

Step 3: Done!

Your model now has:

  • reference field (auto-generated)
  • display_name computed as [REF00001] Name
  • ✅ Sequence generation on create

What You Get

Feature Description
reference field Auto-generated, readonly, indexed
display_name Computed from reference + name
create() override Generates sequence automatically
Company support Works with multi-company

Configuration Options

Override these in your model:

class MyModel(models.Model):
    _name = 'my.model'
    _inherit = ['reference.mixin']
    
    # Required: Your sequence code
    _reference_sequence = 'my.model.sequence'
    
    # Optional: Change field name (default: 'reference')
    _reference_field = 'reference'
    
    # Optional: Change default value (default: 'New')
    _reference_default = 'New'

Real Odoo Examples

This mixin follows the same pattern used in Odoo core:

Module Model Sequence
Sale sale.order SO00001
Purchase purchase.requisition PR00001
Stock stock.picking.batch BATCH/00001

Demo Model

This module includes a demo.request model that demonstrates the mixin in action.

After installation:

  1. Go to Reference Mixin Demo menu
  2. Create a new Demo Request
  3. Notice the reference is auto-generated (REQ00001, REQ00002, etc.)

File Structure

odt_reference_mixin/
├── __init__.py
├── __manifest__.py
├── README.md
├── data/
│   └── sequence_data.xml      # Demo sequence
├── models/
│   ├── __init__.py
│   ├── reference_mixin.py     # THE MIXIN
│   └── demo_request.py        # Demo model
├── security/
│   └── ir.model.access.csv
└── views/
    ├── demo_request_views.xml
    └── menu_views.xml

License

LGPL-3


Author: Yousef M. Y. Al Sabbah

About

Reusable Odoo mixin module that automatically generates customizable reference codes with sequences. Demonstrates the power of mixins to easily add features to any model, promoting code reuse and faster development without duplication.

Topics

Resources

Stars

Watchers

Forks

Contributors

Languages