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

Важливо

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

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

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