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

Важливо

Цей посібник є продовженням посібника Серверний фреймворк 101. Переконайтеся, що ви його виконали, та використовуйте модуль 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

Південь

Розширення даних

Під час основного навчання в розділі Розділ 12: Спадкування ми побачили, що можна успадковувати (розширювати) існуюче представлення. Це був окремий випадок розширення даних: будь-які дані можна розширити в модулі.

Коли ви додаєте нові поля до існуючої моделі в новому модулі, ви можете заповнити ці поля в записах, створених у модулях, від яких ви залежите. Це робиться шляхом надання 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

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

function

Вам також може знадобитися виконати код Python під час завантаження даних.

<function model="tutorial.example" name="action_validate">
    <value eval="[ref('demo_invoice_1')]"/>
</function>

Exercise

Перевірте одну з пропозицій демонстраційних даних, натиснувши кнопку «Прийняти пропозицію». Відмовляй іншим.

Додати поля X2many

Посилання: документацію з цієї теми можна знайти у Command.

Якщо вам потрібно додати пов’язані дані в поле One2many або Many2many, ви можете зробити це за допомогою методів Command.

<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

Створіть одну нову нерухомість, але цього разу з деякими пропозиціями, створеними безпосередньо в полі 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