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
;