Skip to content

Migrazione con rinomina modulo, compatibile con OpenUpgrade e Odoo SA

Simone Rubino edited this page Nov 20, 2023 · 1 revision

Il problema

Esistono due modi di migrare i dati di un modulo:

Quando un modulo cambia nome (diciamo da vecchio a nuovo) tra una versione major di Odoo e l'altra, gli script di migrazione non vengono lanciati dalla migrazione eseguita da Odoo SA.

In OpenUpgrade questo problema non sussiste perché è possibile elencare i moduli che hanno cambiato nome nel file apriori.py (https://github.com/OCA/OpenUpgrade/blob/d77b865baa194d8e5e6f6dc0d9fbfa14971fb56d/openupgrade_scripts/apriori.py#L6); grazie a questa configurazione il modulo viene rinominato prima di essere aggiornato, quindi gli script di migrazione vengono eseguiti.

Una soluzione

Usare un pre_init_hook (https://www.odoo.com/documentation/16.0/developer/reference/backend/module.html#manifest).

Nel database migrato da Odoo SA, per eseguire la migrazione del modulo vecchio, l'utente dovrà quindi installare il modulo nuovo.

Implementazione

  • Aggiungere al __manifest__.py un pre_init_hook.

  • Nel hook aggiunto, se il modulo vecchio è presente:

    1. Rinominare il modulo.

    2. Eseguire la migrazione.

  • Nella cartella standard delle migrazioni migrations/.., eseguire la migrazione.

  • Inserire la rinomina del modulo nel file apriori.py: è sufficiente una PR tipo https://github.com/OCA/OpenUpgrade/pull/4094.

Esempio: https://github.com/OCA/l10n-italy/commit/1194fb209a8f97410cbe780251de72637dde7d0d.

Note

Il codice della migrazione deve essere eseguibile da due punti diversi: come sempre è meglio evitare di ripetere il codice.

Qualunque libreria esterna usata nel pre_init_hook (ad esempio https://github.com/OCA/openupgradelib) è da aggiungere alle external_dependencies del modulo.

Durante la migrazione, il nome del modulo è già nuovo perché è già stato rinominato in entrambi i flussi di migrazione:

  • In Odoo SA: l'utente sta attivamente installando il modulo nuovo.
  • In OpenUpgrade: il modulo è stato rinominato grazie al file apriori.py.

Questo non è proprio intuitivo, ad esempio può venir naturale voler correggere https://github.com/OCA/l10n-italy/blob/1194fb209a8f97410cbe780251de72637dde7d0d/l10n_it_financial_statements_report/hooks.py#L112 (ogni riferimento a fatti o persone è https://github.com/OCA/l10n-italy/issues/3575 😉).