Визначення даних модуля

Важливо

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

Пропозиції, які ви додаєте, завжди мають бути пов’язані з датою встановлення модуля.

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