Übersetzungswerte ab Odoo 16

Unser Leitfaden inklusive Demonstrationsmodul für ein erfolgreiches Upgrade
15. Februar 2024 durch
Übersetzungswerte ab Odoo 16
manaTec GmbH, Julius Fitzek
 

Problemstellung:

Bei der Durchführung eines Upgrades des Odoo-Systems für einen unserer Kunden stellten wir fest, dass nach Abschluss des Prozesses die Daten in den übersetzbaren Feldern der benutzerdefinierten Module nur noch auf Englisch vorhanden waren. Unsere anschließende Recherche führte zu der Erkenntnis, dass Odoo in der Version 16 eine Änderung in der Übersetzungslogik vorgenommen hat. Es stellte sich heraus, dass während des Upgrade-Prozesses lediglich die hauseigenen Module von Odoo auf die neue Logik umgestellt wurden, während benutzerdefinierte Module davon unberührt blieben.

Was hat sich geändert?

In den Versionen von Odoo vor der Version 16 wurden Übersetzungen auf Datenbankebene in der Tabelle 'ir_translation' abgelegt. 

Ablage der Übersetzungswerte bis Odoo V15

Seit der Einführung von Version 16 hingegen werden übersetzbare Felder als JSONB-Datentyp in der Datenbank gesichert. Wie der Name bereits vermuten lässt, werden in diesem neuen System die Daten für alle Sprachen in Form eines JSON-Objekts abgelegt. Die Tabelle ‘ir_translation’ entfällt. 

Das Ergebnis präsentiert sich folgendermaßen:

Ablage der Übersetzungswerte in Odoo V16

Lösungsansatz: Migrationsskript

Nach einer ausführlichen Diskussion mit dem Support-Team von Odoo wurde deutlich, dass die einzig praktikable Lösung darin besteht, eigene Migrationsskripte für alle benutzerdefinierten Module zu entwickeln, die übersetzbare Felder enthalten.

Was sind Migrationsskripte?

Migrationsskripte sind ein nützliches Werkzeug, um die Daten eines benutzerdefinierten Moduls so zu transformieren, dass sie auf der Datenbank-Ebene mit der neuen Version von Odoo kompatibel sind. Dabei liegt der Fokus nicht auf eventuell erforderlichen Änderungen im Code, sondern vielmehr auf notwendigen Anpassungen der Daten in der Datenbank, wie es bei unserem Problem mit den Übersetzungen der Fall ist.

Migration Manager:

Odoo verfügt seit TinyERP 4.2 über eine integrierte Migrationsfunktionalität. Der Migration Manager bietet die grundlegende Funktionalität zum Ausführen von Migrationsskripten und stellt eine Struktur bereit, in der diese platziert werden können. Im Folgenden finden Sie den Kommentar an dieser Klasse, welche die grundlegenden Funktionen und Eigenschaften des Migration Managers detailliert beschreibt:

Manages the migration of modules.

Migrations files must be python files containing a 'migrate(cr, installed_version)'function. These files must respect a directory tree structure: A 'migrations' folder which contains a folder by version. Version can be 'module' version or 'server.module' version (in this case, the files will only be processed by this version of the server). Python file names must start by 'pre-' or 'post-' and will be executed, respectively,

before and after the module initialisation. 'end-' scripts are run after all modules have been updated.

A special folder named '0.0.0' can contain scripts that will be run on any version change.

In 'pre' stage, '0.0.0' scripts are run first, while in 'post' and 'end', they are run last.

Example::

    <moduledir>

    `-- migrations

    |-- 1.0

    |   |-- pre-update_table_x.py

    |   |-- pre-update_table_y.py

    |   |-- post-create_plop_records.py

    |   |-- end-cleanup.py

    |   `-- README.txt                      # not processed

    |-- 9.0.1.1                             # processed only on a 9.0 server

    |   |-- pre-delete_table_z.py

    |   `-- post-clean-data.py

    |-- 0.0.0

    |   `-- end-invariants.py               # processed on all version update

    `-- foo.py                              # not processed


OpenUpgrade Library:

Die OpenUpgrade Library ist ein von der Odoo Community Association (OCA) betreutes Projekt, das darauf abzielt, den Prozess der Erstellung von Migrationsskripten zu vereinfachen. Diese Bibliothek bietet eine Vielzahl an Hilfsfunktionen, die speziell darauf ausgerichtet sind, die Komplexität bei der Migration von benutzerdefinierten Modulen zu reduzieren und den Anwendern einen reibungslosen Übergang zu ermöglichen.

Odoo Upgrade Util:

Seit Ende des Jahres 2023 stellt Odoo mit Upgrade Util ebenfalls eine eigene Bibliothek zur Verfügung, die in ihrer Funktionsweise der OpenUpgrade Library ähnelt. Diese von Odoo bereitgestellte Bibliothek umfasst eine Reihe von Hilfsfunktionen, die speziell für die Erstellung und Handhabung von Migrationsskripten konzipiert sind. Diese Neuentwicklung zielt darauf ab, den Nutzern zusätzliche Unterstützung und Ressourcen bei der Durchführung von Systemaktualisierungen und -migrationen zu bieten.

Migrationsskript an einem Demonstrationsmodul:

Um diesen Prozess besser zu veranschaulichen, haben wir ein Demonstrationsmodul für Sie entwickelt. Dieses Modul fügt ein übersetzbares Textfeld zum Modell 'product.template' hinzu. Sie können das Modul hier herunterladen und sich somit selbst ein Bild von seiner Funktionsweise machen. 

Im Odoo-Frontend präsentiert sich das Ganze folgendermaßen.

Odoo Frontend des Demonstrationsmoduls

In unserem Beispiel verwenden wir die OpenUpgrade Library, weil sie eine nützliche Funktion zur Migration von Übersetzungswerten bereitstellt. Diese Bibliothek kann als Python-Paket mittels PIP installiert werden:

pip install openupgradelib

Im Demonstrationsmodul stoßen Sie auf den Ordner „migrations“, in dem sich ein Unterordner mit der Bezeichnung „16.0.1.0.0“ befindet. In diesem Unterordner liegt die Datei „post-migration.py“. Wie im Abschnitt „Migration Manager“ erläutert, wird diese Datei im Zuge eines Updates des Moduls auf die Version „16.0.1.0.0“ nach dem Aktualisierungsvorgang des Moduls ausgeführt.

# -*- coding: utf-8 -*-

from openupgradelib import openupgrade

from openupgradelib.openupgrade_160 import migrate_translations_to_jsonb

@openupgrade.migrate()
def migrate(env, version):
    fields_spec
= [
        (
'product.template', 'custom_note')
    ]
    migrate_translations_to_jsonb(env,
fields_spec=fields_spec)


Wie Sie erkennen können, verwendet das Migrationsskript den OpenUpgrade-Dekorator sowie die Funktion „migrate_translations_to_jsonb“. Um diese Funktion nutzen zu können, muss lediglich ein Parameter in Form einer Liste von Tupeln übergeben werden. Diese Tupel sollten die Modell- und Feldnamen enthalten, für die die Übersetzungsdaten migriert werden sollen.

Sie haben nun die Möglichkeit, Ihr eigenes Migrationsskript auszuführen, indem Sie das betreffende Modul über die Kommandozeile aktualisieren, nachdem Sie ein Upgrade von Odoo durchgeführt haben. 

python3 <odoo-bin> --config /etc/odoo/odoo.conf -d <upgrade-datenbank> --update=<module> --i18n-overwrite --no-http --stop-after-init

Beispiel:

python3 /opt/odoo/odoo/odoo-bin --config /etc/odoo/odoo.conf -d odoo16-translation-demo --update=manatec_translation_demo --i18n-overwrite --no-http --stop-after-init

Fazit:

Diese Betrachtung verdeutlicht die Notwendigkeit einer sorgfältigen Planung und Ausführung von Migrationsskripten bei der Aktualisierung auf Odoo 16 oder neuere Versionen, insbesondere bei der Handhabung von Übersetzungswerten in benutzerdefinierten Modulen.
Dank der Unterstützung durch die Hilfsfunktionen der OpenUpgrade Library lässt sich die Erstellung dieser notwendigen Skripte jedoch verhältnismäßig einfach bewerkstelligen. 

Sie haben Fragen oder brauchen Unterstützung in Ihrem Upgrade-Projekt? Dann melden Sie sich gern jederzeit bei uns! Wir freuen uns auf Ihre Kontaktanfrage.


Quellen: postgresql.org, github.comoca.github.io


 
Effiziente Odoo Mailserver-Integration
Eingehende und ausgehende Mailserver mit G-Mail (Google Workspace) und OAuth2 Authentifizierung in Odoo