Исправляем js/css ошибки при переносе базы Odoo

Уверен, что у каждого были случаи некоректного переноса базы данных Odoo из одного сервера на другой. Чаще всего, проблему вызывают js/css файлы, которые отдают 404 при загрузке.

Проблема: Odoo работает только с debug=assets, и то не всегда коректно.

Например: не создаются новые пользователи или редактируются существующие. В консоли видим подобную ошибку:

При создании нового пользователя получаем ошибку: web/content/329-c2af7d4/web_editor.summernote.css net::ERR_ABORTED 404 (NOT FOUND)

Проблема с web_editor.summernote.css/web_editor.summernote.js локальна, и касается только отдельного действия — создания или редактирования пользователя. Процесс востановления .css, .js файлов одинаковый: нужно обновить все или отдельный бандл, файлы которого отдают ошибку.

Пробуем решиь проблему, удалив эти файлы. По логике, Odoo должен их перегенировать при обновлении бандла. Действия:

  • переходим в Settings -> Technical -> Attachments,
  • удаляем web_editor.summernote.js и web_editor.summernote.css.
  • обновляем бандл web_editor.

Без удаления файлов, они не обновляются при обновлении бандла. Проверено на Odoo 13.0-20191106 (Community Edition).

Как удалить все js/css файлы?

Это можно сделать несколькими способами:

  1. Удалить запросом в базу данных. После подключения к базе данных, нужно удалить записи ir.attachment, которые ссылаются на отсутствующие ресурсы. Это всегда файлы JavaScript или CSS. Можно использовать следующий запрос:
DELETE FROM ir_attachment WHERE datas_fname SIMILAR TO '%.(js|css)';

  1. Удалить через интерфейс. Для этого переходим в Settings -> Technical -> Attachments, групируем по Mime Type. Переходим в отображение «Список» и массово уаляем файлы.

При удалении web_assets интерфейс админки может быть недоступен.

В таком случае рекомендуем обновить плагины через консоль.

Чтобы обновить модуль через консоль, нужно выполнить следующую команду:

./odoo.py -d database_to_update -u all

Востановление js/css через интерфейс

В Odoo 12 была добавлена функциональность «Regenerate Asset Bundles». Найти ее можно в режиме разработчика, в Developer Tools. При нажатии происходит следующее:

regenerateAssets: function () { var self = this; var domain = utils.assetsDomain(); this._rpc({ model: 'ir.attachment', method: 'search', args: [domain], }).then(function (ids) { self._rpc({ model: 'ir.attachment', method: 'unlink', args: [ids], }).then(window.location.reload()); }); },