Переглянути архітектури

Загальна архітектура

Архітектура представлення визначається XML-даними, що інтерпретуються фреймворком JavaScript.

Для більшості представлень існує файл *.rng, який визначає атрибути та можливі архітектури. Деякі представлення не керуються таким файлом, або тому, що вони приймають HTML-контент, або з міркувань продуктивності.

Примітка

Поточний контекст і права доступу користувачів можуть впливати на можливості перегляду.

Перегляньте також

Переглянути записи

Вираз Python

Під час оцінювання атрибутів вузла, наприклад, модифікатора readonly, можна надати вираз Python, який буде виконано в середовищі, що має доступ до таких змінних:

  • Назви всіх полів, присутніх у поточному поданні, що містять значення поточного запису, окрім column_invisible у list view; реляційні поля задаються у вигляді списку ідентифікаторів;

  • ID поточного запису;

  • parent: запис, що посилається на контейнер; лише всередині підвидів relational fields;

  • context (dict): контекст поточного представлення;

  • uid (int): id поточного користувача;

  • today (str): поточна локальна дата у форматі YYYY-MM-DD;

  • now (str): поточна локальна дата та час у форматі YYYY-MM-DD hh:mm:ss.

Example

<field name="field_a" readonly="True"/>
<field name="field_b" invisible="context.get('show_me') and field_a == 4"/>

Example

<field name="field_a"/>
<field name="x2m">
    <!-- sub-view -->
    <form>
        <field name="field_b" invisible="parent.field_a"/>
    </form>
</field>

Форма

Представлення форм використовуються для відображення даних з одного запису. Вони складаються зі звичайного HTML з додатковими семантичними та структурними компонентами.

Кореневим елементом представлення форм є form.

<form>
    ...
</form>

Кореневі атрибути

До кореневого елемента form можна додати додаткові атрибути для налаштування представлення.

string

Заголовок представлення. Він відображається лише тоді, коли ви відкриваєте дію, яка не має назви та метою якої є new (відкриття діалогового вікна).

вимога

Необов’язково

тип

str

Default

''

create

Вимкнути/увімкнути створення записів у представленні.

вимога

Необов’язково

тип

bool

Default

True

edit

Вимкнути/увімкнути редагування записів у представленні.

вимога

Необов’язково

тип

bool

Default

True

duplicate

Вимкніть/увімкніть дублювання запису в представленні за допомогою спадного меню Дія.

вимога

Необов’язково

тип

bool

Default

True

delete

Вимкнути/увімкнути видалення записів у представленні через випадаюче меню Дія.

вимога

Необов’язково

тип

bool

Default

True

js_class

Назва компонента JavaScript, екземпляр якого створюватиме веб-клієнт, замість представлення форми.

вимога

Необов’язково

тип

str

Default

''

disable_autofocus

Вимкнути автоматичне фокусування на першому полі зображення.

вимога

Необов’язково

тип

bool

Default

False

banner_route

Маршрут для отримання HTML-коду та додавання його на початок представлення.

Якщо цей атрибут встановлено, URL-адреса маршруту controller отримується, а повернутий вміст відображається над вікном перегляду. Відповідь JSON від контролера повинна містити ключ html.

Якщо HTML містить тег <link> для таблиці стилів, його буде видалено з початкового розташування та додано до розділу <head>.

Використовуйте теги <a type="action"> для взаємодії з серверною частиною, наприклад, з кнопками дій.

Example

<tree banner_route="/module_name/hello" />
class MyController(odoo.http.Controller):
    @http.route('/module_name/hello', auth='user', type='json')
    def hello(self):
        return {
            'html': """
                <div>
                    <link href="/module_name/static/src/css/banner.css"
                        rel="stylesheet">
                    <h1>hello, world</h1>
                </div> """
        }
вимога

Необов’язково

тип

path

Default

''

Семантичні компоненти

Семантичні компоненти пов’язані з системою Odoo та дозволяють взаємодіяти з нею.

Види форм приймають наступні семантичні компоненти-дочірні елементи: поле, мытка, кнопка, Віджет Chatter та Віджет попереднього перегляду вкладень.

Заповнювачі позначені великими літерами.

field: відображати значення полів

Елемент field відображає (і, можливо, дозволяє редагувати) одне поле поточного запису.

Підтримується багаторазове використання одного й того самого поля у вигляді форми, і поля можуть отримувати різні значення для атрибутів invisible та readonly. Ці поля можуть мати однакові значення, але можуть відображатися по-різному. Однак така поведінка не гарантується, коли існує кілька полів з різними значеннями атрибута required.

<form>
    <field name="FIELD_NAME"/>
</form>

Елемент field може мати такі атрибути:

name

Назва поля для відображення.

вимога

Обов’язкове

тип

str

id

Ідентифікатор вузла. Корисно, коли у представленні є кілька екземплярів одного й того ж поля (див. label: відображення підписів полів).

вимога

Необов’язково

тип

str

Default

Назва поля

string

Мітка поля.

вимога

Необов’язково

тип

str

Default

Атрибут string поля моделі

help

Підказка, що відображається під час наведення курсора на поле або його підпис.

вимога

Необов’язково

тип

str

Default

''

widget

Метод рендерингу та контекст, що використовуються замість стандартного, призначеного типу поля (наприклад, Char, Many2one). Див. Поля.

Example

<form>
    <field name="tag_ids" widget="many2many_tags"/>
</form>
<tree>
    <field name="sequence" widget="handle"/>
    <field name="level_progress" widget="progressbar"/>
</tree>
вимога

Необов’язково

тип

str

Default

''

options

Параметри конфігурації для віджета поля (включно з віджетами за замовчуванням) як вираз Python, який обчислюється як словник.

Для полів зв’язку доступні такі опції: no_create, no_quick_create, no_open та no_create_edit.

Example

<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'FIELD_NAME', 'no_quick_create': True}"/>
вимога

Необов’язково

тип

Вираз Python

Default

{}

readonly

Чи може поле бути змінене користувачем (False), чи воно доступне лише для читання (True), як вираз Python, який обчислюється як логічне значення.

Example

<field name="fname_a" readonly="True"/>
<field name="fname_b" readonly="name_a in [fname_b, parent.fname_d]"/>
вимога

Необов’язково

тип

Вираз Python

Default

False

required

Чи можна залишити поле порожнім (False), чи його потрібно встановити (True) як вираз Python, який повертає логічне значення.

Example

<field name="fname_a" required="True"/>
<field name="fname_b" required="fname_c != 3"/>
вимога

Необов’язково

тип

Вираз Python

Default

False

invisible

Чи є елемент видимим (False) чи прихованим (True), як вираз Python, який обчислюється як логічне значення.

Примітка

Атрибут invisible можна використовувати у двох випадках:

  • Зручність використання: щоб уникнути перевантаження представлення та полегшити читання користувачем, залежно від контенту.

  • Технічні: поле має бути присутнім (достатньо бути невидимим) у представленні, щоб його можна було використовувати у виразі Python.

Example

<field name="fname_a" invisible="True"/> <!-- necessary to evaluate invisible attribute of 'fname_b' field -->
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
вимога

Необов’язково

тип

Вираз Python

Default

False

groups

Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом !.

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
вимога

Необов’язково

тип

str

Default

''

domain

Фільтри, що застосовуються під час відображення існуючих записів для вибору, як вираз Python, який обчислюється як домен.

Example

<field name="fname" domain="[('fname_a', '=', parent.fname_b)]"/>
вимога

Необов’язково

тип

Вираз Python

Default

[]

сфера застосування

Реляційні поля

context

Контекст, який слід використовувати під час отримання можливих значень та створення або пошуку записів, як вираз Python, який обчислюється як словник.

Example

<field name="fname" context="{
    'TYPE_view_ref': 'ADDON.MODEL_view_TYPE',
    'group_by': 'FIELD_NAME',
    'default_FIELD_NAME': ANY,
    'search_default_FIELD_NAME': True,
    'OTHER_BUSINESS_KEY': ANY,
  }"/>
вимога

Необов’язково

тип

Вираз Python

Default

{}

сфера застосування

Реляційні поля

nolabel

Чи слід приховувати підпис поля.

вимога

Необов’язково

тип

bool

Default

False

сфера застосування

Поля, що є прямим дочірнім елементом елемента group

placeholder

Довідкове повідомлення, яке відображатиметься для порожніх полів. Воно може замінювати підписи полів у складних формах. Однак воно не повинно бути прикладом даних, оскільки користувачі можуть плутати текст-заповнювач із заповненими полями.

вимога

Необов’язково

тип

str

Default

''

mode

Список режимів відображення (типів представлення), розділених комами, які слід використовувати для пов’язаних записів поля. Дозволені режими: tree, form, kanban та graph.

вимога

Необов’язково

тип

str

Default

tree

сфера застосування

Поля One2many та Many2many

class

Клас HTML, який потрібно встановити для згенерованого елемента.

Стилізація використовує фреймворк Bootstrap та UI icons. Загальні класи Odoo включають:

  • oe_inline: запобігає звичайному розриву рядка після полів та обмежує їх проміжок;

  • oe_left, oe_right: floats елемент у відповідному напрямку;

  • oe_read_only, oe_edit_only: відображає елемент лише у відповідному режимі форми;

  • oe_avatar: для полів зображень відображає зображення як «аватар» (максимум 90x90 квадрат);

  • oe_stat_button: визначає певний спосіб візуалізації для динамічного відображення інформації з можливістю натискання для виконання дії.

Example

<field name="fname" class="oe_inline oe_left oe_avatar"/>

Example

<button type="object" name="ACTION" class="oe_stat_button" icon="FONT_AWESOME" help="HELP">
   <div class="o_field_widget o_stat_info">
      <span class="o_stat_value"><FIELD/></span>
      <span class="o_stat_text">TEXT</span>
   </div>
</button>
вимога

Необов’язково

тип

str

Default

''

filename

Назва пов’язаного поля, що містить назву файлу.

вимога

Необов’язково

тип

str

Default

''

сфера застосування

Поля Binary

password

Чи зберігає поле пароль, і, отже, його дані не повинні відображатися.

вимога

Необов’язково

тип

bool

Default

False

сфера застосування

Поля Char

kanban_view_ref

XMLID конкретного запису канбану переглянути запис, який слід використовувати під час вибору записів у мобільному середовищі.

вимога

Необов’язково

тип

str

Default

''

сфера застосування

Реляційні поля

default_focus

Чи є поле у фокусі під час відкриття перегляду. Це можна застосувати лише до одного поля перегляду.

вимога

Необов’язково

тип

bool

Default

False

Примітка

Реляційні поля вузли можуть містити конкретні підвиди.

Example

<field name="children_ids">
   <tree>
      <field name="name"/>
   </tree>
   <form>
      <field name="id"/>
      <field name="name"/>
   </form>
</field>

label: відображення підписів полів

Коли компонент поле не розміщено безпосередньо всередині група, або коли його атрибут nolabel встановлено, мітка поля не відображається автоматично поруч із його значенням. Компонент label – це ручна альтернатива відображенню мітки поля.

<form>
    <div class="col col-md-auto">
        <label for="FIELD_NAME" string="LABEL"/>
        <div>
            <field name="FIELD_NAME" class="oe_inline"/>
        </div>
    </div>
</form>

Елемент label може мати такі атрибути:

for

Посилання на поле, пов’язане з міткою. Це може бути або назва поля, або його ідентифікатор (атрибут id, встановлений для поле).

Коли у поданні є кілька екземплярів одного й того ж поля, і з цими вузлами поля пов’язано кілька компонентів label, ці мітки повинні мати унікальний атрибут for; у цьому випадку посилання на атрибут id відповідних вузлів поля.

вимога

Обов’язкове

тип

str

string

Мітка для відображення.

вимога

Необов’язково

тип

str

Default

Мітка поля, що походить з визначення поля в моделі

class

Клас HTML, який потрібно встановити для згенерованого елемента.

Стилізація використовує фреймворк Bootstrap та UI icons. Загальні класи Odoo включають:

  • oe_inline: запобігає звичайному розриву рядка після полів та обмежує їх проміжок;

  • oe_left, oe_right: floats елемент у відповідному напрямку;

  • oe_read_only, oe_edit_only: відображає елемент лише у відповідному режимі форми;

  • oe_avatar: для полів зображень відображає зображення як «аватар» (максимум 90x90 квадрат);

  • oe_stat_button: визначає певний спосіб візуалізації для динамічного відображення інформації з можливістю натискання для виконання дії.

Example

<field name="fname" class="oe_inline oe_left oe_avatar"/>

Example

<button type="object" name="ACTION" class="oe_stat_button" icon="FONT_AWESOME" help="HELP">
   <div class="o_field_widget o_stat_info">
      <span class="o_stat_value"><FIELD/></span>
      <span class="o_stat_text">TEXT</span>
   </div>
</button>
вимога

Необов’язково

тип

str

Default

''

invisible

Чи є елемент видимим (False) чи прихованим (True), як вираз Python, який обчислюється як логічне значення.

Примітка

Атрибут invisible можна використовувати у двох випадках:

  • Зручність використання: щоб уникнути перевантаження представлення та полегшити читання користувачем, залежно від контенту.

  • Технічні: поле має бути присутнім (достатньо бути невидимим) у представленні, щоб його можна було використовувати у виразі Python.

Example

<field name="fname_a" invisible="True"/> <!-- necessary to evaluate invisible attribute of 'fname_b' field -->
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
вимога

Необов’язково

тип

Вираз Python

Default

False

button: відображення кнопок дій

<form>
    <button type="object" name="ACTION" string="LABEL"/>
    <button type="object" name="ACTION" icon="FONT_AWESOME"/>
</form>

Елемент button може мати такі атрибути:

type

Тип кнопки, що вказує на її поведінку. Може мати два різних значення:

object

Викликати метод на моделі представлення. name кнопки - це метод, який викликається з поточним ідентифікатором запису та поточним context.

action

Завантажити та виконати запис дії ir.actions. Ім'я кнопки – це XMLID дії, яку потрібно завантажити. context розширюється моделлю представлення (як active_model) та поточним записом (як active_id).

Example

<button type="object" name="action_create_new" string="Create document"/>
<button type="action" name="addon.action_create_view" string="Create and Edit"/>
вимога

Обов’язковий, якщо атрибут special не встановлено

тип

str

name

Метод, який потрібно викликати, якщо type - object. XMLID дії, яку потрібно завантажити, якщо type - action, або у форматі необробленого коду, або у форматі %(XMLID)d.

вимога

Необов’язково

тип

str

Default

''

string

Текст кнопки, якщо немає icon, alt текст для іконки в іншому випадку.

Example

<button type="object" name="action_create_new" string="Create document"/>
вимога

Необов’язково

тип

str

Default

''

icon

Піктограма, яка використовується для відображення кнопки. Див. список посилань у іконки.

Example

<button type="object" name="remove" icon="fa-trash"/>
вимога

Необов’язково

тип

str

Default

''

help

Підказка, що відображається під час наведення курсора миші.

Example

<button type="object" name="remove" icon="fa-trash" help="Revoke"/>
вимога

Необов’язково

тип

str

Default

''

context

Контекст, який об’єднується з контекстом представлення під час виклику кнопки, як вираз Python, що обчислюється як словник.

Example

<button name="button_confirm" type="object" context="{'BUSINESS_KEY': ANY}" string="LABEL"/>
вимога

Необов’язково

тип

Вираз Python

Default

{}

groups

Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом !.

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
вимога

Необов’язково

тип

str

Default

''

invisible

Чи є елемент видимим (False) чи прихованим (True), як вираз Python, який обчислюється як логічне значення.

Примітка

Атрибут invisible можна використовувати у двох випадках:

  • Зручність використання: щоб уникнути перевантаження представлення та полегшити читання користувачем, залежно від контенту.

  • Технічні: поле має бути присутнім (достатньо бути невидимим) у представленні, щоб його можна було використовувати у виразі Python.

Example

<field name="fname_a" invisible="True"/> <!-- necessary to evaluate invisible attribute of 'fname_b' field -->
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
вимога

Необов’язково

тип

Вираз Python

Default

False

class

Клас HTML, який потрібно встановити для згенерованого елемента.

Стилізація використовує фреймворк Bootstrap та UI icons. Загальні класи Odoo включають:

  • oe_inline: запобігає звичайному розриву рядка після полів та обмежує їх проміжок;

  • oe_left, oe_right: floats елемент у відповідному напрямку;

  • oe_read_only, oe_edit_only: відображає елемент лише у відповідному режимі форми;

  • oe_avatar: для полів зображень відображає зображення як «аватар» (максимум 90x90 квадрат);

  • oe_stat_button: визначає певний спосіб візуалізації для динамічного відображення інформації з можливістю натискання для виконання дії.

Example

<field name="fname" class="oe_inline oe_left oe_avatar"/>

Example

<button type="object" name="ACTION" class="oe_stat_button" icon="FONT_AWESOME" help="HELP">
   <div class="o_field_widget o_stat_info">
      <span class="o_stat_value"><FIELD/></span>
      <span class="o_stat_text">TEXT</span>
   </div>
</button>
вимога

Необов’язково

тип

str

Default

''

special

Поведінка кнопки для представлень форм, відкритих у діалоговому вікні. Вона може мати два різних значення:

save

Збережіть запис і закрийте діалогове вікно.

cancel

Закрити діалогове вікно без збереження.

Example

<button special="cancel" icon="fa-trash"/>
вимога

Необов’язково

тип

str

Default

''

confirm

Повідомлення з підтвердженням, яке має відобразитися (і яке користувач має прийняти) перед виконанням дії кнопки.

Example

<button name="action_destroye_gate" string="Send the goa'uld" type="object" confirm="Do you confirm the action?"/>
вимога

Необов’язково

тип

str

Default

''

data-hotkey

Гаряча клавіша (keyboard_shortcut, подібна до accesskey), пов’язана з кнопкою. Вона вмикається, коли клавішу alt натискають разом із вибраним символом, або разом із клавішею shift та вибраним символом, коли до значення додається shift+.

Example

<button type="object" name="action_confirm" string="Confirm" data-hotkey="c"/>
<button type="object" name="action_tear" string="Tear the sheet" data-hotkey="shift+k"/>
вимога

Необов’язково

тип

str

Default

''

Віджет Chatter

Віджет chatter - це інструмент для комунікації та ведення журналу, який дозволяє надсилати електронні листи колегам і клієнтам безпосередньо із запису (завдання, замовлення, рахунку, події, нотатки…).

Він додається за допомогою елемента div з класом oe_chatter, коли модель успадковує міксін mail.thread.

Example

<form>
    <sheet>
        ...
    </sheet>
    <div class="oe_chatter">
        <field name="message_follower_ids"/>
        <field name="activity_ids"/>
        <field name="message_ids" options="OPTIONS"/>
    </div>
</form>

Віджет попереднього перегляду вкладень

Віджет попереднього перегляду вкладень додається за допомогою порожнього елемента div з класом o_attachment_preview.

Example

<form>
    <sheet>
        ...
    </sheet>
    <div class="o_attachment_preview"/>
<form>

Структурні компоненти

Структурні компоненти забезпечують структуру або «візуальні» функції з невеликою логікою. Вони використовуються як елементи або набори елементів у представленнях форм.

Представлення форм приймають такі дочірні структурні компоненти: група, аркуш, блокнот, блокнот, новий рядок, роздільник, хедер, футер, Контейнер кнопок, та Контейнер заголовка.

Заповнювачі позначені великими літерами.

group: визначення макета колонок

Елемент group використовується для визначення макетів колонок у формах. За замовчуванням групи визначають 2 колонки, а більшість прямих дочірніх елементів груп приймають одну колонку.

Елементи поле, що є прямими дочірніми елементами груп, за замовчуванням відображають label, а label та саме поле мають colspan, що дорівнює 1 кожен.

Дочірні розставляють горизонтально (вони намагаються заповнити наступний стовпець, перш ніж перейти до іншого рядка).

 <form>
     <group>
         ...
     </group>
</form>

Елемент group може мати такі атрибути:

string

Назва, що відображається для групи.

вимога

Необов’язково

тип

str

Default

''

col

Кількість колонок у group.

вимога

Необов’язково

тип

int

Default

2

colspan

Кількість колонок, зайнятих дочірнім елементом.

вимога

Необов’язково

тип

int

Default

1

invisible

Чи є елемент видимим (False) чи прихованим (True), як вираз Python, який обчислюється як логічне значення.

Примітка

Атрибут invisible можна використовувати у двох випадках:

  • Зручність використання: щоб уникнути перевантаження представлення та полегшити читання користувачем, залежно від контенту.

  • Технічні: поле має бути присутнім (достатньо бути невидимим) у представленні, щоб його можна було використовувати у виразі Python.

Example

<field name="fname_a" invisible="True"/> <!-- necessary to evaluate invisible attribute of 'fname_b' field -->
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
вимога

Необов’язково

тип

Вираз Python

Default

False

Можлива структура та представлення її рендерингу

../../../_images/form_group.svg
<group>
    <field name="a" string="custom"/>
    <field name="b"/>
</group>
<group string="title 1">
    <group string="title 2">
        <field name="c"/>
        <field name="d"/>
    </group>
    <group>
        <field name="e"/>
        <field name="f"/>
        <field name="g"/>
    </group>
</group>
<group col="12">
    <group colspan="8">
        <field name="h"/>
    </group>
    <group colspan="4">
        <field name="i"/>
    </group>
</group>

sheet: зробити макет адаптивним

Елемент sheet можна використовувати як прямий дочірній елемент кореневого елемента форма для вужчого та адаптивнішого макета форми (центрована сторінка, поля…). Зазвичай він містить елементи група.

<form>
    <sheet>
        ...
    </sheet>
</form>

notebook та page: додавання розділів із вкладками

Елемент notebook визначає розділ із вкладками. Кожна вкладка визначається через дочірній елемент page.

Елемент notebook не слід розміщувати всередині елементів group.

<form>
    <notebook>
        <page string="LABEL">
            ...
        </page>
    </notebook>
</form>

Елемент page може мати такі атрибути:

string

Заголовок вкладки.

вимога

Необов’язково

тип

str

Default

''

invisible

Чи є елемент видимим (False) чи прихованим (True), як вираз Python, який обчислюється як логічне значення.

Примітка

Атрибут invisible можна використовувати у двох випадках:

  • Зручність використання: щоб уникнути перевантаження представлення та полегшити читання користувачем, залежно від контенту.

  • Технічні: поле має бути присутнім (достатньо бути невидимим) у представленні, щоб його можна було використовувати у виразі Python.

Example

<field name="fname_a" invisible="True"/> <!-- necessary to evaluate invisible attribute of 'fname_b' field -->
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
вимога

Необов’язково

тип

Вираз Python

Default

False

Можлива структура та представлення її рендерингу

../../../_images/form_notebook.svg
<form>
    <notebook>
        <page string="Page1">
            ...
        </page>
        <page string="Page2">
            ...
        </page>
    </notebook>
</form>

newline: початок нових групових рядків

Елемент newline використовується в елементах група для дострокового завершення поточного рядка та негайного переходу до нового рядка, без попереднього заповнення решти стовпця.

<form>
    <group>
        ...
        <newline/>
        ...
    </group>
</form>

Можлива структура та представлення її рендерингу

../../../_images/form_newline.svg
<form>
    <group string="Title 1">
        <group string="Title 1.1">...</group>
        <newline/>
        <group string="Title 1.2">...</group>
        <group string="Title 1.3">...</group>
    </group>
</form>

separator: додати горизонтальний інтервал

Елемент separator додає вертикальний інтервал між елементами всередині групи.

<form>
    ...
    <separator/>
    ...
</form>

Елемент <separator> може мати такі атрибути:

string

Заголовок як заголовок розділу.

вимога

Необов’язково

тип

str

Default

''

Можлива структура та представлення її рендерингу

../../../_images/form_separator.svg
<form>
    <group>
        <FIELD/>
        <separator string="Title 1"/>
        <FIELD/>
        <group>
            <FIELD/>
            <separator string="Title 2"/>
            <FIELD/>
        </group>
        <group>
            <FIELD/>
            <FIELD/>
        </group>
    </group>
</form>

Порада

Елемент separator можна використовувати для візуального розділення елементів в межах одного внутрішнього елемента group, зберігаючи при цьому їх горизонтальне вирівнювання.

header: відображення кнопок робочого процесу та статусу

Елемент header у поєднанні з елементом аркуш забезпечує розташування на всю ширину над самим аркушем, яке зазвичай використовується для відображення елементів робочого процесу кнопка та елемента поле, що відображається як віджет стану.

<form>
    <header>
        <BUTTONS/>
    </header>
    <sheet>
        ...
    </sheet>
</form>

Example

<header>
    <button string="Reset" type="object" name="set_draft" invisible="state != 'done'"/>
    <field name="state" widget="statusbar" statusbar_visible="draft,posted" options="{'clickable': 1}"/>
</header>

Контейнер кнопок

Контейнер елементів кнопка можна створити за допомогою елемента div з класом button_box.

<form>
    <div name="button_box">
        <BUTTONS/>
    </div>
<form>

Можлива структура та представлення її рендерингу

../../../_images/form_button_box.svg
<form>
    <div name="button_box">
        <button type="edit" name="edit" icon="fa-edit" string="Button1"/>
        <button type="object" name="my_action" icon="fa-dollar">
            <field name="total_inv" widget="statinfo" string="Invoices"/>
        </button>
    </div>
<form>

Контейнер заголовка

Контейнер елементів title поле можна створити за допомогою елемента div з класом oe_title.

<form>
    <sheet>
        <div class="oe_title">
            <h1><FIELD/></h1>
        </div>
    </sheet>
<form>

Налаштування

Представлення налаштувань – це налаштування представлення форма. Вони використовуються для відображення налаштувань у централізованому місці. Вони відрізняються від загальних представлень форм тим, що мають рядок пошуку та бічну панель.

Example

<app string="CRM" name="crm">
    <setting type="header" string="Foo">
        <field name="foo" title="Foo?."/>
        <button name="nameAction" type="object" string="Button"/>
    </setting>
    <block title="Title of group Bar">
        <setting help="this is bar" documentation="/applications/technical/web/settings/this_is_a_test.html">
            <field name="bar"/>
        </setting>
        <setting string="This is Big BAR" company_specific="1">
            <field name="bar"/>
        </setting>
    </block>
    <block title="Title of group Foo">
        <setting string="Personalize setting" help="this is full personalize setting">
            <div>This is a different setting</div>
        </setting>
    </block>
</app>

Компоненти

Представлення налаштувань приймають елементи поле, мітка та кнопка представлень форма, а також три додаткові дочірні елементи: додаток, блок та налаштування.

Заповнювачі позначені великими літерами.

app: оголосити додаток

Елемент app використовується для оголошення додатку у вікні налаштувань. Він створює запис із логотипом додатку на бічній панелі вікна. Він також виконує роль роздільника під час пошуку.

<form>
    <app string="NAME" name="TECHNICAL_NAME">
    ...
    </app>
</form>

Елемент app може мати такі атрибути:

string

Назва додатку.

вимога

Обов’язкове

тип

str

name

Технічна назва додатку (назва модуля).

вимога

Обов’язкове

тип

str

logo

relative path до логотипу.

вимога

Необов’язково

тип

path

Default

Шлях, обчислений за допомогою атрибута name: /name/static/description/icon.png

groups

Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом !.

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
вимога

Необов’язково

тип

str

Default

''

invisible

Чи є елемент видимим (False) чи прихованим (True), як вираз Python, який обчислюється як логічне значення.

Примітка

Атрибут invisible можна використовувати у двох випадках:

  • Зручність використання: щоб уникнути перевантаження представлення та полегшити читання користувачем, залежно від контенту.

  • Технічні: поле має бути присутнім (достатньо бути невидимим) у представленні, щоб його можна було використовувати у виразі Python.

Example

<field name="fname_a" invisible="True"/> <!-- necessary to evaluate invisible attribute of 'fname_b' field -->
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
вимога

Необов’язково

тип

Вираз Python

Default

False

block: оголошення групи налаштувань

Елемент block використовується для оголошення групи налаштувань. Ця група може мати заголовок та опис.

 <form>
     <app string="NAME" name="TECHNICAL_NAME">
         ...
         <block title="TITLE">
             ...
         </block>
         ...
     </app>
</form>

Елемент block може мати такі атрибути:

title

Назва блоку налаштувань. Можна шукати за його значенням.

вимога

Необов’язково

тип

str

Default

''

help

Опис блоку налаштувань. Можна шукати за його значенням.

вимога

Необов’язково

тип

str

Default

''

groups

Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом !.

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
вимога

Необов’язково

тип

str

Default

''

invisible

Чи є елемент видимим (False) чи прихованим (True), як вираз Python, який обчислюється як логічне значення.

Примітка

Атрибут invisible можна використовувати у двох випадках:

  • Зручність використання: щоб уникнути перевантаження представлення та полегшити читання користувачем, залежно від контенту.

  • Технічні: поле має бути присутнім (достатньо бути невидимим) у представленні, щоб його можна було використовувати у виразі Python.

Example

<field name="fname_a" invisible="True"/> <!-- necessary to evaluate invisible attribute of 'fname_b' field -->
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
вимога

Необов’язково

тип

Вираз Python

Default

False

setting: оголосити налаштування

Елемент setting використовується для оголошення самого налаштування.

Перший елемент поле в налаштуванні використовується як основне поле. Він розміщується на лівій панелі, якщо це логічне поле, і у верхній частині правої панелі в іншому випадку. Поле також використовується для створення мітки налаштування, якщо атрибут string не визначено.

Елемент setting також може містити додаткові елементи (наприклад, HTML). Усі ці елементи відображаються на правій панелі.

<form>
    <app string="NAME" name="TECHNICAL_NAME">
        <block title="TITLE">
            ...
            <setting string="SETTING_NAME">
                ...
                <field name="FIELD_NAME"/>
                ...
            </setting>
            ...
        </block>
    </app>
</form>

Елемент <setting> може мати такі атрибути:

type

За замовчуванням налаштування візуально розділене на дві панелі (ліву та праву) та використовується для редагування заданого поле. Визначаючи type="header", замість цього відображатиметься спеціальний тип налаштування. Це налаштування використовується для зміни області дії інших налаштувань. Наприклад, у застосунку Website це налаштування використовується для позначення веб-сайту, до якого застосовуються інші налаштування. Налаштування заголовка візуально представлене як банер у верхній частині екрана.

вимога

Необов’язково

тип

str

Default

''

string

Текст, що використовується як підпис налаштування.

вимога

Необов’язково

тип

str

Default

Мітка першого поля

title

Текст, що використовується як підказка.

вимога

Необов’язково

тип

str

Default

''

help

Опис налаштування. Цей текст відображається одразу під міткою налаштування (з класом text-muted).

вимога

Необов’язково

тип

str

Default

''

company_dependent

Чи стосується налаштування лише компанії. Якщо встановлено, поруч із міткою налаштування відображається значок.

Він приймає лише значення '1'.

вимога

Необов’язково

тип

str

Default

''

documentation

path до документації щодо налаштування. Якщо встановлено, поруч із міткою налаштування відображається значок, на який можна натискати. Шлях може бути як абсолютним, так і relative path. В останньому випадку він є відносним до https://www.odoo.com/documentation/<version>.

вимога

Необов’язково

тип

path_

Default

''

groups

Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом !.

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
вимога

Необов’язково

тип

str

Default

''

invisible

Чи є елемент видимим (False) чи прихованим (True), як вираз Python, який обчислюється як логічне значення.

Примітка

Атрибут invisible можна використовувати у двох випадках:

  • Зручність використання: щоб уникнути перевантаження представлення та полегшити читання користувачем, залежно від контенту.

  • Технічні: поле має бути присутнім (достатньо бути невидимим) у представленні, щоб його можна було використовувати у виразі Python.

Example

<field name="fname_a" invisible="True"/> <!-- necessary to evaluate invisible attribute of 'fname_b' field -->
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
вимога

Необов’язково

тип

Вираз Python

Default

False

Список

Кореневим елементом представлень списку є tree1.

Можлива структура та представлення її рендерингу

../../../_images/list.svg
<tree>
    ...
</tree>

Кореневі атрибути

До кореневого елемента tree можна додати додаткові атрибути для налаштування представлення.

string

Заголовок представлення. Він відображається лише тоді, коли ви відкриваєте дію, яка не має назви та метою якої є new (відкриття діалогового вікна).

вимога

Необов’язково

тип

str

Default

''

create

Вимкнути/увімкнути створення записів у представленні.

вимога

Необов’язково

тип

bool

Default

True

edit

Вимкнути/увімкнути редагування записів у представленні.

вимога

Необов’язково

тип

bool

Default

True

delete

Вимкнути/увімкнути видалення записів у представленні через випадаюче меню Дія.

вимога

Необов’язково

тип

bool

Default

True

import

Вимкнути/увімкнути імпорт записів з даних у поданні.

вимога

Необов’язково

тип

bool

Default

True

export_xlsx

Вимкнути/увімкнути експорт записів до даних у представленні.

вимога

Необов’язково

тип

bool

Default

True

editable

Зробіть записи представлення доступними для редагування на місці та дозвольте створення нових записів з рядка списку. Може мати два різних значення:

top

Нові записи створюються з початку списку.

bottom

Нові записи створюються знизу списку.

Архітектура вбудованого представлення форма походить від представлення списку. Таким чином, більшість атрибутів, дійсних для полів і кнопок представлення форми, приймаються представленнями списків, хоча вони можуть не мати жодного значення, якщо представлення списку не редагується.

Важливо

Ця поведінка вимкнена, якщо атрибут edit встановлено на False.

вимога

Необов’язково

тип

str

Default

''

multi_edit

Активуйте функцію мульти-редагування, яка дозволяє оновлювати поле до однакового значення для кількох записів одночасно.

Він приймає лише значення '1'.

вимога

Необов’язково

тип

str

Default

''

open_form_view

Відобразити кнопку в кінці кожного рядка, щоб відкрити запис у представленні форми.

Це не має жодного ефекту, якщо представлення не можна редагувати.

вимога

Необов’язково

тип

bool

Default

False

default_group_by

Назва поля, за яким записи мають бути згруповані за замовчуванням, якщо групування не вказано через дію або поточний пошук.

вимога

Необов’язково

тип

str

Default

''

default_order

Список назв полів, розділених комами, який замінює порядок, визначений у моделі за допомогою атрибута _order.

Щоб інвертувати порядок сортування поля, додайте до нього постфікс desc, розділений пробілом.

Example

<tree default_order="sequence,name desc">
    ...
</tree>
вимога

Необов’язково

тип

str

Default

''

decoration-<style>

Стиль, який слід застосовувати до рядків відповідних записів, як вираз Python, що повертає логічне значення.

<style> потрібно замінити на bf (жирний шрифт), it (курсив), info, warning, danger, muted, primary або success.

Example

<tree decoration-danger="field_qty &gt; field_limit">
    ...
</tree>
вимога

Необов’язково

тип

Вираз Python

Default

False

limit

Розмір сторінки за замовчуванням. Він має бути суворо додатним.

вимога

Необов’язково

тип

int

Default

80 для списків, 40 для списків X2many у формах

groups_limit

Кількість груп на сторінці за замовчуванням, коли згруповано представлення списку. Вона має бути суворо додатним числом.

вимога

Необов’язково

тип

int

Default

80 для списків, 40 для списків X2many у формах

expand

Чи слід відкривати перший рівень груп за замовчуванням під час групування списку.

Попередження

Це може бути повільно, залежно від кількості груп.

вимога

Необов’язково

тип

bool

Default

False

sample

Чи слід заповнювати представлення набором зразків записів, якщо для поточної моделі не знайдено жодного.

Ці фальшиві записи мають евристику для певних назв/моделей полів. Наприклад, поле display_name у моделі res.users буде заповнено іменами людей-прикладів, тоді як поле email матиме формат [email protected].

Користувач не може взаємодіяти з цими даними, і вони будуть видалені, щойно буде виконано дію (створено запис, додано стовпець тощо).

вимога

Необов’язково

тип

bool

Default

False

banner_route

Маршрут для отримання HTML-коду та додавання його на початок представлення.

Якщо цей атрибут встановлено, URL-адреса маршруту controller отримується, а повернутий вміст відображається над вікном перегляду. Відповідь JSON від контролера повинна містити ключ html.

Якщо HTML містить тег <link> для таблиці стилів, його буде видалено з початкового розташування та додано до розділу <head>.

Використовуйте теги <a type="action"> для взаємодії з серверною частиною, наприклад, з кнопками дій.

Example

<tree banner_route="/module_name/hello" />
class MyController(odoo.http.Controller):
    @http.route('/module_name/hello', auth='user', type='json')
    def hello(self):
        return {
            'html': """
                <div>
                    <link href="/module_name/static/src/css/banner.css"
                        rel="stylesheet">
                    <h1>hello, world</h1>
                </div> """
        }
вимога

Необов’язково

тип

path

Default

''

Компоненти

Спискові представлення приймають такі дочірні елементи: поле, кнопка, групувати по, хедер, контроль та створення.

Заповнювачі позначені великими літерами.

field: відображати значення полів

Елемент field відображає (і, можливо, дозволяє редагувати) одне поле всіх поточних записів як колонка.

Використання одного й того самого поля кілька разів у списку не підтримується

<tree>
    <field name="FIELD_NAME"/>
</tree>

Елемент field може мати такі атрибути:

name

Назва поля для відображення.

вимога

Обов’язкове

тип

str

string

Мітка поля.

вимога

Необов’язково

тип

str

Default

Атрибут string поля моделі

optional

Зробіть видимість поля необов’язковою. Стовпець поля можна приховати або показати за допомогою кнопки в заголовку представлення.

Він може мати два різних значення:

show

Поле відображається за замовчуванням.

hide

За замовчуванням поле приховане.

Example

<field name="fname_a" optional="show"/>
<field name="fname_b" optional="hide"/>
вимога

Необов’язково

тип

str

readonly

Чи може поле бути змінене користувачем (False), чи воно доступне лише для читання (True), як вираз Python, який обчислюється як логічне значення.

Example

<field name="fname_a" readonly="True"/>
<field name="fname_b" readonly="name_a in [fname_b, parent.fname_d]"/>
вимога

Необов’язково

тип

Вираз Python

Default

False

required

Чи можна залишити поле порожнім (False), чи його потрібно встановити (True) як вираз Python, який повертає логічне значення.

Example

<field name="fname_a" required="True"/>
<field name="fname_b" required="fname_c != 3"/>
вимога

Необов’язково

тип

Вираз Python

Default

False

invisible

Чи є елемент видимим (False) чи прихованим (True), як вираз Python, який обчислюється як логічне значення.

Примітка

Атрибут invisible можна використовувати у двох випадках:

  • Зручність використання: щоб уникнути перевантаження представлення та полегшити читання користувачем, залежно від контенту.

  • Технічні: поле має бути присутнім (достатньо бути невидимим) у представленні, щоб його можна було використовувати у виразі Python.

Example

<field name="fname_a" invisible="True"/> <!-- necessary to evaluate invisible attribute of 'fname_b' field -->
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
вимога

Необов’язково

тип

Вираз Python

Default

False

column_invisible

Чи є колонка видимою (False) чи прихованою (True), як вираз Python, який обчислюється як логічне значення.

На відміну від invisible, це впливає на всю колонку і обчислюється без значень піддерева.

Example

<field name="product_is_late" column_invisible="parent.has_late_products == False"/>
<button type="object" name="action_confirm" column_invisible="context.get('hide_confirm')"/>
вимога

Необов’язково

тип

Вираз Python

Default

False

groups

Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом !.

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
вимога

Необов’язково

тип

str

Default

''

decoration-<style>

Стиль, який слід застосовувати до поля відповідних записів, як вираз Python, що повертає логічне значення.

<style> потрібно замінити на bf (жирний шрифт), it (курсив), info, warning, danger, muted, primary або success.

Example

<field name="name" decoration-bf="1"/>
<field name="quantity" decoration-info="state == 'draft'"/>
вимога

Необов’язково

тип

Вираз Python

Default

False

widget

Метод рендерингу та контекст, що використовуються замість стандартного, призначеного типу поля (наприклад, Char, Many2one). Див. Поля.

Example

<form>
    <field name="tag_ids" widget="many2many_tags"/>
</form>
<tree>
    <field name="sequence" widget="handle"/>
    <field name="level_progress" widget="progressbar"/>
</tree>
вимога

Необов’язково

тип

str

Default

''

sum, avg

Агрегація, яку потрібно відобразити внизу колонки. Агрегація обчислюється лише для записів, які наразі відображаються. Операція агрегації має відповідати group_operator відповідного поля.

Example

<field name="sent" sum="Total" />
<field name="clicks_ratio" avg="Average"/>
вимога

Необов’язково

тип

str

Default

''

width

Ширина, яка застосовується до колонки поля, коли у списку немає записів, у вигляді абсолютної ширини (наприклад, 100px).

Важливо

Ширина встановлюється веб-клієнтом, коли у списку є записи.

вимога

Необов’язково

тип

str

Default

''

nolabel

Чи має заголовок колонки поля залишатися порожнім. Якщо встановлено, стовпець не буде сортуватися.

Приймає лише значення '1'

вимога

Необов’язково

тип

str

Default

''

Примітка

Коли список групується, числові поля агрегуються та відображаються для кожної групи. Також, якщо в групі забагато записів, праворуч від рядка групи з’являється пейджер. З цієї причини небажано розміщувати числове поле в останній колонцці, коли список знаходиться в ситуації, коли його можна згрупувати. Однак це не створює проблеми для полів X2many у представленні форми, оскільки їх не можна згрупувати.

Можлива структура та представлення її рендерингу

../../../_images/list_field.svg
<tree>
    <field name="name" string="My Custom Name"/>
    <field name="amount" sum="Total"/>
    <field name="company_id" invisible="1"/>
    <field name="currency_id"/>
    <field name="tax_id"/>
</tree>

button: відображення кнопок дій

<tree>
    <button type="object" name="ACTION" string="LABEL"/>
    <button type="object" name="ACTION" icon="FONT_AWESOME"/>
</tree>

Елемент button може мати такі атрибути:

type

Тип кнопки, що вказує на її поведінку. Може мати два різних значення:

object

Викликати метод на моделі представлення. name кнопки - це метод, який викликається з поточним ідентифікатором запису та поточним context.

action

Завантажити та виконати запис дії ir.actions. Ім'я кнопки – це XMLID дії, яку потрібно завантажити. context розширюється моделлю представлення (як active_model) та поточним записом (як active_id).

Example

<button type="object" name="action_create_new" string="Create document"/>
<button type="action" name="addon.action_create_view" string="Create and Edit"/>
вимога

Обов’язковий, якщо атрибут special не встановлено

тип

str

name

Метод, який потрібно викликати, якщо type - object. XMLID дії, яку потрібно завантажити, якщо type - action, або у форматі необробленого коду, або у форматі %(XMLID)d.

вимога

Необов’язково

тип

str

Default

''

string

Текст кнопки, якщо немає icon, alt текст для іконки в іншому випадку.

Example

<button type="object" name="action_create_new" string="Create document"/>
вимога

Необов’язково

тип

str

Default

''

icon

Піктограма, яка використовується для відображення кнопки. Див. список посилань у іконки.

Example

<button type="object" name="remove" icon="fa-trash"/>
вимога

Необов’язково

тип

str

Default

''

help

Підказка, що відображається під час наведення курсора миші.

Example

<button type="object" name="remove" icon="fa-trash" help="Revoke"/>
вимога

Необов’язково

тип

str

Default

''

context

Контекст, який об’єднується з контекстом представлення під час виклику кнопки, як вираз Python, що обчислюється як словник.

Example

<button name="button_confirm" type="object" context="{'BUSINESS_KEY': ANY}" string="LABEL"/>
вимога

Необов’язково

тип

Вираз Python

Default

{}

groups

Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом !.

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
вимога

Необов’язково

тип

str

Default

''

invisible

Чи є елемент видимим (False) чи прихованим (True), як вираз Python, який обчислюється як логічне значення.

Примітка

Атрибут invisible можна використовувати у двох випадках:

  • Зручність використання: щоб уникнути перевантаження представлення та полегшити читання користувачем, залежно від контенту.

  • Технічні: поле має бути присутнім (достатньо бути невидимим) у представленні, щоб його можна було використовувати у виразі Python.

Example

<field name="fname_a" invisible="True"/> <!-- necessary to evaluate invisible attribute of 'fname_b' field -->
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
вимога

Необов’язково

тип

Вираз Python

Default

False

column_invisible

Чи є колонка видимою (False) чи прихованою (True), як вираз Python, який обчислюється як логічне значення.

На відміну від invisible, це впливає на всю колонку і обчислюється без значень піддерева.

Example

<field name="product_is_late" column_invisible="parent.has_late_products == False"/>
<button type="object" name="action_confirm" column_invisible="context.get('hide_confirm')"/>
вимога

Необов’язково

тип

Вираз Python

Default

False

class

Клас HTML, який потрібно встановити для згенерованого елемента.

Стилізація використовує фреймворк Bootstrap та UI icons. Загальні класи Odoo включають:

  • oe_inline: запобігає звичайному розриву рядка після полів та обмежує їх проміжок;

  • oe_left, oe_right: floats елемент у відповідному напрямку;

  • oe_read_only, oe_edit_only: відображає елемент лише у відповідному режимі форми;

  • oe_avatar: для полів зображень відображає зображення як «аватар» (максимум 90x90 квадрат);

  • oe_stat_button: визначає певний спосіб візуалізації для динамічного відображення інформації з можливістю натискання для виконання дії.

Example

<field name="fname" class="oe_inline oe_left oe_avatar"/>

Example

<button type="object" name="ACTION" class="oe_stat_button" icon="FONT_AWESOME" help="HELP">
   <div class="o_field_widget o_stat_info">
      <span class="o_stat_value"><FIELD/></span>
      <span class="o_stat_text">TEXT</span>
   </div>
</button>
вимога

Необов’язково

тип

str

Default

''

Можлива структура та представлення її рендерингу

../../../_images/list_button.svg
<tree>
    <field name="name"/>
    <button type="edit" name="edit" icon="fa-edit" title="Edit"/>
    <button type="object" name="my_method" string="Button1" column_invisible="context.get('hide_button')" invisible="amount &gt; 3"/>
    <field name="amount"/>
    <field name="currency_id"/>
    <field name="tax_id"/>
</tree>

groupby: визначення заголовків груп

Елемент groupby використовується для визначення заголовків груп за допомогою елементів кнопка під час групування записів за полями Many2one. Він також приймає елементи поле, які можна використовувати для модифікаторів. Таким чином, ці поля належать до комоделі Many2one. Ці додаткові поля вибираються пакетно.

<tree>
    ...
    <groupby name="FIELD_NAME">
        <BUTTONS/>
        <FIELDS/>
    </groupby>
</tree>

Елемент groupby може мати такі атрибути:

name

Назва поля Many2one для використання як заголовок.

Для відкриття форми поля Many2one можна визначити спеціальний елемент кнопка з type="edit".

вимога

Обов’язкове

тип

str

Можлива структура та представлення її рендерингу

../../../_images/list_groupby.svg
<tree>
    <field name="name"/>
    <field name="amount"/>
    <field name="currency"/>
    <field name="tax_id"/>

    <groupby name="partner_id">
        <button type="edit" name="edit" icon="fa-edit" title="Edit"/>
        <field name="email"/>
        <button type="object" name="my_method" string="Button1" invisible="email == '[email protected]'"/>
    </groupby>
</tree>

Примітка

Поля всередині елемента groupby використовуються лише для отримання та зберігання значення, але вони ніколи не відображаються.

header: відображення кнопок робочого процесу

<tree>
    <header>
        <BUTTONS/>
    </header>
    ...
</tree>

Елемент header приймає такі дочірні елементи:

button

Елемент button дозволяє визначати кнопки на панелі керування. Це той самий елемент, що й елемент кнопки у списках, але він приймає ще один атрибут, коли його розміщують всередині елемента header:

display

Зробіть кнопку доступною постійно, без необхідності вибирати записи.

Він приймає лише значення always.

Example

<header>
    <button name="toDoAlways" type="object" string="Always displayed" display="always"/>
    <button name="toDoSelection" type="object" string="Displayed if selection"/>
</header>
вимога

Необов’язково

тип

str

Default

''

Можлива структура та представлення її рендерингу

../../../_images/list_header.svg
<tree>
    <header>
        <button type="object" name="to_draft" string="Button1" invisible="context.get('hide_button')"/>
    </header>
    <field name="name"/>
    <field name="amount"/>
    <field name="currency"/>
    <field name="tax_id"/>
</tree>

control і create: додати вбудовані кнопки створення

Елемент control визначає рядок керування, який приймає кнопки створення. Кожна кнопка створення визначається через елемент create.

<tree>
   <control>
       <create string="LABEL"/>
       <BUTTONS/>
    </control>
    ...
</tree>

Елемент control не приймає жодних атрибутів.

Елемент create може мати такі атрибути:

string

Текст кнопки.

вимога

Обов’язкове

тип

str

context

Контекст, який об’єднується з контекстом представлення під час виклику кнопки, як вираз Python, що обчислюється як словник.

вимога

Необов’язково

тип

Вираз Python

Default

{}

Можлива структура та представлення її рендерингу

../../../_images/list_control.svg
<tree>
    <field name="name"/>
    <field name="amount"/>
    <field name="currency"/>
    <field name="tax_id"/>
    <control>
        <create string="Add a item"/>
        <create string="Add a section" context="{'default_type': 'section'}"/>
        <create string="Add a note" context="{'default_type': 'note'}"/>
    </control>
</tree>

Примітка

Використання елемента control має сенс лише тоді, коли список знаходиться всередині поля One2many або Many2many. Якщо визначено будь-який елемент create, він перезаписує кнопку додати рядок за замовчуванням.

1

З історичних причин, його походження походить від деревоподібних представлень, які пізніше були перепрофільовані на табличні/спискові представлення.

Компоненти

Представлення пошуку приймають такі дочірні елементи: поле, фільтр, роздільник, група та пошукова панель.

Заповнювачі позначені великими літерами.

field: фільтр на основі значень полів

Елемент field визначає домени або контексти зі значеннями, наданими користувачем. Під час генерації доменів пошуку, домени полів об’єднуються один з одним та з фільтрами за допомогою оператора І.

<search>
    <field name="FIELD_NAME"/>
</search>

Елемент field може мати такі атрибути:

name

Назва поля, за яким потрібно фільтрувати.

вимога

Обов’язкове

тип

str

string

Мітка поля.

вимога

Необов’язково

тип

str

Default

Атрибут string поля моделі

operator

За замовчуванням поля генерують домени виду [(name, operator, value)], де name – це назва поля, а value – це значення, надане користувачем, можливо, відфільтроване або перетворене (наприклад, користувач має надати мітку значення поля вибору, а не саме значення).

Атрибут operator дозволяє перевизначити оператор за замовчуванням, який залежить від типу поля (наприклад, = для полів типу float, але ilike для полів типу char та child_of для many2one).

вимога

Необов’язково

тип

str

Default

=

filter_domain

Домен, який використовуватиметься як домен пошуку поля, як вираз Python, що обчислюється як домен.

Він може використовувати змінну self для вставки наданого значення в користувацький домен. Це можна використовувати для створення значно гнучкіших доменів, ніж з використанням лише атрибута operator (наприклад, пошук по кількох полях одночасно).

Якщо надано обидва атрибути operator та filter_domain, пріоритет має filter_domain.

вимога

Необов’язково

тип

Вираз Python

Default

[]

context

Контекст для об’єднання з контекстом представлення, на яке спрямоване представлення пошуку, як вираз Python, який обчислюється як словник.

Він може містити значення, надані користувачем, які доступні у змінній self.

вимога

Необов’язково

тип

Вираз Python

Default

{}

domain

Фільтри, що застосовуються до результатів автозаповнення для полів, що дозволяють автозаповнення (наприклад, Many2one).

вимога

Необов’язково

тип

Вираз Python

Default

[]

groups

Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом !.

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
вимога

Необов’язково

тип

str

Default

''

invisible

Чи є елемент видимим (False) чи прихованим (True), як вираз Python, який обчислюється як логічне значення.

Примітка

Атрибут invisible можна використовувати у двох випадках:

  • Зручність використання: щоб уникнути перевантаження представлення та полегшити читання користувачем, залежно від контенту.

  • Технічні: поле має бути присутнім (достатньо бути невидимим) у представленні, щоб його можна було використовувати у виразі Python.

Example

<field name="fname_a" invisible="True"/> <!-- necessary to evaluate invisible attribute of 'fname_b' field -->
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
вимога

Необов’язково

тип

Вираз Python

Default

False

Можлива структура та представлення її рендерингу

../../../_images/search_field.svg
<search>
    <field name="name" string="My Custom Name"/>
    <field name="amount"/>
    <field name="company_id" invisible="1"/>
    <field name="currency_id"/>
    <field name="ref" filter_domain="[('name', 'like', self)]"/>
</search>

filter: створювати попередньо визначені фільтри

Елемент filter використовується для створення попередньо визначених фільтрів, які можна перемикати/вмикати у вікні пошуку. Він дозволяє додавати дані до контексту пошуку контексту, що передається до вікна перегляду даних для пошуку/фільтрації, або додавати нові розділи до фільтра пошуку.

<search>
    <filter string="LABEL" domain="DOMAIN"/>
</search>

Елемент filter може мати такі атрибути:

name

Технічна назва фільтра. Її можна використовувати для увімкнено за замовчуванням або як перехоплювач успадкування.

вимога

Обов’язкове

тип

str

string

Мітка фільтра.

вимога

Обов’язкове

тип

str

help

Підказка, що відображається під час наведення курсора на фільтр.

вимога

Необов’язково

тип

str

Default

''

domain

Домен, який потрібно додати до домену дії як частину домену пошуку.

вимога

Необов’язково

тип

Вираз Python

Default

[]

date

Назва поля date або datetime для фільтрації.

При використанні цей атрибут створює набір фільтрів, доступних у підменю меню Фільтри. Доступні фільтри залежать від часу, але не є динамічними в тому сенсі, що їхні домени оцінюються під час створення екземпляра панелі керування.

Example

<filter string="Creation Date" name="filter_create_date" date="create_date"/>
вимога

Необов’язково

тип

str

Default

''

default_period

Період за замовчуванням для фільтра на основі часу (з атрибутом date). Це має бути один із варіантів або список із таких, розділених комами, як today, this_week, this_month, last_month, antepenultimate_month, fourth_quarter, third_quarter, second_quarter, first_quarter, this_year, last_year або antepenultimate_year.

Фільтр має бути в наборі фільтрів за замовчуванням, активованих під час ініціалізації представлення.

Example

<filter string="Creation Date" name="filter_create_date" date="create_date" default_period="this_year,last_year"/>
вимога

Необов’язково

тип

str

Default

this_month

сфера застосування

Фільтри з непорожнім атрибутом date

invisible

Чи є елемент видимим (False) чи прихованим (True), як вираз Python, який обчислюється як логічне значення.

Примітка

Атрибут invisible можна використовувати у двох випадках:

  • Зручність використання: щоб уникнути перевантаження представлення та полегшити читання користувачем, залежно від контенту.

  • Технічні: поле має бути присутнім (достатньо бути невидимим) у представленні, щоб його можна було використовувати у виразі Python.

Example

<field name="fname_a" invisible="True"/> <!-- necessary to evaluate invisible attribute of 'fname_b' field -->
<field name="fname_b" invisible="fname_c != 3 and fname_a == parent.fname_d"/>
<group invisible="fname_c != 4">
    <field name="fname_c"/>
    <field name="fname_d"/>
<group>
вимога

Необов’язково

тип

Вираз Python

Default

False

groups

Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом !.

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
вимога

Необов’язково

тип

str

Default

''

context

Контекст об’єднано з доменом дії для створення домену пошуку

Контекстний ключ group_by, встановлений із полем як значенням, може бути використаний для визначення групи, доступної в меню Групувати по. Коли поле має тип date або datetime, фільтр генерує підменю меню Групувати по з такими доступними параметрами інтервалу: Рік, Квартал, Місяць, Тиждень та День. Коли фільтр знаходиться в наборі фільтрів за замовчуванням, активованих під час ініціалізації представлення, записи групуються за місяцем за замовчуванням. Це можна змінити за допомогою синтаксису date_field:interval.

Example

<filter string="Category" name="groupby_category" context="{'group_by': 'category_id'}"/>
<filter string="Creation Date" name="groupby_create_date" context="{'group_by': 'create_date:week'}"/>

Примітка

На результати read_groups, згрупованих за полем, може впливати його атрибут group_expand, що дозволяє відображати порожні групи за потреби. Для отримання додаткової інформації зверніться до Field.

вимога

Необов’язково

тип

Вираз Python

Default

{}

Застереження

Послідовності фільтрів (без розділяючих їх елементів, що не є фільтрами) обробляються як інклюзивно складені: вони будуть складені за допомогою оператора `` , а не звичайного `AND.

Example

<filter domain="[('state', '=', 'draft')]"/>
<filter domain="[('state', '=', 'done')]"/>

Відображаються записи, поле state яких має значення draft або done.

Example

<filter domain="[('state', '=', 'draft')]"/>
<separator/>
<filter domain="[('delay', '&lt;', 15)]"/>

Записи, у яких значення в полі state має значення draft і значення в полі delay менше 15.

Можлива структура та представлення її рендерингу

../../../_images/search_filter.svg
<search>
    <filter string="My Custom Name" domain="[('name', 'ilike', 'AAA')]"/>
    <filter string="My orders" domain="[('user_id', '=', uid)]"/>
    <filter string="Category" context="{'group_by': 'category_id'}"/>
</search>

separator: окремі групи фільтрів

Елемент separator використовується для розділення груп фільтри у простих представленнях пошуку. Для складніших представлень пошуку рекомендується використовувати елемент група.

<search>
    <FILTERS/>
    <separator/>
    <FILTERS/>
</search>

Елемент separator не приймає атрибутів.

group: окремі групи фільтрів

Елемент group використовується для розділення груп фільтри у захаращених представленнях пошуку. У простіших представленнях пошуку його можна замінити елементом роздільник.

<search>
    <group>
        <FILTERS/>
    </group>
</search>

Елемент group не приймає атрибутів.

searchpanel: відображення панелей пошуку

Елемент searchpanel відображає панель пошуку ліворуч від перегляду кількох записів. Це дозволяє швидко фільтрувати дані на основі заданих полів.

<search>
    <searchpanel>
        <FIELDS/>
    </searchpanel>
</search>

Елемент searchpanel приймає лише дочірні елементи field.

Елемент field, який використовується як дочірній елемент елемента searchpanel, може мати такі атрибути:

name

Назва поля, за яким потрібно фільтрувати.

вимога

Обов’язкове

тип

str

string

Мітка поля.

вимога

Необов’язково

тип

str

Default

Атрибут string поля моделі

select

Поведінка та відображення поля. Воно може мати два різних значення:

one

Можна вибрати щонайбільше одне значення. Підтримувані типи полів: many2one та selection.

multi

Можна вибрати кілька значень. Підтримувані типи полів: many2one, many2many та selection.

вимога

Необов’язково

тип

str

Default

one

groups

Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом !.

Example

<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
вимога

Необов’язково

тип

str

Default

''

icon

Значок поля.

вимога

Необов’язково

тип

str

Default

''

color

Колір поля.

вимога

Необов’язково

тип

str

Default

''

Коли елемент field має встановлений атрибут select=one, він може мати такі додаткові атрибути:

hierarchize

Чи дочірні категорії повинні відображатися під батьківською категорією чи на тому ж рівні ієрархії.

вимога

Необов’язково

тип

bool

Default

True

сфера застосування

Many2one поля

Коли елемент field має встановлений атрибут select=multi, він може мати такі додаткові атрибути:

enable_counters

Чи обчислюються та відображаються лічильники записів, якщо вони не дорівнюють нулю.

Порада

Цей атрибут існує для того, щоб уникнути впливу на продуктивність. Інший спосіб вирішення проблем із продуктивністю – перевизначити методи search_panel_select_range та search_panel_select_multi_range.

вимога

Необов’язково

тип

bool

Default

False

expand

Чи слід відображати категорії та фільтри без записів.

вимога

Необов’язково

тип

bool

Default

False

limit

Максимальна кількість значень для отримання для поля. Якщо досягнуто ліміту, на панелі пошуку значення не відображатимуться, а натомість з’являтиметься повідомлення про помилку. Якщо встановлено значення 0, будуть отримані всі значення.

вимога

Необов’язково

тип

int

Default

200

domain

Умови, яким повинні відповідати записи.

Example

<searchpanel>
    <field name="department_id"/>
    <field name="manager_id" select="multi" domain="[('department_id', '=', department_id)]"/>
</searchpanel>
вимога

Необов’язково

тип

Вираз Python

Default

[]

groupby

Назва поля, за яким слід групувати значення.

вимога

Необов’язково

тип

str

Default

''

сфера застосування

Поля Many2one та Many2many

Пошук за умовчанням

Поля пошуку та фільтри можна налаштувати через context дії за допомогою ключів search_default_name. Для полів значення має бути значенням, яке потрібно встановити для поля. Для фільтрів це має бути логічне значення або число.

Example

З полем foo та фільтром bar, наступний контекст дії шукатиме foo на acro та вмикатиме bar за замовчуванням:

{
    'search_default_foo': 'acro',
    'search_default_bar': 1
}

Числове значення (від 1 до 99) може бути використано для визначення порядку фільтрів groupby за замовчуванням.

Example

З двома фільтрами groupby, foo та bar, наступний контекст дії спочатку ввімкне bar, а потім foo.

{
    'search_default_foo': 2,
    'search_default_bar': 1
}

Канбан

Канбан-представлення використовуються як візуалізація канбан-дошки: вони відображають записи як «картки», щось середнє між представленням список та нередагованим представленням форма.

Записи можуть бути згруповані в стовпці для використання у візуалізації робочого процесу або маніпулювання ним (наприклад, для управління завданнями або прогресом роботи), або розгруповані (використовуватися просто для візуалізації записів).

Корінним елементом канбан-поглядів є kanban.

Можлива структура та представлення її рендерингу

../../../_images/kanban.svg
<kanban>
    ...
</kanban>

Примітка

Канбан-представлення завантажують та відображають максимум десять стовпців. Будь-який наступний стовпець закривається, але користувач все ще може його відкрити.

Кореневі атрибути

До кореневого елемента kanban можна додати додаткові атрибути для налаштування представлення.

string

Заголовок представлення. Він відображається лише тоді, коли ви відкриваєте дію, яка не має назви та метою якої є new (відкриття діалогового вікна).

вимога

Необов’язково

тип

str

Default

''

create

Вимкнути/увімкнути створення записів у представленні.

вимога

Необов’язково

тип

bool

Default

True

edit

Вимкнути/увімкнути редагування записів у представленні.

вимога

Необов’язково

тип

bool

Default

True

delete

Вимкнути/увімкнути видалення записів у представленні через випадаюче меню Дія.

вимога

Необов’язково

тип

bool

Default

True

default_group_by

Назва поля, за яким записи мають бути згруповані за замовчуванням, якщо групування не вказано через дію або поточний пошук.

вимога

Необов’язково

тип

str

Default

''

default_order

Список назв полів, розділених комами, який замінює порядок, визначений у моделі за допомогою атрибута _order.

Щоб інвертувати порядок сортування поля, додайте до нього постфікс desc, розділений пробілом.

Example

<tree default_order="sequence,name desc">
    ...
</tree>
вимога

Необов’язково

тип

str

Default

''

class

Додайте HTML-класи до кореневого HTML-елементу представлення.

вимога

Необов’язково

тип

str

Default

''

examples

Ключ у реєстрі прикладів KanbanExamplesRegistry, який можна переглядати під час створення нового стовпця у згрупованому представленні канбану.

вимога

Необов’язково

тип

str

Default

''

group_create

Чи видима панель Додати новий стовпець.

вимога

Необов’язково

тип

bool

Default

True

group_delete

Чи можна видаляти стовпці через меню шестерень.

вимога

Необов’язково

тип

bool

Default

True

group_edit

Чи можна редагувати стовпці через меню шестерень.

вимога

Необов’язково

тип

bool

Default

True

groups_draggable

Чи можна змінювати порядок стовпців.

вимога

Необов’язково

тип

bool

Default

True

records_draggable

Чи можна перетягувати записи, коли канбан-представлення згруповано.

вимога

Необов’язково

тип

bool

Default

True

archivable

Чи можна архівувати та розархівувати записи, що належать до стовпця, коли в моделі визначено поле active.

вимога

Необов’язково

тип

bool

Default

True

quick_create

Чи має бути можливість створювати записи без перемикання у представленні форми.

вимога

Необов’язково

тип

bool

Default

True, коли канбан-представлення згруповано за полями типу many2one, selection, char або boolean, інакше False

quick_create_view

Посилання на представлення форма, яке потрібно відкрити під час використання швидкого створення записів.

вимога

Необов’язково

тип

str

Default

''

on_create

Спеціальна дія, яка викликається при натисканні на Створити.

Якщо встановлено значення 'quick_create', використовується швидке створення записів. Якщо швидке створення вимкнено, викликається стандартна дія створення.

вимога

Необов’язково

тип

str

Default

''

sample

Чи слід заповнювати представлення набором зразків записів, якщо для поточної моделі не знайдено жодного.

Ці фальшиві записи мають евристику для певних назв/моделей полів. Наприклад, поле display_name у моделі res.users буде заповнено іменами людей-прикладів, тоді як поле email матиме формат [email protected].

Користувач не може взаємодіяти з цими даними, і вони будуть видалені, щойно буде виконано дію (створено запис, додано стовпець тощо).

вимога

Необов’язково

тип

bool

Default

False

banner_route

Маршрут для отримання HTML-коду та додавання його на початок представлення.

Якщо цей атрибут встановлено, URL-адреса маршруту controller отримується, а повернутий вміст відображається над вікном перегляду. Відповідь JSON від контролера повинна містити ключ html.

Якщо HTML містить тег <link> для таблиці стилів, його буде видалено з початкового розташування та додано до розділу <head>.

Використовуйте теги <a type="action"> для взаємодії з серверною частиною, наприклад, з кнопками дій.

Example

<tree banner_route="/module_name/hello" />
class MyController(odoo.http.Controller):
    @http.route('/module_name/hello', auth='user', type='json')
    def hello(self):
        return {
            'html': """
                <div>
                    <link href="/module_name/static/src/css/banner.css"
                        rel="stylesheet">
                    <h1>hello, world</h1>
                </div> """
        }
вимога

Необов’язково

тип

path

Default

''

Компоненти

Представлення Канбан приймають такі дочірні елементи: поле, хедер, індикатор прогресу та шаблони.

Заповнювачі позначені великими літерами.

field: відображати значення полів

Елемент field оголошує поля для використання в шаблони. Якщо поле просто відображається, його не потрібно попередньо оголошувати.

<kanban>
    <field name="FIELD_NAME"/>
    ...
</kanban>

Елемент field може мати такі атрибути:

name

Назва поля для відображення.

вимога

Обов’язкове

тип

str

Можлива структура та представлення її рендерингу

../../../_images/kanban_field.svg
<kanban>
    <templates>
        <t t-name="kanban-box">
            <div>
                <field name="name"/>
            </div>
        </t>
    </templates>
</kanban>

header: відображення кнопок на панелі керування

Елемент header використовується для вставки власних кнопок на панель керування.

<kanban>
    <header>
        <BUTTONS/>
    </header>
    ...
</kanban>

Елемент header приймає лише дочірні елементи button, подібно до елементів кнопка представлення списку.

Елемент button, що використовується як дочірній елемент елемента header, може мати такі додаткові атрибути:

display

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

display

Кнопка відображається лише тоді, коли вибрано кілька записів; її дія застосовується до вибраних записів.

always

Кнопка відображається завжди, навіть якщо не вибрано жодного запису.

Важливо

Доступний лише режим відображення always, оскільки ще неможливо вибрати записи в представленні канбан.

Example

<header>
    <button name="toDoAlways" type="object" string="Always displayed" display="always"/>
    <button name="toDoSelection" type="object" string="Displayed if selection"/>
</header>
вимога

Необов’язково

тип

str

Default

display

progressbar: показувати індикатори прогресу над стовпцями

Елемент progressbar використовується для визначення індикатора прогресу, який відображатиметься над стовпцями канбану.

<kanban>
    <progressbar field="FIELD_NAME"/>
    ...
</kanban>

Елемент progressbar може мати такі атрибути:

field

Назва поля, на якому базуються підгрупи індикатора виконання.

вимога

Обов’язкове

тип

str

colors

Зіставлення значень полів індикатора виконання зі значеннями кольорів muted, success, warning та danger.

вимога

Обов’язкове

тип

JSON

sum_field

Назва поля, яке буде використано в сумі, що відображається поруч із індикатором прогресу. Якщо не встановлено, замість цього відображається загальна кількість записів.

вимога

Необов’язково

тип

str

Default

''

Можлива структура та представлення її рендерингу

../../../_images/kanban_progressbar.svg
<kanban>
    <progressbar field="activity_state"
                 colors="{'planned': 'success', 'today': 'warning', 'overdue': 'danger'}"
                 sum_field="expected_revenue"/>
    <templates>
        ...
    </templates>
</kanban>

templates: визначення структури карток

Елементи templates використовуються для визначення шаблонів QWeb, які структурують картки канбан.

Визначення структури карток можна розділити на кілька шаблонів для наочності, але має бути визначено принаймні один кореневий шаблон kanban-box.

Можна визначити два додаткові шаблони: kanban-menu та kanban-tooltip. Якщо визначено, шаблон kanban-menu відображається всередині випадаючого списку, який можна перемикати за допомогою вертикальної трикрапки () у верхньому правому куті картки. Шаблон kanban-tooltip відображається всередині підказки під час наведення курсора на картки канбан.

Шаблони написані на JavaScript QWeb

<kanban>
    ...
    <templates>
        <t t-name="kanban-box">
            <div>
                <field name="name"/>
            </div>
        </t>
    </templates>
</kanban>

У контексті рендерингу доступні такі змінні:

widget

Поточний KanbanRecord(). Його можна використовувати для отримання деякої метаінформації. Методи також доступні безпосередньо в контексті шаблону і не потребують доступу через widget.

тип

str

record

Об’єкт з усіма запитуваними полями як його атрибутами. Кожне поле має два атрибути: value та raw_value. Перший відформатовано відповідно до поточних параметрів користувача, тоді як другий є необробленим значенням з read() (за винятком полів date та datetime, які відформатовані відповідно до локалі користувача).

тип

str

context

Поточний контекст поширюється або з дії, яка відкриває представлення канбана, або з поля one2many чи many2many, яке вбудовує представлення канбана у представлення форми.

тип

str

read_only_mode
тип

str

selection_mode

Чи відкривається представлення канбан при виборі поля many2one або many2many в мобільному середовищі.

тип

bool

Хоча більшість шаблонів канбану є стандартними шаблони QWeb, представлення канбану обробляє елементи field, button та a особливим чином:

  • За замовчуванням поля замінюються їхніми відформатованими значеннями, якщо не вказано атрибут widget, і в такому разі їх відображення та поведінка залежить від відповідного віджета. Атрибут widget може мати різні значення, зокрема:

    handle

    Дозволити зміну порядку записів за допомогою перетягування, якщо вони відсортовані на основі полів sequence (або integer).

  • Кнопки та посилання з атрибутом type виконують операції, відмінні від їхньої стандартної функції HTML. Атрибут type може мати значення action та object з звичайні кнопки, або такі значення:

    open

    Клацання елемента відкриває запис картки у представленні форми в режимі лише для читання.

    edit

    Клацання на елементі відкриває запис картки у представленні форми в режимі редагування.

    delete

    Клацання на елементі видаляє запис картки та видаляє саму картку.

QWeb

Представлення QWeb - це стандартні Шаблони QWeb шаблони всередині архів представлення. Вони не мають певного кореневого елемента. Оскільки представлення QWeb не мають певного кореневого елемента, їхній тип має бути вказано явно (його не можна вивести з кореневого елемента поля arch).

Представлення QWeb мають два випадки використання:

  • їх можна використовувати як шаблони інтерфейсу, у цьому випадку template слід використовувати як ярлик.

  • їх можна використовувати як фактичні представлення qweb (відкриті всередині дії), у цьому випадку їх слід визначити як звичайні представлення з явним type (його не можна вивести) і моделлю.

Основні доповнення qweb-as-view до базового шаблону qweb-as-as:

  • qweb-as-view має особливий випадок для елемента <nav>, що несе клас CSS o_qweb_cp_buttons: його вміст має бути кнопками, його буде витягнуто та переміщено до області кнопок панелі керування, Сам <nav> буде видалено, це обхідний шлях для панелі керування, яка ще не існує

  • відтворення qweb-as-view додає кілька елементів до стандартного контексту відтворення qweb:

    model

    модель, до якої прив’язано представлення qweb

    domain

    домен, наданий у представленні пошуку

    context

    контекст, наданий пошуковим поданням

    records

    відкладений проксі для model.search(domain), це можна використовувати, якщо ви просто хочете повторювати записи, а не виконувати більш складні операції (наприклад, групування)

  • qweb-as-view також надає додаткові хуки візуалізації:

    • _qweb_prepare_context(view_id, domain) готує контекст відтворення, специфічний для qweb-as-view

    • qweb_render_view(view_id, domain) - це метод, який викликається клієнтом і викликає методи підготовки контексту та, зрештою, env['ir.qweb'].render().

Графік

Графічне представлення використовується для візуалізації агрегацій для кількох записів або груп записів. Його кореневим елементом є <graph>, який може приймати такі атрибути:

type (необов’язково)

один із bar (за замовчуванням), pie та line, тип графіка для використання

stacked (необов’язково)

використовується лише для bar діаграм. Встановіть 0, щоб запобігти початковому укладанню стовпчиків у групі.

disable_linking (необов’язково)

встановіть 1, щоб запобігти перенаправленню кліків на графіку до списку представлення

order (необов’язково)

якщо встановлено, значення осі x буде відсортовано за замовчуванням відповідно до їх вимірювання щодо заданого порядку (asc або desc). Використовується лише для графіків bar та pie.

string (необов’язковий)

рядок, що відображається в навігаційних елементах під час перенаправлення до представлення списку.

sample

Чи слід заповнювати представлення набором зразків записів, якщо для поточної моделі не знайдено жодного.

Ці фальшиві записи мають евристику для певних назв/моделей полів. Наприклад, поле display_name у моделі res.users буде заповнено іменами людей-прикладів, тоді як поле email матиме формат [email protected].

Користувач не може взаємодіяти з цими даними, і вони будуть видалені, щойно буде виконано дію (створено запис, додано стовпець тощо).

вимога

Необов’язково

тип

bool

Default

False

Єдиним дозволеним елементом у представленні графіка є field, яке може мати такі атрибути:

name (обов’язково)

назва поля для використання в представленні. Якщо використовується для групування (а не агрегування)

invisible (необов’язково)

якщо істина, поле не відображатиметься ні в активних мірах, ні в мірах, які можна вибрати.

type (необов’язково)

якщо встановлено measure, поле буде використовуватися як агреговане значення в групі, а не як критерій групування. Це працює лише для останнього поля з цим атрибутом, але корисно для інших полів з рядковим атрибутом (див. нижче).

interval (необов’язковий)

у полях дати та дати й часу групування виконується за вказаним інтервалом (day, week, month, quarter або year) замість групування за певною датою й часом (з фіксованою роздільною здатністю в секунду) або датою (з фіксованою роздільною здатністю в день). За замовчуванням використовується month.

string (необов’язковий)

використовується лише для полів з type="measure". Назва, яка буде використовуватися для відображення поля в графічному представленні, замінює атрибут Python String за замовчуванням для поля.

Показники автоматично генеруються з полів моделі; використовуються лише агреговані поля. Ці показники також відсортовані в алфавітному порядку в рядку поля.

Попередження

агрегації подання графіків виконуються для вмісту бази даних, незбережені функціональні поля не можна використовувати в поданнях графіків

У представленні графіка field може мати атрибут widget, який визначає його формат. Віджет повинен бути форматером полів, найцікавішими з яких є float_time та monetary.

<field name="working_hours_close" widget="float_time"/>

Зведена таблиця

Зведене таюлиця використовується для візуалізації агрегацій у представленні зведена таблиця. Його кореневим елементом є <pivot>, який може приймати такі атрибути:

disable_linking (необов’язково)

Встановіть 1, щоб видалити посилання комірок таблиці на представлення списку.

display_quantity (необов’язково)

Встановіть 1, щоб стовпець Кількість відображався за замовчуванням.

default_order (необов’язково)

Назва міри та порядок (за зростанням або спаданням), які використовуватимуться як порядок за замовчуванням у представленні.

<pivot default_order="foo asc">
   <field name="foo" type="measure"/>
</pivot>

Єдиним дозволеним елементом у представленні графіка є field, яке може мати такі атрибути:

name (обов’язково)

назва поля для використання в представленні. Якщо використовується для групування (а не агрегування)

string (необов’язковий)

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

type (необов’язково)

вказує, чи слід використовувати поле як критерій групування чи як агреговане значення в межах групи. Можливі значення:

row (за замовчуванням)

групування за вказаним полем, кожна група отримує окремий рядок.

col

створює групи по стовпцях

measure

поле для агрегування в групу

interval

у полях дати та дати й часу групує за вказаним інтервалом (день, тиждень, місяць, квартал або рік) замість групування за конкретною датою та часом ( фіксована друга роздільна здатність) або дата (фіксована роздільна здатність дня).

invisible (необов’язково)

якщо істина, поле не відображатиметься ні в активних показниках, ні в параметрах, які можна вибрати (корисно для полів, які не мають сенсу агрегувати, наприклад, поля в різних одиницях, наприклад, € та $).

sample

Чи слід заповнювати представлення набором зразків записів, якщо для поточної моделі не знайдено жодного.

Ці фальшиві записи мають евристику для певних назв/моделей полів. Наприклад, поле display_name у моделі res.users буде заповнено іменами людей-прикладів, тоді як поле email матиме формат [email protected].

Користувач не може взаємодіяти з цими даними, і вони будуть видалені, щойно буде виконано дію (створено запис, додано стовпець тощо).

вимога

Необов’язково

тип

bool

Default

False

Показники автоматично генеруються з полів моделі; використовуються лише агреговані поля. Ці показники також відсортовані в алфавітному порядку в рядку поля.

Попередження

Подібно до графічного перегляду, зведена агрегує дані про вміст бази даних, що означає, що незбережені функціональні поля не можна використовувати в зведених представленнях

У зведеній таблиці field може мати атрибут widget, щоб диктувати його формат. Віджет має бути форматувальником полів, найбільш цікавими з яких є date, datetime, float_time і monetary.

Наприклад, зведену таблицю табеля можна визначити як:

<pivot string="Timesheet">
    <field name="employee_id" type="row"/>
    <field name="date" interval="month" type="col"/>
    <field name="unit_amount" type="measure" widget="float_time"/>
</pivot>

Календар

У представленнях календар записи відображаються як події у щоденному, щотижневому, щомісячному або річному календарі.

Примітка

За замовчуванням представлення календар буде зосереджений навколо поточної дати (сьогодні). Ви можете передати певну початкову дату контексту дії, щоб встановити початковий фокус календаря на період (див. mode) навколо цієї дати (ключ контексту для використання - initial_date).

Їхній кореневий елемент - <calendar>. Доступні атрибути у представленні календар:

string

рядок (за замовчуванням: '')

Цей заголовок перегляду відображається лише тоді, коли ви відкриваєте дію, яка не має назви та метою якої є „new“ (відкриття діалогового вікна).

створити

логічне (за замовчуванням: True)

Вимкнути/увімкнути створення записів у представленні.

редагувати

логічне (за замовчуванням: True)

Вимкнути/увімкнути редагування записів у представленні.

вилучити

логічне (за замовчуванням: True)

Вимкніть/увімкніть видалення запису у представленні через спадне меню Дія.

date_start (обов’язково)

назва поля запису, що містить дату початку події

date_stop

назва поля запису, що містить кінцеву дату для події, якщо вказано date_stop записи стають переміщуваними (через перетягування) безпосередньо в календарі

date_delay

альтернатива date_stop, надає тривалість події замість її кінцевої дати (одиниця: день)

color

назва поля запису для кольорової сегментації. Записи в одному кольоровому сегменті виділяються однаковим кольором виділення в календарі, кольори розподіляються напів-випадково. Відображено display_name/avatar видимого запису на бічній панелі

form_view_id

перегляд, який відкривається, коли користувач створює або редагує подію. Зауважте, що якщо цей атрибут не встановлено, перегляд календаря повернеться до ідентифікатора перегляду форми в поточній дії, якщо такий є.

event_open_popup

Якщо для параметра „event_open_popup“ встановлено значення true, перегляд календаря відкриватиме події (або записи) у вікні FormViewDialog. В іншому випадку події відкриються в новому поданні форми (з do_action)

quick_create

увімкнути швидке створення події після кліку: запитує у користувача лише name (поле, в якому зберігаються ці значення, можна контролювати за допомогою rec_name) та намагається створити нову подію лише з цією назвою та часом події кліку. Повертається до повного діалогового вікна форми, якщо швидке створення не вдається.

quick_create_view_id

Представлення, яке відкривається, коли встановлено атрибут quick_create, і користувач створює подію замість діалогового вікна за замовчуванням.

create_name_field

назва поля запису, що містить текстове представлення запису; використовується під час створення записів за допомогою механізму „швидкого створення“

all_day

назва логічного поля в записі, яке вказує, чи позначено відповідну подію як денну (і тривалість не має значення)

mode

Режим відображення за замовчуванням під час завантаження календаря. Можливі атрибути: день, тиждень, місяць, рік

scales

Розділений комами список шкал, які потрібно надати. За замовчуванням доступні всі масштаби. Перегляньте режим для можливих значень масштабу.

create, delete

дозволяє вимкнути відповідну дію в поданні, встановивши для відповідного атрибута значення false

<field>

оголошує поля для агрегування або використання в logic канбану. Якщо поле просто відображається в календарних картках.

Поля можуть мати додаткові атрибути:

invisible

використовуйте «True», щоб приховати значення в картках

avatar_field

лише для поля x2many, щоб відображати аватар замість display_name у картках

write_model та write_field та filter_field

ви можете додати фільтр і зберегти результат у визначеній моделі, фільтр додається на бічній панелі. filter_field є необов’язковим і дозволяє вказати поле, яке зберігатиме статус фільтра.

filters та color

використовуйте «True», щоб додати це поле у фільтр на бічній панелі. Ви можете вказати поле color для розфарбовування прапорця.

Модель Commons

Model._date_name = 'date'

поле для представлення календаря за замовчуванням

Активність

Представлення Активність використовується для відображення активностей, пов’язаних із записами. Дані відображаються у вигляді діаграми, де записи утворюють рядки, а типи активностей – стовпці. У першій клітинці кожного рядка відображається картка (яку можна налаштувати, див. templates, подібно до Канбан), що представляє відповідний запис. При натисканні на інші клітинки відображається детальний опис усіх активностей одного типу для запису.

Попередження

Перегляд активності доступний, лише коли встановлено модуль mail, а також для моделей, які успадковують mail.activity.mixin.

Кореневим елементом представлення активності є <activity>, він приймає такі атрибути:

string (обов’язковий)

Заголовок, який повинен описувати вигляд

Можливі нащадки елемента view:

field

оголошує поля для використання в logic активності. Якщо поле просто відображається у вікні активності, його не потрібно попередньо декларувати.

Можливі атрибути:

name (обов’язково)

назва поля для отримання

templates

визначає шаблони Шаблони QWeb. Визначення карток можна розділити на кілька шаблонів для ясності, але представлення активності повинні визначати принаймні один кореневий шаблон activity-box, який буде відтворено один раз для кожного запису.

Представлення активності використовує переважно стандартний javascript qweb та надає такі контекстні змінні (див. Канбан для отримання додаткової інформації):

widget

поточний ActivityRecord() можна використовувати для отримання деякої мета-інформації. Ці методи також доступні безпосередньо в контексті шаблону, і до них не потрібно звертатися через widget

record

об’єкт з усіма запитаними полями як його атрибутами. Кожне поле має два атрибути value і raw_value

Когорта

Enterprise feature

Перегляд когорти використовується для відображення та розуміння того, як деякі дані змінюються протягом певного періоду часу. Наприклад, уявіть, що для певного бізнесу клієнти можуть підписатися на певну послугу. Когортний перегляд може відображати загальну кількість підписок щомісяця та вивчати швидкість, з якою клієнт залишає службу (відтік). Якщо клацнути комірку, перегляд когорти перенаправить вас до нової дії, у якій ви побачите лише записи, що містяться в інтервалі часу комірки; ця дія містить представлення списку та представлення форми.

Примітка

За замовчуванням когортне представлення використовуватиме ті самі представлення списку та форми, які визначено в дії. Ви можете передати представлення списку та представлення форми в контекст дії, щоб установити/замінити представлення, які використовуватимуться (контекстні ключі для використання: form_view_id і list_view_id)

Наприклад, ось дуже простий перегляд когорти:

<cohort string="Subscription" date_start="date_start" date_stop="date" interval="month"/>

Кореневим елементом перегляду когорти є <cohort>, він приймає такі атрибути:

string (обов’язковий)

Заголовок, який повинен описувати вигляд

date_start (обов’язковий)

Правильне поле дати або часу. Це поле вважається датою початку запису

date_stop (обов’язковий)

Правильне поле дати або часу. Це поле сприймається представленням як кінцева дата запису. Це поле, яке визначатиме відтік.

disable_linking (необов’язково)

Встановіть 1, щоб запобігти перенаправленню кліків на комірках когорт у представленні списку.

mode (необов’язковий)

Рядок для опису режиму. Це має бути або „відтік“, або „утримання“ (за замовчуванням). Режим відтоку почнеться з 0% і накопичуватиметься з часом, тоді як утримання почнеться зі 100% і з часом зменшуватиметься.

timeline (необов’язково)

Рядок для опису шкали часу. Це має бути „зворотна“ або „пряма“ (за замовчуванням). Пряма шкала часу відображатиме дані від date_start до date_stop, тоді як зворотна часова шкала відображатиме дані від date_stop до date_start (якщо date_start у майбутньому / більше, ніж date_stop).

interval (необов’язковий)

Рядок для опису інтервалу часу. Це має бути „день“, „тиждень“, „місяць“ (за замовчуванням) або „рік“.

measure (необов’язковий)

Поле, яке можна агрегувати. Це поле використовуватиметься для обчислення значень для кожної клітинки. Якщо не встановлено, перегляд когорти підраховуватиме кількість випадків.

<field> (необов’язково)

дозволяє вказати конкретне поле, щоб керувати ним із доступних вимірювань, його основне використання полягає в тому, щоб приховати поле від вибраних вимірювань:

name (обов’язково)

назва поля для використання у вигляді.

string (необов’язковий)

назва, яке використовуватиметься для відображення поля в когортному представленні, замінює стандартний атрибут Python String поля.

invisible (необов’язково)

Якщо значення true, поле не відображатиметься ні в активних вимірах, ні в вибираних вимірах (корисно для полів, які не мають сенсу агрегуватися, наприклад, поля в різних одиницях, наприклад, € та $). Якщо значення є доменом, домен оцінюється в контексті запису поточного рядка, якщо значення True, відповідний атрибут встановлюється для комірки.

odoo.addons.base.models.ir_ui_view.sample

Чи слід заповнювати представлення набором зразків записів, якщо для поточної моделі не знайдено жодного.

Ці фальшиві записи мають евристику для певних назв/моделей полів. Наприклад, поле display_name у моделі res.users буде заповнено іменами людей-прикладів, тоді як поле email матиме формат [email protected].

Користувач не може взаємодіяти з цими даними, і вони будуть видалені, щойно буде виконано дію (створено запис, додано стовпець тощо).

вимога

Необов’язково

тип

bool

Default

False

Сітка

Enterprise feature

Обмеження

Це представлення перебуває в процесі розробки та, можливо, потребуватиме розширення або зміни.

  • протестовано лише поля стовпця date, selection та many2one номінально реалізовані та підтримуються, але не були протестовані, datetime взагалі не реалізовано.

  • клітинки стовпців важко налаштувати та мають бути числовими

  • коригування комірок вимкнено за замовчуванням і його потрібно налаштувати, щоб його ввімкнути

  • Метадані ACL create, edit та delete не встановлюються автоматично в кореневому каталозі представлення через обмеження в пост-обробці fields_view_get (існує фіксований явний список типів представлень, які отримують ці атрибути)

Схема

Представлення сітки має власну схему та додаткову перевірку в цьому модулі. Архітектура представлення така:

<grid> (1)

кореневий елемент архітектури

  • обов’язковий атрибут string

  • необов’язкові атрибути create, edit та delete

  • необов’язкові атрибути adjustment та adjust_name

    adjustment може бути або object, або action, щоб вказати, чи слід виконувати коригування комірки через виклик методу чи виконання дії. adjust_name надає відповідно назву методу та id дії.

    В обох випадках параметри коригування надаються як член контексту grid_adjust, у випадку object параметри також надаються як параметри позиційної функції (поруч із порожнім списком ідентифікаторів):

    row_domain

    домен, що відповідає всьому рядку скоригованої комірки

    column_field

    назва стовпця для скоригованої комірки

    column_value

    значення стовпця для скоригованої комірки

    cell_field

    поле вимірювання скоригованої комірки

    change

    різниця між старим значенням комірки та скоригованим може бути позитивною або негативною

  • необов’язкові атрибути hide_line_total та hide_column_total

    hide_line_total

    встановити значення true, щоб приховати рядок підсумку (за замовчуванням false)

    hide_column_total

    встановити значення true, щоб приховати стовпець підсумок (за замовчуванням false)

  • необов’язковий атрибут barchart_total

    barchart_total

    встановіть true, щоб відобразити стовпчасту діаграму внизу сітки на основі сум стовпців (за замовчуванням false).

  • необов’язкові атрибути create_inline та display_empty

    create_inline

    встановіть значення true, щоб відобразити додатковий рядок внизу сітки з кнопкою Add a line (за замовчуванням false). Коли для цього параметра встановлено значення true, кнопка Add a line на панелі керування прихована. Коли дані недоступні та коли display_empty не встановлено (тобто, коли відображається довідка), кнопка Add a line на панелі керування відображається, щоб користувач міг створити перший запис.

    display_empty

    встановіть значення true, щоб сітка продовжувала відображатися, коли немає даних (за замовчуванням false). Це може бути корисним, коли ви хочете, щоб користувач міг відстежувати поточний період (оскільки дати відображаються в заголовках стовпців). Нагадуємо, що коли дані відсутні та цей атрибут не встановлено, замість сітки відображається вміст довідки.

<button> (0+)

Звичайні кнопки дій Odoo, що відображаються в заголовку хедера

  • обов’язковий атрибут string (мітка кнопки)

  • обов’язковий атрибут type, або object, або action

    Примітка

    кнопки робочого процесу не підтримуються

  • обов’язковий атрибут name, або назва методу, що викликається, або ID дії, що виконується

  • необов’язковий context

Зворотній виклик сервера надається з усіма ідентифікаторами записів, що відображаються у вигляді, або як ідентифікатори, передані методу (кнопка object), або як active_ids контексту (кнопки action)

<field type="row"> (1+)

Поля групування рядків будуть замінені фільтром групування представлення пошуку, якщо такий є.

Порядок полів row у представленні визначає глибину їх групування: якщо першим полем є school, а другим - age, записи будуть спочатку згруповані за school, а потім за age у межах кожної школи.

<field type="col"> (1)

Поле групування стовпців.

Поле col може містити 0+ елементів <range>, які визначають настроювані діапазони стовпців. Елементи range мають такі обов’язкові атрибути

name

можна використовувати для перевизначення діапазону за замовчуванням (першого за замовчуванням) через значення контексту grid_range

string

підпис кнопки діапазону (видимий користувачеві)

span

символічна назва діапазону всіх стовпців, які потрібно відобразити одночасно у поданні, може ініціювати пагінацію.

Для полів date дійсними діапазонами наразі є week та month.

step

символічна назва кроку між одним стовпцем та попереднім/наступним

Для полів date єдиним дійсним діапазоном наразі є day.

<field type="measure"> (1)

Поле комірки, автоматично накопичується (за допомогою read_group).

Поле міри може приймати атрибут widget для налаштування його відображення.

Взаємодія з сервером

Окрім додаткових кнопок, сітчастий вигляд наразі викликає два методи:

  • read_grid (надається модулем у всіх моделях) повертає майже весь вміст сітки у вигляді словника:

    • заголовки рядків – це список словників з такими ключами:

      values (обов’язковий)

      це відображається у словнику з ключем для кожного поля row, значення завжди мають вигляд [value, label].

      domain (обов’язковий)

      домен будь-якого запису у джерелі цього рядка, у випадку, якщо необхідно скопіювати запис під час коригування комірки

    • заголовки стовпців – це список словників, що містять щонайменше один ключ:

      values (обов’язковий)

      переглянути значення заголовків рядків

      domain (обов’язковий)

      див. значення домену стовпця

      current (необов’язково)

      логічне значення, позначає/виділяє стовпець

    • дані сітки у вигляді списку (рядків) списку (комірок) комірок, кожна з яких має такі ключі:

      value

      числове значення, пов’язане з коміркою

      domain

      домен, що відповідає записам комірки (слід вважати непрозорим)

      size

      кількість записів, згрупованих у клітинці

      readonly (необов’язково)

      логічне значення, яке вказує, що ця конкретна комірка не повинна бути доступною для редагування клієнтом

      classes (необов’язково)

      список класів (у вигляді рядків), які потрібно додати до контейнера комірки (між TD комірки та потенційно редагованим елементом комірки).

      У разі конфліктів між цим списком та базовими класами (з префіксом o_grid_cell_), класи у цьому списку ігноруються.

      Зверніть увагу, що дані сітки щільні. Якщо запит до бази даних не дає жодної групи, яка відповідає комірці, комірка згенерує «порожню» комірку зі значеннями за замовчуванням для необхідних ключів.

    • prev та next, які можуть бути або хибними (без пагінації), або елементом контексту для об’єднання з власним контекстом представлення для read_grid попередньої або наступної сторінки, слід вважати їх непрозорими

  • read_grid_domain(field, range) (надається модулем на всіх моделях) повертає домен, що відповідає поточному налаштованому «span» сітки. Це також робиться внутрішньо за допомогою read_grid, але може бути корисним або необхідним для незалежного виклику для використання з окремими, наприклад, search_count або read_group.

  • adjust_grid, для якого наразі немає універсальної реалізації, і семантика якого, ймовірно, розвиватиметься з часом та варіантами використання

Серверні хуки

read_grid викликає низку хуків, що дозволяють налаштовувати його операції зсередини без необхідності перевизначати весь метод:

_grid_format_cell(group, cell_field)

перетворює вивід read_group (група за групою) у комірки у форматі, описаному вище (як частину «даних сітки»)

_grid_make_empty_cell(row_domain, column_domain, view_domain)

генерує порожню версію комірки (якщо відповідної групи немає)

_grid_column_info(name, range)

генерує об’єкт ColumnMetadata на основі типу стовпця, зберігаючи значення, що повертаються безпосередньо (як частина read_grid), або використані запити, та переформатує read_group у read_grid:

grouping

фактичне поле/запит групування для стовпців

domain

домен, який слід застосувати до read_group, якщо поле стовпця має пагінацію, може бути порожнім списком

prev та next

сегменти контексту, які будуть надіслані до read_grid для сторінок до та після поточної. Якщо False, вимикається пагінація в цьому напрямку

values

значення стовпців для відображення на «поточній сторінці», кожне значення є словником з такими ключами:

values

словник, що відповідає назвам полів значенням для всього стовпця, зазвичай просто name -> значення

domain

домен, що відповідає цьому конкретному стовпцю

is_current

True, якщо поточний стовпець має бути чітко окреслений у сітці, інакше False

format

як відформатувати значення цього стовпця/типу з форматування read_group на форматування read_grid (відповідність values у ColumnInfo)

ACL

  • якщо представлення не можна редагувати, окремі комірки не можна буде редагувати

  • якщо представлення не можна створити, кнопка Add a Line не відображатиметься (наразі вона створює новий порожній запис)

Контекстні ключі

grid_range

вибирає, який діапазон слід використовувати за замовчуванням, якщо представлення має кілька діапазонів

grid_anchor

якщо можливо, використовується як прив’язка діапазонів стовпців за замовчуванням замість того, що read_grid визначає як значення за замовчуванням.

Для полів дати – це дата, навколо якої буде обчислюватися початковий проміжок. Дата за замовчуванням – «сьогодні» (у часовому поясі користувача).

Гант

Enterprise feature

Представлення Ганта належним чином відображають діаграми Ганта (для планування).

Кореневим елементом представлень Gantt є <gantt/>, він не має дочірніх, але може приймати такі атрибути:

string

рядок (за замовчуванням: '')

Цей заголовок перегляду відображається лише тоді, коли ви відкриваєте дію, яка не має назви та метою якої є „new“ (відкриття діалогового вікна).

створити

логічне (за замовчуванням: True)

Вимкнути/увімкнути створення записів у представленні.

редагувати

логічне (за замовчуванням: True)

Вимкнути/увімкнути редагування записів у представленні.

вилучити

логічне (за замовчуванням: True)

Вимкніть/увімкніть видалення запису у представленні через спадне меню Дія.

date_start (обов’язково)

назва поля, що містить дату початку події для кожного запису.

date_stop (обов’язково)

назва поля, що містить кінцеву тривалість події для кожного запису.

dependency_field

назва поля many2many, яке забезпечує зв’язок залежності між двома записами. Якщо B залежить від A, dependency_field – це поле, яке дозволяє отримати A з B. Як це поле, так і поле dependency_inverted_field використовуються для малювання стрілок залежності між елементами таблеток та їх перепланування.

dependency_inverted_field (обов’язково, якщо вказано dependency_field)

назва поля many2many, яке забезпечує інвертований зв’язок залежності, ніж dependency_field. Якщо B залежить від A, dependency_inverted_field – це поле, яке дозволяє отримати B з A.

color

назва поля, яке використовується для кольору pills відповідно до його значення

decoration-{$name}

python expression, який повертає логічне значення

дозволяють змінювати стиль тексту комірки на основі атрибутів відповідного запису.

{$name} може бути одним із таких bootstrap contextual color (danger, info, secondary, success або warning).

Визначити умовне відображення запису в стилі тексту рядка на основі атрибутів відповідного запису.

Значення є виразами Python. Для кожного запису вираз обчислюється з атрибутами запису як контекстними значеннями, і якщо true, до рядка застосовується відповідний стиль. Ось деякі інші значення, доступні в контексті:

  • uid: id поточного користувача,

  • today: поточна місцева дата у вигляді рядка YYYY-MM-DD,

  • now: те саме, що today з додаванням поточного часу. Це значення має формат YYYY-MM-DD hh:mm:ss.

<gantt decoration-info="state == 'draft'"
      decoration-danger="state == 'help_needed'"
      decoration-bf="state == 'busy'">
  ...
</gantt>
default_group_by

назва поля для групування завдань

disable_drag_drop

якщо встановлено значення true, перегляд ганта не матиме підтримки перетягування та скидання

consolidation

назва поля для відображення значення консолідації в клітинці запису

consolidation_max

словник із полем «групувати за» як ключем і максимальним значенням консолідації, якого можна досягти перед відображенням клітинки червоним кольором (наприклад, {"user_id": 100})

consolidation_exclude

назва поля, яке описує, чи потрібно виключити завдання з консолідації, якщо встановлено значення true, у рядку консолідації відображається смугаста зона

create, cell_create, edit, delete, plan

дозволяє вимкнутивідповідну дію в представленні, встановивши для відповідного атрибута значення false (за замовчуванням: true).

  • create: якщо ввімкнено, на панелі керування буде доступна кнопка Додати для створення записів.

  • cell_create: якщо ввімкнено та create увімкнено, кнопка «+» відображатиметься під час наведення курсора на клітинку часового інтервалу для створення нового запису в цьому слоті.

  • edit: якщо ввімкнено, відкриті записи будуть у режимі редагування (тому їх можна буде редагувати).

  • plan: якщо ввімкнено та edit, кнопка «збільшувальне скло» відображатиметься на часових інтервалах для планування непризначених записів у цей часовий інтервал.

Example

Якщо ви не бажаєте створювати записи у представленні Ганта, а в моделі потрібні дати початку та завершення, функцію планування слід вимкнути, оскільки жодного запису не буде знайдено.

offset

Залежно від масштабу, кількість одиниць, які потрібно додати до сьогоднішнього дня, щоб обчислити період за умовчанням. Приклади: зсув +1 у default_scale тиждень відкриє перегляд ганта для наступного тижня, а зміщення -2 у default_scale місяць відкриє представлення ганта 2 місяці тому.

progress

назва поля, що містить відсоток завершення для події запису, від 0 до 100

string

назва представлення Ганта

precision

Об’єкт JSON, який визначає точність примикання для pills у кожному масштабі.

Можливі значення для шкали day (за замовчуванням: hour):

  • hour: записує час, прив’язаний до повних годин (наприклад: 7:12 стає 8:00)

  • hour:half: запис часу прив’язується до півгодини (наприклад: 7:12 стає 7:30)

  • hour:quarter: запис часу прив’язується до півгодини (наприклад: 7:12 стає 7:15)

Можливі значення для шкали week (за замовчуванням: day:half):

  • day: записує час, прив’язаний до повних днів (наприклад, 7:28 стає 23:59:59 попереднього дня, 22:32 стає 12:00 поточного дня)

  • day:half: записує час до півгодини (наприклад, 7:28 стає 12:00)

Можливі значення для шкали week (за замовчуванням: day:half):

  • day: записує час, прив’язаний до повних днів (наприклад, 7:28 стає 23:59:59 попереднього дня, 22:32 стає 12:00 поточного дня)

  • day:half: записує час до півгодини (наприклад, 7:28 стає 12:00)

Шкала year завжди прив’язується до повного дня.

Приклад атрибута точності: {"day": "hour:quarter", "week": "day:half", "month": "day"}

total_row

логічне значення, щоб контролювати, чи слід відображати рядок із загальною кількістю записів. (за замовчуванням: false)

collapse_first_level

логічне значення, щоб контролювати, чи можливо згорнути кожен рядок, якщо згруповано одним полем. (за замовчуванням: false, згортання починається при групуванні за двома полями)

display_unavailability

логічне значення для позначення дат, повернутих функцією gantt_unavailability моделі, як доступних у представленні Ганта. У них ще можна планувати записи, але візуально відображається їх недоступність. (за замовчуванням: false)

default_scale

масштаб за замовчуванням під час візуалізації представлення. Можливі значення (за замовчуванням: month):

  • day

  • week

  • month

  • year

scales

розділений комами список допустимих масштабів для цього перегляду. За замовчуванням дозволені всі масштаби. Для можливих значень масштабу для використання в цьому списку перегляньте default_scale.

templates

визначає Шаблони QWeb шаблон gantt-popover, який використовується, коли користувач наводить курсор на один із записів у представленні ганта.

Представлення Гант використовує здебільшого стандартний javascript qweb і надає такі контекстні змінні:

widget

поточний GanttRow() можна використовувати для отримання певної мета-інформації. Метод getColor для перетворення в ціле число кольору також доступний безпосередньо в контексті шаблону без використання widget.

on_create

Якщо це вказано під час натискання кнопки Додати в представленні, замість відкриття загального діалогового вікна запускати дію клієнта. тут має міститися xmlid дії (наприклад: on_create="%(my_module.my_wizard)d"

form_view_id

представлення, яке відкривається, коли користувач створює або редагує запис. Зауважте, що якщо цей атрибут не встановлено, представлення ганта повернеться до ідентифікатора представлення форми в поточній дії, якщо така є.

dynamic_range

якщо встановлено значення true, представлення ганта розпочнеться з першого запису, а не з початку року/місяця/дня.

pill_label

Якщо встановлено значення true, час відображається в етикетці таблетки, коли шкала встановлена на тиждень або місяць. (наприклад, 7:00 - 11:00 (4 год) - DST Завдання 1)

thumbnails

Це дозволяє відображати мініатюру поруч із назвою групи, якщо група є реляційним полем. Це очікує python dict, які ключі є назвою поля в активній моделі. Значення - це назви полів, що містять мініатюру на пов’язаній моделі.

Приклад: завдання мають поле user_id, яке посилається на res.users. Модель res.users має зображення поля, яке містить аватар, а потім:

<gantt
   date_start="date_start"
   date_stop="date_stop"
   thumbnails="{'user_id': 'image_128'}"
 >
 </gantt>

відображатиме аватари користувачів поряд із їхніми іменами, якщо згруповано за user_id.

odoo.addons.base.models.ir_ui_view.sample

Чи слід заповнювати представлення набором зразків записів, якщо для поточної моделі не знайдено жодного.

Ці фальшиві записи мають евристику для певних назв/моделей полів. Наприклад, поле display_name у моделі res.users буде заповнено іменами людей-прикладів, тоді як поле email матиме формат [email protected].

Користувач не може взаємодіяти з цими даними, і вони будуть видалені, щойно буде виконано дію (створено запис, додано стовпець тощо).

вимога

Необов’язково

тип

bool

Default

False

Карта

Enterprise feature

Цей представлення може відображати записи на карті та маршрути між ними. Записи представлені штифтами. Він також дозволяє візуалізувати поля моделі у спливаючому вікні, прив’язаному до штифта запису.

Примітка

Модель, до якої застосовується представлення, повинна містити res.partner типу many2one, оскільки представлення покладається на поля адреси та координат res.partner для локалізації записів.

API

Представлення використовує API платформ даних про місцезнаходження для отримання плиток (фону карти), виконання геофорвардінгу (перетворення адрес на набір координат) та отримання маршрутів. Представлення реалізує два API: OpenStreetMap та MapBox. OpenStreetMap використовується за замовчуванням і може отримувати tiles та виконувати geoforwarding. Цей API не потребує токена. Щойно в загальних налаштуваннях надається дійсний токен MapBox, представлення перемикається на API MapBox. Цей API швидший і дозволяє обчислювати маршрути. Токен можна отримати, signing up в MapBox.

Структурні компоненти

Кореневим елементом представлення є <map>. Він може мати такі атрибути:

res_partner

Містить res.partner many2one. Якщо не вказано, представлення вдається створити порожню карту.

default_order

Якщо поле надано, представлення замінює порядок моделі за замовчуванням. Поле має бути частиною моделі, до якої застосовується представлення, а не з res.partner.

routing

якщо 1 відображає маршрути між записами. Для представлення потрібен дійсний токен MapBox та щонайменше два знайдені записи (тобто записи мають res.partner many2one, а партнер має адресу або дійсні координати).

hide_name

якщо 1, приховати назву із закріпленого спливаючого вікна (за замовчуванням: 0).

hide_address

якщо 1, приховати адресу із закріпленого спливаючого вікна (за замовчуванням: 0).

hide_title

якщо 1, приховати заголовок із закріпленого списку (за замовчуванням: 0).

panel_title

Рядок, який буде відображатися як заголовок списку закріплених елементів. Якщо не вказано, заголовком буде назва дії або «Елементи», якщо подання не перебуває в дії.

limit

Максимальна кількість записів для отримання (за замовчуванням: 80). Це має бути додатне ціле число.

Елемент <map> може містити кілька елементів <field>. Кожен елемент <field> інтерпретується як рядок у закріпленому вспливаючому вікні. Атрибути поля такі:

name

Поле для відображення.

string

Рядок, який відображатиметься перед вмістом поля. Його можна використовувати як опис.

Наприклад, ось карта:
<map res_partner="partner_id" default_order="date_begin" routing="1" hide_name="1">
    <field name="partner_id" string="Customer Name"/>
</map>