Визначення даних модуля¶
Важливо
Цей посібник є розширенням посібника Початок. Переконайтеся, що ви виконали його, і використовуйте модуль estate
, який ви створили, як основу для вправ у цьому посібнику.
Типи даних¶
Основні дані¶
Основні дані зазвичай є частиною технічних або бізнес-вимог до модуля. Іншими словами, такі дані часто необхідні для належної роботи модуля. Ці дані завжди будуть встановлені під час встановлення модуля.
Ми вже зустрічалися з технічними даними раніше, оскільки ми визначили представлення і дії. Це один із видів основних даних.
Окрім технічних даних, можна визначити бізнес-дані: країни, валюти, одиниці виміру, а також повну локалізацію країни (юридичні звіти, податкові визначення, план рахунків) та багато іншого…
Демонстраційні дані¶
Окрім основних даних, які є вимогами для правильної роботи модулів, ми також хотіли б мати дані для демонстраційних налаштувань:
Допоможіть торговим представникам швидко зробити свої демонстрації.
Майте набір робочих даних, щоб розробники могли протестувати нові функції і побачити, як вони виглядають з тим, що вони, можливо, не змогли б створити без них.
Перевірте, чи дані завантажуються правильно, без помилок.
Будьте готові до швидкого використання більшості функцій при створенні нової бази даних.
Демо-дані автоматично завантажуються при запуску сервера, якщо ви не вказали, що не хочете цього. Це можна зробити в менеджері баз даних або за допомогою командного рядка.
$ ./odoo-bin -h
Usage: odoo-bin [options]
Options:
--version show program's version number and exit
-h, --help show this help message and exit
Common options:
[...]
--without-demo=WITHOUT_DEMO
disable loading demo data for modules to be installed
(comma-separated, use "all" for all modules). Requires
-d and -i. Default is none
[...]
$ ./odoo-bin --addons-path=... -d db -i account --without-demo=all
Декларація даних¶
Маніфест¶
Посилання: документацію, пов’язану з цією темою, можна знайти в Маніфести модулів.
Дані оголошуються або у форматі CSV, або у форматі XML. Кожен файл, що містить дані, повинен бути доданий до маніфесту, щоб вони були завантажені.
Для додавання нових даних у маніфесті слід використовувати ключі data
для основних даних та demo
для демонстраційних даних. Обидва значення мають бути списком рядків, що представляють відносний шлях до файлів з даними.
Зазвичай, демонстраційні дані зберігаються у теці demo
, подання та дії - у теці views
, дані, пов’язані з безпекою - у теці security
, а інші дані - у теці data
.
Якщо ваше робоче дерево виглядає так:
estate
├── data
│ └── master_data.xml
├── demo
│ └── demo_data.xml
├── models
│ ├── *.py
│ └── __init__.py
├── security
│ └── ir.model.access.csv
├── views
│ └── estate_property_offer_views.xml
├── __init__.py
└── __manifest__.py
Ваш маніфест має виглядати так:
# -*- coding: utf-8 -*-
{
"name": "Real Estate",
"depends": [
...
],
"data": [
"security/ir.model.access.csv", # CSV and XML files are loaded at the same place
"views/estate_property_offer_views.xml", # Views are data too
"data/master_data.xml", # Split the data in multiple files depending on the model
],
"demo": [
"demo/demo_data.xml",
]
"application": True,
}
CSV¶
Довідка: документацію щодо цієї теми можна знайти у файлах даних CSV.
Найпростіший спосіб оголошення простих даних - це використання формату CSV. Однак він обмежений з точки зору можливостей: використовуйте його для довгих списків простих моделей, але надавайте перевагу XML в інших випадках.
id,field_a,field_b,related_id:id
id1,valueA1,valueB1,module.relatedid
id2,valueA2,valueB2,module.relatedid
Порада
Можливо, ваша IDE має розширення для підсвічування синтаксису файлів CSV
Exercise
Додайте декілька стандартних типів об’єктів нерухомості для модуля estate
: житлова, комерційна, промислова та земельна. Вони повинні бути встановлені завжди.
XML¶
Довідка: документацію, пов’язану з цією темою, можна знайти в Дані файлів.
Якщо дані, які потрібно створити, трохи складніші, може бути корисно, або навіть необхідно, зробити це у форматі XML.
<odoo>
<record id="id1" model="tutorial.example">
<field name="field_a">valueA1</field>
<field name="field_b">valueB1</field>
</record>
<record id="id2" model="tutorial.example">
<field name="field_a">valueA2</field>
<field name="field_b">valueB2</field>
</record>
</odoo>
Exercise
Створіть кілька демонстраційних даних для модуля estate
.
Поле |
Значення |
Значення |
---|---|---|
name |
Big Villa |
Trailer home |
стан |
Новий |
Скасовано |
description |
A nice and big villa |
Home in a trailer park |
postcode |
12345 |
54321 |
date_availability |
2020-02-02 |
1970-01-01 |
expected_price |
1,600,000 |
100,000 |
selling_price |
120,000 |
|
bedrooms |
6 |
1 |
living_area |
100 |
10 |
facades |
4 |
4 |
garage |
True |
False |
garden |
True |
|
garden_area |
100000 |
|
garden_orientation |
Південь |
Розширення даних¶
Під час основного навчання ми побачили в розділі Розділ 13: Наслідування, що ми можемо успадкувати (розширити) існуюче представлення. Це був окремий випадок розширення даних: будь-які дані можна розширити в модулі.
Коли ви додаєте нові поля до існуючої моделі в новому модулі, ви можете заповнити ці поля в записах, створених у модулях, від яких ви залежите. Це робиться шляхом надання xml_id
запису, який потрібно розширити. Це не замінить його, у цьому випадку ми встановимо field_c
на вказане значення для обох записів.
<odoo>
<record id="id1" model="tutorial.example">
<field name="field_c">valueC1</field>
</record>
<record id="id2" model="tutorial.example">
<field name="field_c">valueC2</field>
</record>
</odoo>
ref
¶
Пов’язані поля можна встановити за допомогою ключа ref
. Значення цього ключа є xml_id
запису, який потрібно пов’язати. Пам’ятайте, що xml_id
складається з назви модуля, де вперше оголошено дані, за якою йде крапка та id
запису (лише id
також працює, якщо ви знаходяться в модулі, який це оголошує).
<odoo>
<record id="id1" model="tutorial.example">
<field name="related_id" ref="module.relatedid"/>
</record>
</odoo>
Exercise
Створіть кілька демонстраційних пропозицій даних для створених вами властивостей.
Створюйте пропозиції за допомогою партнерів, визначених у base
Партнер |
Estate |
Ціна |
Термін дії |
---|---|---|---|
Azure Interior |
Big Villa |
10000 |
14 |
Azure Interior |
Big Villa |
1500000 |
14 |
Deco Addict |
Big Villa |
1500001 |
14 |
Exercise
Обидва об’єкти повинні бути житловими.
eval
¶
Значення, яке потрібно призначити полю, не завжди є простим рядком, і вам може знадобитися його обчислити. Його також можна використовувати для оптимізації вставки пов’язаних значень або тому, що обмеження змушують вас додавати пов’язані значення пакетно. Див. :Додати поля X2many.
<odoo>
<record id="id1" model="tutorial.example">
<field name="year" eval="datetime.now().year+1"/>
</record>
</odoo>
Exercise
Пропозиції, які ви додаєте, завжди мають бути пов’язані з датою встановлення модуля.
search
¶
Іноді вам потрібно викликати ORM, щоб виконати search
. Це неможливо з форматом CSV.
<odoo>
<record id="id1" model="account.move.line">
<field name="account_id" search="[
('user_type_id', '=', ref('account.data_account_type_direct_costs')),
('company_id', '=', obj().env.company.id)]
"/>
</record>
</odoo>
У цьому фрагменті коду він потрібен, оскільки основні дані фактично залежать від встановленої локалізації.
function
¶
Вам також може знадобитися виконати код на python під час завантаження даних.
<function model="tutorial.example" name="action_validate">
<value eval="[ref('demo_invoice_1')]"/>
</function>
Exercise
Перевірте одну з пропозицій демонстраційних даних, натиснувши кнопку «Прийняти пропозицію». Відмовляй іншим.
Додати поля X2many¶
Посилання: документацію на цю тему можна знайти у Поширені методи ORM.
Якщо вам потрібно додати пов’язані дані в поле One2many або Many2many, ви можете зробити це за допомогою звичайних методів ORM.
<odoo>
<record id="id1" model="tutorial.example">
<field name="related_ids" eval="[
(0, 0, {
'name': 'My name',
}),
(0, 0, {
'name': 'Your name',
}),
(4, ref('model.xml_id')),
]"/>
</record>
</odoo>
id,parent_id:id,name
"child1","module.parent","Name1"
"child2","module.parent","Name2"
"child3","module.parent","Name3"
Exercise
Створіть одну нову Власність, але цього разу з кількома пропозиціями, створеними безпосередньо в полі One2many, що посилаються на Пропозиції.
Доступ до даних¶
Попередження
Ви ніколи не повинні отримувати доступ до демонстраційних даних за межами декларації демонстраційних даних, навіть у тестах.
Є кілька способів отримати доступ до основних/демонстраційних даних.
У коді Python ви можете використовувати метод env.ref(self, xml_id, raise_if_not_found=True)
. Він повертає набір записів, пов’язаний із вказаним вами xml_id
.
У XML ви можете використовувати ключ ref
таким чином
<odoo>
<record id="id1" model="tutorial.example">
<field name="related_id" ref="module.relatedid"/>
</record>
</odoo>
Він викличе метод ref і збереже ідентифікатор запису, який повертається в поле related_id
запису типу tutorial.example
з ідентифікатором id1
.
У CSV заголовок стовпця повинен мати суфікс :id
або /id
.
id,parent_id:id,name
"child1","module.parent","Name1"
"child2","module.parent","Name2"
"child3","module.parent","Name3"
У SQL це складніше, див. розширений розділ.
Попередження
Дані завжди можуть бути видалені користувачем. Завжди кодуйте оборонно, враховуючи це.
Розширення¶
Що таке id XML?¶
Оскільки нам не потрібен стовпець xml_id у кожній таблиці SQL бази даних, нам потрібен механізм для його зберігання. Це робиться за допомогою моделі ir.model.data
.
Він містить назву запису (xml_id
) разом із модулем, у якому він визначений, моделлю, яка його визначає, та його id.
Без оновлення¶
Записи, створені з прапорцем noupdate
, не будуть оновлені під час оновлення модуля, який їх створив, але він буде створений, якщо він ще не існував.
Примітка
odoo-bin -i module
обійде цей параметр і завжди завантажуватиме дані. Але зазвичай цього не слід робити на робочій базі даних.
<odoo noupdate="1">
<record id="id1" model="model">
<field name="fieldA" eval="True"/>
</record>
</odoo>
Імпортувати як SQL¶
У деяких випадках має сенс виконувати імпорт безпосередньо в SQL. Однак це не рекомендується, оскільки воно обходить усі функції ORM, обчислювані поля (включаючи метадані) і обмеження Python.
Примітка
Зазвичай використання необробленого SQL також обходить списки керування доступом і збільшує ризик ін’єкцій.
Довідка: Безпека в Odoo
Це може значно пришвидшити час імпорту за допомогою величезних файлів.
Для більш складного імпорту, наприклад для перекладів.
Може знадобитися ініціалізація бази даних.