Визначення даних модуля¶
Важливо
This tutorial is an extension of the Server framework 101 tutorial. Make sure you have
completed it and use the estate
module you have built as a base for the exercises in this
tutorial.
Типи даних¶
Основні дані¶
Основні дані зазвичай є частиною технічних або бізнес-вимог до модуля. Іншими словами, такі дані часто необхідні для належної роботи модуля. Ці дані завжди будуть встановлені під час встановлення модуля.
We already met technical data previously since we have defined views and actions. Those are one kind of master data.
On top of technical data, business data can be defined, e.g. countries, currencies, units of measure, as well as complete country localization (legal reports, tax definitions, chart of account), and much more…
Демонстраційні дані¶
In additional to master data, which are requirements for a module to work properly, we also like having data for demonstration purposes:
Help the sales representatives make their demos quickly.
Have a set of working data for developers to test new features and see how these new features look with data they might not have added themselves.
Перевірте, чи дані завантажуються правильно, без помилок.
Setup most of the features to be used quickly when creating a new database.
Demo data is automatically loaded when you start the server if you don’t explicitly say you don’t want it. This can be done in the database manager or with the command line.
$ ./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
Декларація даних¶
Маніфест¶
Посилання: документацію, пов’язану з цією темою, можна знайти в Маніфести модулів.
Data is declared either in CSV or in XML. Each file containing data must be added in the manifest for them to be loaded.
The keys to use in the manifest to add new data are data
for the master data and demo
for
the demo data. Both values should be a list of strings representing the relative paths to the files
declaring the data.
Usually, demo data is in a demo
folder, views and actions are in a views
folder, security related data is in a security
folder, and other data is in a
data
folder.
Якщо ваше робоче дерево виглядає так:
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.
The easiest way to declare simple data is by using the CSV format. This is however limited in terms of features: use it for long lists of simple models, but prefer XML otherwise.
id,field_a,field_b,related_id:id
id1,valueA1,valueB1,module.relatedid
id2,valueA2,valueB2,module.relatedid
Порада
Можливо, ваша IDE має розширення для підсвічування синтаксису файлів CSV
Exercise
Додайте декілька стандартних типів об’єктів нерухомості для модуля estate
: житлова, комерційна, промислова та земельна. Вони повинні бути встановлені завжди.
XML¶
Довідка: документацію, пов’язану з цією темою, можна знайти в Дані файлів.
When the data to create is more complex it can be useful, or even necessary, to do it in 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 |
Південь |
Розширення даних¶
During the Core Training, we saw in the Chapter 12: Inheritance chapter we could inherit (extend) an existing view. This was a special case of data extension: any data can be extended in a module.
Коли ви додаєте нові поля до існуючої моделі в новому модулі, ви можете заповнити ці поля в записах, створених у модулях, від яких ви залежите. Це робиться шляхом надання 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
Ensure both of your demo properties are created with their Property Type set to Residential.
eval
¶
The value to assign to a field is not always a simple string and you might need to compute it. It can also be used to optimize the insertion of related values, or because a constraint forces you to add the related values in batch. See :Add X2many fields.
<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>
In this code snippet, it is needed because the master data depends on the localization installed.
function
¶
You might also need to execute python code when loading data.
<function model="tutorial.example" name="action_validate">
<value eval="[ref('demo_invoice_1')]"/>
</function>
Exercise
Перевірте одну з пропозицій демонстраційних даних, натиснувши кнопку «Прийняти пропозицію». Відмовляй іншим.
Додати поля X2many¶
Reference: the documentation related to this topic can be found in
Command
.
If you need to add related data in a One2many or a Many2many field, you can do so by using the
Command
methods.
<odoo>
<record id="id1" model="tutorial.example">
<field name="related_ids" eval="[
Command.create({
'name': 'My name',
}),
Command.create({
'name': 'Your name',
}),
Command.link(ref('model.xml_id')),
]"/>
</record>
</odoo>
Exercise
Create one new Property, but this time with some offers created directly inside the One2many field linked to the Offers.
Доступ до даних¶
Попередження
Ви ніколи не повинні отримувати доступ до демонстраційних даних за межами декларації демонстраційних даних, навіть у тестах.
Є кілька способів отримати доступ до основних/демонстраційних даних.
У коді 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"
In SQL, it is more complicated, see the advanced section.
Попередження
Дані завжди можуть бути видалені користувачем. Завжди кодуйте оборонно, враховуючи це.
Розширення¶
Що таке 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
Це може значно пришвидшити час імпорту за допомогою величезних файлів.
Для більш складного імпорту, наприклад для перекладів.
Може знадобитися ініціалізація бази даних.