meta données pour cette page
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 :
- DELETE FROM ir_model_data WHERE model = 'your.model';
- DELETE FROM ir_attachment WHERE url LIKE '/web/content/%';
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 :
- l'affichage des liens de menu du site
- 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
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