Assets

Керування активами в Odoo не таке просте, як у деяких інших додатках. Одна з причин полягає в тому, що ми маємо різноманітні ситуації, коли потрібні деякі, але не всі активи. Наприклад, потреби веб-клієнта, додатку точки продажу, веб-сайту або навіть мобільного додатку відрізняються. Крім того, деякі активи можуть бути великими, але рідко потрібні: у такому випадку ми можемо захотіти, щоб вони завантажувалися ліниво (на вимогу).

Типи активів

Існує три різні типи ресурсів: код (файли js), стиль (файли css або scss) та шаблони (файли xml).

Код

Odoo підтримує три різні типи файлів javascript. Усі ці файли потім обробляються (нативні JS-модулі перетворюються на модулі odoo), потім мініфікуються (якщо не в debug=assets режим) та об’єднуються. Результат потім зберігається як вкладений файл. Ці вкладені файли зазвичай завантажуються через тег <script> у частині <head> сторінки (як статичний файл).

Стиль

Стилізацію можна виконати за допомогою css або scss. Як і файли javascript, ці файли обробляються (файли scss конвертуються в css), потім мініфікуються (знову ж таки, якщо не в debug=assets режим) та об’єднуються. Результат потім зберігається як вкладений файл. Потім вони зазвичай завантажуються через тег <link> в частині <head> сторінки (як статичний файл).

Шаблон

Шаблони (статичні xml файли) обробляються по-іншому: вони просто зчитуються з файлової системи, коли вони потрібні, та об’єднуються.

Щоразу, коли браузер завантажує odoo, він викликає контролер /web/webclient/qweb/ для отримання шаблони.

Корисно знати, що в більшості випадків браузер виконує запит лише під час першого завантаження сторінки. Це пояснюється тим, що кожен із цих ресурсів пов’язаний із контрольною сумою, яка вставляється у вихідний код сторінки. Потім контрольна сума додається до URL-адреси, що означає, що можна безпечно встановити для заголовків кешу довгий період.

Пакети

Ресурси Odoo групуються за пакетами. Кожен пакет (список шляхів до файлів певних типів: xml, js, css або scss) перелічено в маніфесті модуля. Файли можна оголосити за допомогою синтаксису glob, що означає, що ви можете оголосити кілька файлів ресурсів, використовуючи один рядок.

Пакети визначені у файлі __manifest__.py кожного модуля з окремим ключем assets, який містить словник. Словник зіставляє назви пакетів (ключі) зі списком файлів, які вони містять (значення). Це виглядає так:

'assets': {
    'web.assets_backend': [
        'web/static/src/xml/**/*',
    ],
    'web.assets_common': [
        'web/static/lib/bootstrap/**/*',
        'web/static/src/js/boot.js',
        'web/static/src/js/webclient.js',
        'web/static/src/xml/webclient.xml',
    ],
    'web.qunit_suite_tests': [
        'web/static/src/js/webclient_tests.js',
    ],
},

Ось список деяких важливих пакетів, які потрібно знати більшості розробників odoo:

  • web.assets_common: цей пакет містить більшість ресурсів, спільних для веб-клієнта, веб-сайту, а також точки продажу. Він має містити нижчі рівні структурних блоків для фреймворку odoo. Зверніть увагу, що він містить файл boot.js, який визначає систему модулів odoo.

  • web.assets_backend: цей пакет містить код, специфічний для веб-клієнта (зокрема, веб-клієнт/менеджер дій/представлення/статичні XML-шаблони)

  • web.assets_frontend: цей пакет охоплює все, що стосується публічного веб-сайту: електронна комерція, портал, форум, блог тощо.

  • web.qunit_suite_tests: весь код тестування qunit на JavaScript (тести, помічники, макети)

  • web.qunit_mobile_suite_tests: код тестування qunit, специфічний для мобільних пристроїв

Операції

Зазвичай, робота з ресурсами проста: вам просто потрібно додати кілька нових файлів до часто використовуваного пакету, такого як assets_common або assets_backend. Але є й інші операції, доступні для деяких більш специфічних випадків використання.

Зверніть увагу, що всі директиви, що стосуються певного файлу ресурсів (тобто before, after, replace та remove), потребують попереднього оголошення цього файлу, або в маніфестах вище в ієрархії, або в записах ir.asset з нижчою послідовністю.

append

Ця операція додає один або декілька файлів. Оскільки це найпоширеніша операція, її можна виконати, просто використовуючи ім’я файлу:

'web.assets_common': [
    'my_addon/static/src/js/**/*',
],

За замовчуванням, додавання простого рядка до пакета додасть файли, що відповідають шаблону glob, у кінець пакета. Очевидно, що шаблон також може бути безпосередньо одним шляхом до файлу.

prepend

Додайте один або кілька файлів на початок пакету.

Корисно, коли вам потрібно розмістити певний файл перед іншими в пакеті (наприклад, з CSS-файлами). Операція prepend викликається з таким синтаксисом: ('prepend', <path>).

'web.assets_common': [
    ('prepend', 'my_addon/static/src/css/bootstrap_overridden.scss'),
],

before

Додайте один або кілька файлів перед певним файлом.

Додавання файлу на початку пакета може бути недостатньо точним. Директива before може бути використана для додавання заданого(их) файлу(ів) безпосередньо перед цільовим файлом. Вона оголошується шляхом заміни звичайного шляху на 3-елементний кортеж ('before', <target>, <path>).

'web.assets_common': [
    ('before', 'web/static/src/css/bootstrap_overridden.scss', 'my_addon/static/src/css/bootstrap_overridden.scss'),
],

after

Додайте один або кілька файлів після певного файлу.

Те саме, що й before, з відповідним(и) файлом(ами), доданим(и) одразу після цільового файлу. Оголошується шляхом заміни звичайного шляху на 3-елементний кортеж ('after', <target>, <path>).

'web.assets_common': [
    ('after', 'web/static/src/css/list_view.scss', 'my_addon/static/src/css/list_view.scss'),
],

include

Використовуйте вкладені пакети.

Директива include - це спосіб використання пакета в інших пакетах для мінімізації розміру вашого маніфесту. В Odoo ми використовуємо підпакети (з префіксом підкреслення за домовленістю) для пакетного створення файлів, що використовуються в кількох інших пакетах. Потім ви можете вказати підпакет як пару ('include', <bundle>) ось так:

'web.assets_common': [
    ('include', 'web._primary_variables'),
],

remove

Видалити один або кілька файлів.

У деяких випадках вам може знадобитися видалити один або кілька файлів з пакета. Це можна зробити за допомогою директиви remove, вказавши пару ('remove', <target>):

'web.assets_common': [
    ('remove', 'web/static/src/js/boot.js'),
],

replace

Замініть файл ресурсу одним або кількома файлами.

Припустимо, що ресурс потрібно не лише видалити, але й вставити нову версію цього ресурсу в ту саму позицію. Це можна зробити за допомогою директиви replace, використовуючи 3-елементний кортеж ('replace', <target>, <path>):

'web.assets_common': [
    ('replace', 'web/static/src/js/boot.js', 'my_addon/static/src/js/boot.js'),
],

Порядок завантаження

Порядок завантаження ресурсів іноді є критично важливим і має бути детермінованим, здебільшого для пріоритетів таблиць стилів та скриптів налаштування. Ресурси в Odoo обробляються наступним чином:

  1. Коли викликається пакет ресурсів (наприклад, t-call-assets="web.assets_common"), генерується порожній список ресурсів.

  2. Усі записи типу ir.asset, що відповідають пакету, вибираються та сортуються за порядковим номером. Потім усі записи з послідовністю строго менше 16 обробляються та застосовуються до поточного списку ресурсів.

  3. Усі модулі, що оголошують ресурси для зазначеного пакета у своєму маніфесті, застосовують свої операції з ресурсами до цього списку. Це робиться відповідно до порядку залежностей модулів (наприклад, ресурси web обробляються перед ресурсами website). Якщо директива намагається додати файл, який вже присутній у списку, для цього файлу нічого не робиться. Іншими словами, у списку зберігається лише перший екземпляр файлу.

  4. Решта записів ir.asset (ті, у яких послідовність більше або дорівнює 16) також обробляються та застосовуються.

Ресурси, оголошені в маніфесті, можуть потребувати завантаження в певному порядку, наприклад, jquery.js має бути завантажений раніше за всі інші скрипти jquery під час завантаження папки lib. Одним із рішень було б створити запис ir.asset з нижчою послідовністю або директивою „prepend“, але є й інший, простіший спосіб зробити це.

Оскільки унікальність кожного шляху до файлу у списку ресурсів гарантована, ви можете згадати будь-який конкретний файл перед глобальним об’єктом, який його містить. Таким чином, цей файл з’явиться у списку перед усіма іншими, що входять до glob.

'web.assets_common': [
    'my_addon/static/lib/jquery/jquery.js',
    'my_addon/static/lib/jquery/**/*',
],

Примітка

Модуль b, який видаляє/замінює активи, оголошені в модулі a, повинен залежати від нього. Спроба роботи з активами, які ще не були оголошені, призведе до помилки.

Відкладене завантаження

Іноді корисно динамічно завантажувати файли та/або пакети ресурсів, наприклад, щоб завантажувати бібліотеку лише тоді, коли вона потрібна. Для цього фреймворк Odoo надає кілька допоміжних функцій, розташованих у @web/core/assets.

await loadAssets({
    jsLibs: ["/web/static/lib/stacktracejs/stacktrace.js"],
});
loadAssets(assets)
Аргументи
  • assets (Object()) – опис різних ресурсів, які слід завантажити

Повертає

Promise<void>

Завантажте ресурси, описані параметром assets. Це об’єкт, який може містити такі ключі:

Key

Тип

Опис

jsLibs

string[]

список URL-адрес файлів JavaScript

cssLibs

string[]

список URL-адрес файлів JavaScript

useAssets(assets)
Аргументи
  • assets (Object()) – опис різних ресурсів, які слід завантажити

Цей hook корисний, коли компонентам потрібно завантажити деякі ресурси в їхній метод onWillStart. Він внутрішньо викликає loadAssets.

Модель активу (ir.asset)

У більшості випадків активів, оголошених у маніфесті, буде цілком достатньо. Однак для більшої гнучкості фреймворк також підтримує динамічні активи, оголошені в базі даних.

Це робиться шляхом створення записів ir.asset. Вони будуть оброблятися так, ніби їх знайдено в маніфесті модуля, і вони надають таку ж виразну силу, як і їхні аналоги в маніфесті.

class odoo.addons.base.models.ir_asset.IrAsset(env, ids, prefetch_ids)[source]

Ця модель сприяє двом речам:

1. It provides a function returning a list of all file paths declared in a given list of addons (see _get_addon_paths);

2. It allows to create „ir.asset“ records to add additional directives to certain bundles.

name

Назва запису активу (для цілей ідентифікації).

bundle

Пакет, у якому буде застосовано актив.

directive (default= append)

Це поле визначає, як буде інтерпретовано pathtarget, якщо потрібно). Ось список доступних директив разом з їхніми обов’язковими аргументами:

  • append: path

  • prepend: path

  • before: target, path

  • after: target, path

  • include: path (інтерпретується як назва пакета)

  • remove: path (інтерпретується як цільовий ресурс для видалення)

  • замінити: target, path

path

Рядок, що визначає одне з наступного:

  • relative path до файлу ресурсів у файловій системі доповнень;

  • glob pattern для набору файлів ресурсів у файловій системі доповнень;

  • URL до вкладеного файлу або файлу зовнішнього ресурсу;

  • bundle name, при використанні директиви include.

target

Цільовий файл для визначення позиції в пакеті. Можна використовувати лише з директивами replace, before та after.

active (default= True)

Чи є запис активним

sequence (default= 16)

Порядок завантаження записів ресурсів (за зростанням). Послідовність менша за 16 означає, що ресурс буде оброблено раніше за заявлені в маніфесті.

Перегляньте також

Зверніть увагу, що варіант використання ir.asset в основному призначений для додатків, пов’язаних з веб-сайтами, оскільки він дозволяє використовувати умовні ресурси (наприклад, коли ввімкнено опцію стилю).

У таких випадках синтаксису <asset id="..."> слід надавати перевагу над синтаксисом <record id="..." model="ir.asset"> під час визначення запису в XML.

Див. asset, особливо щодо значення active.