TIL: Odoo Sequences#

Wir wollen für die Chancen (Tabelle lead) eine fortlaufende Nummer number.

Dazu legen wir eine neue Postgres Sequence an.

Aus der Konvention <table>_<column>_seq ergibt sich folgender Name für die Sequence:

lead_number_seq

Definition#

Erstelle die Datei data/lead_number_seq.xml mit folgendem Inhalt:

<?xml version="1.0"?>
<odoo>
    <data noupdate="1">
        <record id="lead_number_seq" model="ir.sequence">
            <field name="name">ACME Chance</field>
            <field name="code">acme_chance.lead.number</field>
            <field name="number_next">10_001</field>
            <field name="company_id" eval="False"/>
        </record>
    </data>
</odoo>

Wir wollen, dass der nächste Wert mit 10.001 beginnt. Dazu setzen wir das Attribut number_next.

Alle weiteren Parameter lassen sich im Code vom Model IrSequence nachlesen.

Wichtig an dieser Stelle ist, dass wir den Record mit einem <data noupdate="1"> wrappen. Sonst würde die Sequence jedes mal wieder auf 10001 gesetzt werden, sobald wir unser Modul updaten. [1]

Konfiguration#

Wie üblich müssen wir die Datei in unserer __manifest__.py referenzieren, z.B.:

{
    'data': [
        'data/lead_number_seq.xml',
    ]
}

Usage#

An Models wird die Sequence über den code referenziert:

class Lead(models.Model):

    number = fields.Integer(
        'Chancennummer',
        default=lambda self: self.env['ir.sequence'].next_by_code('acme_chance.lead.number')
    )

Usage Inspection#

In Postgres sind die ir.sequence Instanzen als ir_sequence_<nummer> hinterlegt. Das hat wenig Bedeutung. Hier ist eine Query, um zu sehen, was sich dahinter verbirgt:

WITH ir_seqs AS (
    SELECT
        substring(sequencename FROM 'ir_sequence_(\d+)')::INTEGER AS ir_sequence_id,
        *
    FROM pg_catalog.pg_sequences
    WHERE sequencename LIKE 'ir_sequence_%'
)
SELECT
    a.sequencename,
    b.name AS ir_sequence_name,
    b.code AS ir_sequence_code,
    a.last_value
FROM ir_seqs a
         JOIN ir_sequence b ON a.ir_sequence_id = b.id
;