Table of Contents
Il problema
Esistono due modi di migrare i dati di un modulo:
- OpenUpgrade (https://github.com/OCA/OpenUpgrade)
- Odoo SA (https://upgrade.odoo.com)
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 (github.com/OCA/OpenUpgrade@d77b865baa/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__.pyunpre_init_hook. -
Nel hook aggiunto, se il modulo vecchio è presente:
-
Rinominare il modulo.
-
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: github.com/OCA/l10n-italy@1194fb209a.
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 github.com/OCA/l10n-italy@1194fb209a/l10n_it_financial_statements_report/hooks.py (L112) (ogni riferimento a fatti o persone è https://github.com/OCA/l10n-italy/issues/3575 😉).