In the realm of Odoo, a powerful open-source business management software, the creation and management of sequences play a crucial role in maintaining structured and organized data. Sequences are commonly used for generating unique identifiers for records, such as invoice numbers, customer IDs, or any other incremental values. This article delves into the technical aspects of sequence creation in Odoo, focusing on how to define, configure, and utilize sequences effectively.
Defining Sequences in XML
The first step in creating a sequence in Odoo is defining it in XML. Sequences are typically defined in the module's data files, usually within a specific XML file. The most common attributes for sequences in Odoo are as follows:
name: Specifies the display name of the sequence.
<field name="name">My Sequence</field>
code: Sets a unique code for the sequence. This code is used to reference the sequence in the Python code.
<field name="code">my_sequence_code</field>
implementation: Defines the type of sequence. The possible values are 'standard', 'no_gap', 'easy', and 'prefix'.
<field name="implementation">standard</field>
padding: Specifies the number of digits the sequence should have. The sequence values are padded with zeros to match this length.
<field name="padding">5</field>
prefix: Sets a prefix to be added to each generated sequence value.
<field name="prefix">ABC-</field>
suffix: Adds a suffix to each generated sequence value.
<field name="suffix">-XYZ</field>
start: Defines the initial value of the sequence.
<field name="start">1000</field>
increment: Sets the amount by which the sequence value is incremented each time.
<field name="increment">1</field>
use_date_range: If set to True, the sequence will reset to its initial value when the date changes.
<field name="use_date_range" eval="True"/>
number_next: Specifies the next value that the sequence will generate. This can be useful when migrating data.
<field name="number_next">500</field>
number_increment: Sets the increment value for the number_next field.
<field name="number_increment">5</field>
Here's an example of an XML code defining a sequence for patient IDs in a hospital with various attributes: Usually this will be saved as data.xml in the module.
<?xml version='1.0' encoding='utf-8'?>
<odoo>
<data>
<record id="sequence_patient" model="ir.sequence">
<field name="name">Patient ID Sequence</field>
<field name="code">patient_id_sequence</field>
<field name="implementation">standard</field>
<field name="padding">4</field>
<field name="prefix">PID-</field>
<field name="suffix">-HOSP</field>
<field name="start">1000</field>
<field name="increment">1</field>
<field name="use_date_range" eval="True"/>
<field name="number_next">2000</field>
<field name="number_increment">2</field>
</record>
</data>
</odoo>
Explanation of the attributes used in this example:
- name: "Patient ID Sequence" - Display name for the sequence.
- code: "patient_id_sequence" - Unique code to reference the sequence.
- implementation: "standard" - Standard sequence implementation.
- padding: 4 - Sequence values will be padded with zeros to have a length of 4 characters.
- prefix: "PID-" - Prefix added to each generated sequence value.
- suffix: "-HOSP" - Suffix added to each generated sequence value.
- start: 1000 - Initial value of the sequence.
- increment: 1 - The sequence value is incremented by 1 for each new record.
- use_date_range: True - The sequence will reset to its initial value when the date changes.
- number_next: 2000 - Specifies the next value that the sequence will generate.
- number_increment: 2 - Increment value for the number_next field.
Now we can write the model code to create this field as below
from odoo import models, fields, api
class HospitalPatient(models.Model):
_name = 'hospital.patient'
_description = 'Hospital Patient'
name = fields.Char(string='Patient Name', required=True)
patient_id = fields.Char(string='Patient ID', readonly=True, copy=False)
@api.model
def create(self, values):
if values.get('patient_id', '/') == '/':
values['patient_id'] = self.env['ir.sequence'].next_by_code('patient_id_sequence') or '/'
return super(HospitalPatient, self).create(values)
notice that the argument ' patient_id_sequence ' is the code of the sequence that we created in the data.xml file.
The .next_by_code method is a method provided by the ir.sequence model in Odoo. This method is used to retrieve the next value in a sequence identified by a specific code.
self.env['ir.sequence'].next_by_code('patient_id_sequence')
self.env['ir.sequence']: This part fetches the ir.sequence model through the Odoo environment (env). It provides access to the functionality of the ir.sequence model.
.next_by_code('patient_id_sequence'): This part calls the next_by_code method of the ir.sequence model, passing the code 'patient_id_sequence' as an argument. The code is used to identify which sequence you want to get the next value from.
So, in summary, .next_by_code('patient_id_sequence') retrieves the next value in the sequence associated with the code 'patient_id_sequence'. The code is a way of uniquely identifying a particular sequence within the system. Each sequence created in Odoo has a unique code, and you use this code to fetch the next value from that specific sequence.
Once we have the model and data files ready, we can simply use this field in the view, and it will display the sequence as required. Sequences in Odoo provide an elegant solution for generating unique identifiers and maintaining data integrity. By defining sequences in XML and integrating them into Python models, developers can ensure the systematic generation of incremental values. Understanding the nuances of sequence creation is crucial for building robust Odoo modules that adhere to business logic and requirements.