Upgrade Odoo

c'est une étape compliqué car il n'existe pas formellement de procédure unique et elle dépend des versions sachant qu'il faut faire gaffe aux dépendences entre les modules. En outre, il faut que la version des modules soient homogène au risque d'y avoir des messages d'alertes


Sources :

Préalable

1. Il y a besoin de backup les bases et filestores :

su - postgres
pg_dump prod > prod.sql

Et d'importer la base + le filestore (qui peut contenir des fichiers de caches et factures pdf). Se rendre sur https://DOMAINE.org/web/database/manager

2. Depuis le site web, enlever les modules que l'on utilise pas. Cela devrait réduire le nombres d'erreurs :

  • Enlever module “galicea*”, “évènements”, “payement*”, partner_autocomplete, sms, snailmail, …

3. Installer le module “database cleanup” et l'executer pour enlever les résidus depuis l'interface d'administration en mode développeur.

cd -
git clone -b 13.0 https://github.com/OCA/server-tools.git
cp -ir server-tools/database_cleanup/ odoo/addons/

Mineures

C'est à dire d'une version de commit git vers une plus récente.

Soit, ce type de procédure :

cd /etc/
git add . && git commit -am "balais"
apt update && apt upgrade -y
su - odoo
source /home/odoo/.venv/bin/activate
cd odoo
cp -i debian/odoo.conf /tmp/ 
git checkout debian/odoo.conf
systemctl stop odoo
git pull --depth=1
cp -i /tmp/odoo.conf debian/
./odoo-bin -c debian/odoo.conf -d 2023 -u all --stop-after-init --no-http
systemctl start odoo

Vérifier sur le site s'il y a des paramètres qui ont sauté comme :

  1. l'affichage des liens de menu du site
  2. purger les données plus utilisé

12 vers 13

Python 3.7.3 fonctionne

On stoppe l'instance Odoo12 et on utilise le compte odoo en activant l'environnement virtual de python :

su - odoo
source .venv/bin/activate
pip install git+https://github.com/OCA/openupgradelib.git@master
# pip install psycopg2-binary #optionnel ?
pip install -r odoo/requirements.txt
mv -i odoo odoo12
git clone --depth=1 -b 13.0 https://github.com/OCA/OpenUpgrade.git odoo
cp -i odoo12/debian/odoo.conf odoo/debian/odoo.conf

Désactiver temporairement les tâches cron pour éviter qu'ils se lance en double :

max_cron_threads = 0

Cliquez pour afficher ⇲

Cliquez pour masquer ⇱

ou de manière définitive :

update ir_cron set active ='f' where active = 't';

Copier les modules à la version 13 dans un dossier dédié par l'instance :

mkdir /home/odoo/odoo/addons-migration

Ajouter ce dossier dans la directive “addons_path” du fichier de configuration.

Lancer l'openupgrade pour mettre à jour la base avec ses addons:

./odoo-bin -c debian/odoo.conf -d BASE_A_UPGRADE -u all --stop-after-init --no-http --data-dir=/tmp/

Conseils :

  • Sans l'option -d , l'upgrade ne se lancera pas
  • Ne pas jouer sans la commande –data-dir qui contient le filestore temporaire pour upgrader les modules, etc de l'instance odoo OpenUpgrade et non pas de l'instance futur Odoo13!

Erreurs rencontrés

  • On doit rajouter les modules manquant si cette erreur survient :
ERROR test odoo.modules.loading: Some modules have inconsistent states, some dependencies may be missing: ['database_cleanup', 'dms', 'report_xlsx', 'theme_common', 'web_responsive']

Attention à bien vérifier leurs dépendances décritent dans le fichier manifest.py du module.

  • si le nouveau module dit qu'il y a une relation manquante (et donc un modèle), c'est qu'il y a besoin d'enlever le dossier de migration car c'est une installation qu'il doit faire et non un upgrade :

ERROR test OpenUpgrade: dms: error in migration script dms/migrations/13.0.4.0.0/pre-migration.py: relation “dms_directory” does not exist

  • On suppose qu'il y a une boucle de lecture des modules car il manque un module ayant la description “MuK Large Objects Field”. Cette description est liée au module “muk_fields_lobject”. Il y a alors besoin de rajouter ce module dans le bon dossiers de addons mais aussi de récupérer son module dont-il en dépend soit “muk_utils”
./odoo12/odoo.log:2022-08-12 08:06:03,508 6141 INFO test odoo.addons.base.models.ir_module: ALLOW access to module.button_install on ['Phone Numbers Validation', 'MuK Large Objects Field', 'Phone Numbers Validation'] to user __system__ #1 via n/a
  • Enlever les lignes de codes avec “@api.multi”
2022-08-12 08:31:51,893 6303 CRITICAL test odoo.modules.module: Couldn't load module muk_utils
2022-08-12 08:31:51,894 6303 CRITICAL test odoo.modules.module: module 'odoo.api' has no attribute 'multi'
  • ?
2022-08-12 08:41:54,783 6744 INFO test odoo.addons.base.models.ir_ui_view: Element '<xpath expr="//field[@name='datas_fname']">' cannot be located in parent view

Contexte de l'erreur :
Vue `ir_attachment.tree`
[view_id: 2438, xml_id: muk_utils.view_attachment_tree, model: ir.attachment, parent_id: 50
[...]

    'index_content': self._index(bin_data, attach.datas_fname, attach.mimetype),
odoo.tools.convert.ParseError: "'ir.attachment' object has no attribute 'datas_fname'" while parsing /home/odoo/odoo/addons/calendar/views/calendar_views.xml:2, near

https://www.holdenrehg.com/blog/2019-03-09_odoo-images-and-attachments-explain-regenerate-assets

  • Une contrainte dans l'impossibilité de se supprimer :
INFO test odoo.modules.loading: Model mail.mass_mailing.campaign is declared but cannot be loaded! (Perhaps a module was partiall
y removed or renamed)
INFO test odoo.addons.base.models.ir_model: Deleting 449@ir.model (mass_mailing.model_mail_mass_mailing_campaign)               
ERROR test odoo.sql_db: bad query: DELETE FROM ir_model WHERE id IN (449)                                                       
ERROR: update or delete on table "ir_model" violates foreign key constraint "ir_model_relation_model_fkey" on table "ir_model_relation"                      
DETAIL:  Key (id)=(449) is still referenced from table "ir_model_relation".

Regardons dans la base à quoi correspond la clé 449 :

select * from ir_model where id = 449;
 id  |         name          |           model            |               info                | state | transient | create_uid | create_date | write_uid | write_date | is_mail_thread | website_form_access | website_form_default_field_id | website_form_label | is_mail_activity | is_mail_blacklist | website_form_key 
-----+-----------------------+----------------------------+-----------------------------------+-------+-----------+------------+-------------+-----------+------------+----------------+---------------------+-------------------------------+--------------------+------------------+-------------------+------------------
 449 | Mass Mailing Campaign | mail.mass_mailing.campaign | Model of mass mailing campaigns.  | base  | f         |            |             |           |            | f              |                     |                               |                    |                  |                   | 
(1 row)

test=# select * from ir_model_relation where model = 449;                                                                                                    
 id  |           name            | model | module |        date_update         |         date_init          | create_uid | create_date | write_uid | write_date 
-----+---------------------------+-------+--------+----------------------------+----------------------------+------------+-------------+-----------+------------
 166 | mail_mass_mailing_tag_rel |   449 |     27 | 2020-03-02 08:49:32.121023 | 2020-03-02 08:49:32.121023 |            |             |           | 
(1 row)

On supprime cette entrée dans la table ir_model_relation :

test=# delete from ir_model_relation where model = 449;
DELETE 1

Puis on verra apparaitre ce type de ligne indiquant que l'application a réussi à supprimer l'entrée :

INFO test odoo.addons.base.models.ir_model: Deleting 449@ir.model (mass_mailing.model_mail_mass_mailing_campaign) 
  • ?
chown odoo: /usr/lib/python3/dist-packages/odoo/ -R
mv -i /usr/lib/python3/dist-packages/odoo/ /usr/lib/python3/dist-packages/odoo.old
ln -s /var/lib/odoo/OpenUpgrade/addons /usr/lib/python3/dist-packages/odoo/addons

Dans postgres, il y aurait besoin de désactiver le contrôle de trigger :

su - postgres
psql $BASE
alter table pos_config DISABLE TRIGGER all;
alter table account_journal DISABLE TRIGGER all;
alter table product_template DISABLE TRIGGER all;
\q
exit

13 vers 14

Python 3.7.3 fonctionne

On télécharge le module qui va permettre de mettre à jour ceux de l'instance en production:

su - odoo
mv -i odoo odoo13
git clone --depth=1 -b 14.0 https://github.com/odoo/odoo.git
cp -i odoo13/debian/odoo.conf odoo/debian/odoo.conf
git clone --depth=1 -b 14.0 https://github.com/OCA/OpenUpgrade.git 
source .venv/bin/activate
pip install git+https://github.com/OCA/openupgradelib.git@master
pip install importlib
pip install -r odoo/requirements.txt

Vérifier qu'il y ait bien les dossiers des addons de selectionnés :

addons_path = /home/odoo/odoo/odoo/addons,/home/odoo/odoo/addons,/home/odoo/OpenUpgrade

Il nous reste plus qu'a mettre à jour la base de donnée :

./odoo-bin --config /home/odoo/odoo/debian/odoo.conf --logfile /home/odoo/odoo/debian/odoo.log -d MA_BASE -u all --stop-after-init --load=base,web,openupgrade_framework --upgrade-path=/home/odoo/OpenUpgrade/openupgrade_scripts/scripts/

S'il arrive à arriver jusqu'a la fin, relancer l'upgrade des modules sans OpenUpgrade pour mettre à jour les vues et en modifiant le fichier de conf :

addons_path = /home/odoo/odoo/odoo/addons,/home/odoo/odoo/addons
./odoo-bin --config /home/odoo/odoo/debian/odoo.conf --logfile /home/odoo/odoo/debian/odoo.log -d MA_BASE -u all --stop-after-init

Conseils:

  • Ne pas toucher à –data-dir dans le fichier de conf car on utile l'instance odoo prévu pour tourner définitivement avec
  • Enlever les modules partner_autocomplete, sms, snailmail + lancer un nettoyage des tables

Erreurs rencontrés

  • S'il y a l'erreur de modules inconsistant, alors faire la maj du module seul à seul en le récupérant à la bonne version dispo :

“2022-08-15 13:46:03,091 16469 ERROR odoo12 odoo.modules.loading: Some modules have inconsistent states, some dependencies may be missing: ['partner_autocomplete', 'sms', 'snailmail']”

/home/odoo/.venv/bin/python3 /home/odoo/odoo/odoo-bin -c /home/odoo/odoo/debian/odoo.conf -d odoo12 -u sms --stop-after-init
  • Si l'interface indique :
"Could not get content for /web_diagram/static/src/scss/diagram_view.scss defined in bundle 'web.assets_backend'"

Alors il faudra re-installer le module web_diagram de la version 13…

  • Si la version de python est ancienne ?
WARNING odoo12 py.warnings: /home/odoo/.venv/lib/python3.7/site-packages/jinja2/sandbox.py:82: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working from collections import MutableSet, MutableMapping, MutableSequence
  • Si la version de python est ancienne ?
WARNING ? py.warnings: /home/odoo/.venv/lib/python3.7/site-packages/reportlab/__init__.py:8: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses import sys, os, imp
  • Il y a peut-être besoin de ces dépendances ?
apt install python3-num2words python3-phonenumbers xfonts-75dpi xfonts-base

14 vers 15

Python 3.7.3 fonctionne

On télécharge le module qui va permettre de mettre à jour ceux de l'instance en production:

su - odoo
mv -i odoo odoo14
git clone --depth=1 -b 15.0 https://github.com/odoo/odoo.git
cp -i odoo14/debian/odoo.conf odoo/debian/odoo.conf
git clone --depth=1 -b 15.0 https://github.com/OCA/OpenUpgrade.git 
source .venv/bin/activate
pip install git+https://github.com/OCA/openupgradelib.git@master
pip install importlib
pip install -r odoo/requirements.txt

Vérifier qu'il y ait bien les dossiers des addons de selectionnés :

addons_path = /home/odoo/odoo/odoo/addons,/home/odoo/odoo/addons,/home/odoo/OpenUpgrade

Il nous reste plus qu'a mettre à jour la base de donnée :

./odoo-bin --config /home/odoo/odoo/debian/odoo.conf --logfile /home/odoo/odoo/debian/odoo.log -d MA_BASE -u all --stop-after-init --load=base,web,openupgrade_framework --upgrade-path=/home/odoo/OpenUpgrade/openupgrade_scripts/scripts/

S'il arrive à arriver jusqu'a la fin, relancer l'upgrade des modules sans OpenUpgrade pour mettre à jour les vues et en modifiant le fichier de conf :

addons_path = /home/odoo/odoo/odoo/addons,/home/odoo/odoo/addons
./odoo-bin --config /home/odoo/odoo/debian/odoo.conf --logfile /home/odoo/odoo/debian/odoo.log -d MA_BASE -u all --stop-after-init

Conseils:

  • Ne pas toucher à –data-dir dans le fichier de conf car on utile l'instance odoo prévu pour tourner définitivement avec
  • Lancer un nettoyage des tables à la fin de l'upgrade

Erreurs rencontrés

  • Si un enregistrement est déjà présent, le supprimer dans la base :

“ERROR odoo12 odoo.sql_db: bad query: CREATE UNIQUE INDEX IF NOT EXISTS mail_channel_partner_partner_unique ON mail_channel_partner (channel_id, partner_id) WHERE partner_id IS NOT NULL ERROR: ERREUR: n'a pas pu créer l'index unique « mail_channel_partner_partner_unique » DETAIL: La clé (channel_id, partner_id)=(1, 3) est dupliquée.”

odoo12=# select * from mail_channel_partner where channel_id = 1 and partner_id=3;
 id | partner_id | channel_id | seen_message_id | fold_state | is_minimized | is_pinned | create_uid |        create_date         | write_uid |         write_date         | custom_channel_name | fetched_message_id                                        
----+------------+------------+-----------------+------------+--------------+-----------+------------+----------------------------+-----------+----------------------------+---------------------+--------------------                                       
  6 |          3 |          1 |               1 | open       |              | t         |          1 | 2022-08-15 13:45:40.576803 |         1 | 2022-08-15 13:45:40.576803 |                     |                  1                                        
  2 |          3 |          1 |                 |            |              | t         |            |                            |         2 | 2022-08-15 14:11:40.75062  |                     |                                                           
(2 lignes)

odoo12=# delete from mail_channel_partner where channel_id = 1 and partner_id=3;
DELETE 2