Переглянути архітектури¶
Загальна архітектура¶
Архітектура представлення визначається 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(відкриття діалогового вікна).- вимога
Необов’язково
- тип
- Default
''
- create
Вимкнути/увімкнути створення записів у представленні.
- вимога
Необов’язково
- тип
- Default
True
- edit
Вимкнути/увімкнути редагування записів у представленні.
- вимога
Необов’язково
- тип
- Default
True
- duplicate
Вимкніть/увімкніть дублювання запису в представленні за допомогою спадного меню Дія.
- вимога
Необов’язково
- тип
- Default
True
- delete
Вимкнути/увімкнути видалення записів у представленні через випадаюче меню Дія.
- вимога
Необов’язково
- тип
- Default
True
- js_class
Назва компонента JavaScript, екземпляр якого створюватиме веб-клієнт, замість представлення форми.
- вимога
Необов’язково
- тип
- Default
''
- disable_autofocus
Вимкнути автоматичне фокусування на першому полі зображення.
- вимога
Необов’язково
- тип
- 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> """ }
- вимога
Необов’язково
- тип
- Default
''
Семантичні компоненти¶
Семантичні компоненти пов’язані з системою Odoo та дозволяють взаємодіяти з нею.
Види форм приймають наступні семантичні компоненти-дочірні елементи: поле, мытка, кнопка, Віджет Chatter та Віджет попереднього перегляду вкладень.
Заповнювачі позначені великими літерами.
field: відображати значення полів¶
Елемент field відображає (і, можливо, дозволяє редагувати) одне поле поточного запису.
Підтримується багаторазове використання одного й того самого поля у вигляді форми, і поля можуть отримувати різні значення для атрибутів invisible та readonly. Ці поля можуть мати однакові значення, але можуть відображатися по-різному. Однак така поведінка не гарантується, коли існує кілька полів з різними значеннями атрибута required.
<form>
<field name="FIELD_NAME"/>
</form>
Елемент field може мати такі атрибути:
- name
Назва поля для відображення.
- вимога
Обов’язкове
- тип
- id
Ідентифікатор вузла. Корисно, коли у представленні є кілька екземплярів одного й того ж поля (див. label: відображення підписів полів).
- вимога
Необов’язково
- тип
- Default
Назва поля
- string
Мітка поля.
- вимога
Необов’язково
- тип
- Default
Атрибут
stringполя моделі
- help
Підказка, що відображається під час наведення курсора на поле або його підпис.
- вимога
Необов’язково
- тип
- 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>
- вимога
Необов’язково
- тип
- 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}"/>
- вимога
Необов’язково
- тип
- 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]"/>
- вимога
Необов’язково
- тип
- Default
False
- required
Чи можна залишити поле порожнім (
False), чи його потрібно встановити (True) як вираз Python, який повертає логічне значення.Example
<field name="fname_a" required="True"/> <field name="fname_b" required="fname_c != 3"/>
- вимога
Необов’язково
- тип
- 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>
- вимога
Необов’язково
- тип
- Default
False
- groups
Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом
!.Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- вимога
Необов’язково
- тип
- Default
''
- domain
Фільтри, що застосовуються під час відображення існуючих записів для вибору, як вираз Python, який обчислюється як домен.
Example
<field name="fname" domain="[('fname_a', '=', parent.fname_b)]"/>
- вимога
Необов’язково
- тип
- 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, }"/>
- вимога
Необов’язково
- тип
- Default
{}- сфера застосування
Реляційні поля
- nolabel
Чи слід приховувати підпис поля.
- вимога
Необов’язково
- тип
- Default
False- сфера застосування
Поля, що є прямим дочірнім елементом елемента
group
- placeholder
Довідкове повідомлення, яке відображатиметься для порожніх полів. Воно може замінювати підписи полів у складних формах. Однак воно не повинно бути прикладом даних, оскільки користувачі можуть плутати текст-заповнювач із заповненими полями.
- вимога
Необов’язково
- тип
- Default
''
- mode
Список режимів відображення (типів представлення), розділених комами, які слід використовувати для пов’язаних записів поля. Дозволені режими:
tree,form,kanbanтаgraph.
- 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>
- вимога
Необов’язково
- тип
- Default
''
- filename
Назва пов’язаного поля, що містить назву файлу.
- password
Чи зберігає поле пароль, і, отже, його дані не повинні відображатися.
- kanban_view_ref
XMLID конкретного запису канбану переглянути запис, який слід використовувати під час вибору записів у мобільному середовищі.
- вимога
Необов’язково
- тип
- Default
''- сфера застосування
Реляційні поля
- default_focus
Чи є поле у фокусі під час відкриття перегляду. Це можна застосувати лише до одного поля перегляду.
- вимога
Необов’язково
- тип
- 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відповідних вузлів поля.- вимога
Обов’язкове
- тип
- string
Мітка для відображення.
- вимога
Необов’язково
- тип
- 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>
- вимога
Необов’язково
- тип
- 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>
- вимога
Необов’язково
- тип
- Default
False
Віджет 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
Назва, що відображається для групи.
- вимога
Необов’язково
- тип
- Default
''
- col
Кількість колонок у
group.- вимога
Необов’язково
- тип
- Default
2
- colspan
Кількість колонок, зайнятих дочірнім елементом.
- вимога
Необов’язково
- тип
- 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>
- вимога
Необов’язково
- тип
- Default
False
Можлива структура та представлення її рендерингу
<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>
- вимога
Необов’язково
- тип
- Default
False
Можлива структура та представлення її рендерингу
<form>
<notebook>
<page string="Page1">
...
</page>
<page string="Page2">
...
</page>
</notebook>
</form>
|
newline: початок нових групових рядків¶
Елемент newline використовується в елементах група для дострокового завершення поточного рядка та негайного переходу до нового рядка, без попереднього заповнення решти стовпця.
<form>
<group>
...
<newline/>
...
</group>
</form>
Можлива структура та представлення її рендерингу
<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
''
Можлива структура та представлення її рендерингу
<form>
<group>
<FIELD/>
<separator string="Title 1"/>
<FIELD/>
<group>
<FIELD/>
<separator string="Title 2"/>
<FIELD/>
</group>
<group>
<FIELD/>
<FIELD/>
</group>
</group>
</form>
|
Порада
Елемент separator можна використовувати для візуального розділення елементів в межах одного внутрішнього елемента group, зберігаючи при цьому їх горизонтальне вирівнювання.
Контейнер заголовка¶
Контейнер елементів 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
Назва додатку.
- вимога
Обов’язкове
- тип
- name
Технічна назва додатку (назва модуля).
- вимога
Обов’язкове
- тип
- logo
relative path до логотипу.
- вимога
Необов’язково
- тип
- Default
Шлях, обчислений за допомогою атрибута
name:/name/static/description/icon.png
- groups
Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом
!.Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- вимога
Необов’язково
- тип
- 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>
- вимога
Необов’язково
- тип
- Default
False
block: оголошення групи налаштувань¶
Елемент block використовується для оголошення групи налаштувань. Ця група може мати заголовок та опис.
<form>
<app string="NAME" name="TECHNICAL_NAME">
...
<block title="TITLE">
...
</block>
...
</app>
</form>
Елемент block може мати такі атрибути:
- title
Назва блоку налаштувань. Можна шукати за його значенням.
- вимога
Необов’язково
- тип
- Default
''
- help
Опис блоку налаштувань. Можна шукати за його значенням.
- вимога
Необов’язково
- тип
- Default
''
- groups
Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом
!.Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- вимога
Необов’язково
- тип
- 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>
- вимога
Необов’язково
- тип
- 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 це налаштування використовується для позначення веб-сайту, до якого застосовуються інші налаштування. Налаштування заголовка візуально представлене як банер у верхній частині екрана.- вимога
Необов’язково
- тип
- Default
''
- string
Текст, що використовується як підпис налаштування.
- вимога
Необов’язково
- тип
- Default
Мітка першого поля
- title
Текст, що використовується як підказка.
- вимога
Необов’язково
- тип
- Default
''
- help
Опис налаштування. Цей текст відображається одразу під міткою налаштування (з класом
text-muted).- вимога
Необов’язково
- тип
- Default
''
- company_dependent
Чи стосується налаштування лише компанії. Якщо встановлено, поруч із міткою налаштування відображається значок.
Він приймає лише значення
'1'.- вимога
Необов’язково
- тип
- 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"/>
- вимога
Необов’язково
- тип
- 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>
- вимога
Необов’язково
- тип
- Default
False
Список¶
Кореневим елементом представлень списку є tree1.
Можлива структура та представлення її рендерингу
<tree>
...
</tree>
|
Кореневі атрибути¶
До кореневого елемента tree можна додати додаткові атрибути для налаштування представлення.
- string
Заголовок представлення. Він відображається лише тоді, коли ви відкриваєте дію, яка не має назви та метою якої є
new(відкриття діалогового вікна).- вимога
Необов’язково
- тип
- Default
''
- create
Вимкнути/увімкнути створення записів у представленні.
- вимога
Необов’язково
- тип
- Default
True
- edit
Вимкнути/увімкнути редагування записів у представленні.
- вимога
Необов’язково
- тип
- Default
True
- delete
Вимкнути/увімкнути видалення записів у представленні через випадаюче меню Дія.
- вимога
Необов’язково
- тип
- Default
True
- import
Вимкнути/увімкнути імпорт записів з даних у поданні.
- вимога
Необов’язково
- тип
- Default
True
- export_xlsx
Вимкнути/увімкнути експорт записів до даних у представленні.
- вимога
Необов’язково
- тип
- Default
True
- editable
Зробіть записи представлення доступними для редагування на місці та дозвольте створення нових записів з рядка списку. Може мати два різних значення:
- top
Нові записи створюються з початку списку.
- bottom
Нові записи створюються знизу списку.
Архітектура вбудованого представлення форма походить від представлення списку. Таким чином, більшість атрибутів, дійсних для полів і кнопок представлення форми, приймаються представленнями списків, хоча вони можуть не мати жодного значення, якщо представлення списку не редагується.
Важливо
Ця поведінка вимкнена, якщо атрибут
editвстановлено наFalse.- вимога
Необов’язково
- тип
- Default
''
- multi_edit
Активуйте функцію мульти-редагування, яка дозволяє оновлювати поле до однакового значення для кількох записів одночасно.
Він приймає лише значення
'1'.- вимога
Необов’язково
- тип
- Default
''
- open_form_view
Відобразити кнопку в кінці кожного рядка, щоб відкрити запис у представленні форми.
Це не має жодного ефекту, якщо представлення не можна редагувати.
- вимога
Необов’язково
- тип
- Default
False
- default_group_by
Назва поля, за яким записи мають бути згруповані за замовчуванням, якщо групування не вказано через дію або поточний пошук.
- вимога
Необов’язково
- тип
- Default
''
- default_order
Список назв полів, розділених комами, який замінює порядок, визначений у моделі за допомогою атрибута
_order.Щоб інвертувати порядок сортування поля, додайте до нього постфікс
desc, розділений пробілом.Example
<tree default_order="sequence,name desc"> ... </tree>
- вимога
Необов’язково
- тип
- Default
''
- decoration-<style>
Стиль, який слід застосовувати до рядків відповідних записів, як вираз Python, що повертає логічне значення.
<style>потрібно замінити наbf(жирний шрифт),it(курсив),info,warning,danger,muted,primaryабоsuccess.Example
<tree decoration-danger="field_qty > field_limit"> ... </tree>
- вимога
Необов’язково
- тип
- Default
False
- limit
Розмір сторінки за замовчуванням. Він має бути суворо додатним.
- вимога
Необов’язково
- тип
- Default
80для списків,40для списків X2many у формах
- groups_limit
Кількість груп на сторінці за замовчуванням, коли згруповано представлення списку. Вона має бути суворо додатним числом.
- вимога
Необов’язково
- тип
- Default
80для списків,40для списків X2many у формах
- expand
Чи слід відкривати перший рівень груп за замовчуванням під час групування списку.
Попередження
Це може бути повільно, залежно від кількості груп.
- вимога
Необов’язково
- тип
- Default
False
- sample
Чи слід заповнювати представлення набором зразків записів, якщо для поточної моделі не знайдено жодного.
Ці фальшиві записи мають евристику для певних назв/моделей полів. Наприклад, поле
display_nameу моделіres.usersбуде заповнено іменами людей-прикладів, тоді як полеemailматиме формат[email protected].Користувач не може взаємодіяти з цими даними, і вони будуть видалені, щойно буде виконано дію (створено запис, додано стовпець тощо).
- вимога
Необов’язково
- тип
- 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> """ }
- вимога
Необов’язково
- тип
- Default
''
Компоненти¶
Спискові представлення приймають такі дочірні елементи: поле, кнопка, групувати по, хедер, контроль та створення.
Заповнювачі позначені великими літерами.
field: відображати значення полів¶
Елемент field відображає (і, можливо, дозволяє редагувати) одне поле всіх поточних записів як колонка.
Використання одного й того самого поля кілька разів у списку не підтримується
<tree>
<field name="FIELD_NAME"/>
</tree>
Елемент field може мати такі атрибути:
- name
Назва поля для відображення.
- вимога
Обов’язкове
- тип
- string
Мітка поля.
- вимога
Необов’язково
- тип
- Default
Атрибут
stringполя моделі
- optional
Зробіть видимість поля необов’язковою. Стовпець поля можна приховати або показати за допомогою кнопки в заголовку представлення.
Він може мати два різних значення:
- show
Поле відображається за замовчуванням.
- hide
За замовчуванням поле приховане.
Example
<field name="fname_a" optional="show"/> <field name="fname_b" optional="hide"/>
- вимога
Необов’язково
- тип
- readonly
Чи може поле бути змінене користувачем (
False), чи воно доступне лише для читання (True), як вираз Python, який обчислюється як логічне значення.Example
<field name="fname_a" readonly="True"/> <field name="fname_b" readonly="name_a in [fname_b, parent.fname_d]"/>
- вимога
Необов’язково
- тип
- Default
False
- required
Чи можна залишити поле порожнім (
False), чи його потрібно встановити (True) як вираз Python, який повертає логічне значення.Example
<field name="fname_a" required="True"/> <field name="fname_b" required="fname_c != 3"/>
- вимога
Необов’язково
- тип
- 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>
- вимога
Необов’язково
- тип
- 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')"/>
- вимога
Необов’язково
- тип
- Default
False
- groups
Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом
!.Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- вимога
Необов’язково
- тип
- 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'"/>
- вимога
Необов’язково
- тип
- 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>
- вимога
Необов’язково
- тип
- Default
''
- sum, avg
Агрегація, яку потрібно відобразити внизу колонки. Агрегація обчислюється лише для записів, які наразі відображаються. Операція агрегації має відповідати
group_operatorвідповідного поля.Example
<field name="sent" sum="Total" /> <field name="clicks_ratio" avg="Average"/>
- вимога
Необов’язково
- тип
- Default
''
- width
Ширина, яка застосовується до колонки поля, коли у списку немає записів, у вигляді абсолютної ширини (наприклад,
100px).Важливо
Ширина встановлюється веб-клієнтом, коли у списку є записи.
- вимога
Необов’язково
- тип
- Default
''
- nolabel
Чи має заголовок колонки поля залишатися порожнім. Якщо встановлено, стовпець не буде сортуватися.
Приймає лише значення
'1'- вимога
Необов’язково
- тип
- Default
''
Примітка
Коли список групується, числові поля агрегуються та відображаються для кожної групи. Також, якщо в групі забагато записів, праворуч від рядка групи з’являється пейджер. З цієї причини небажано розміщувати числове поле в останній колонцці, коли список знаходиться в ситуації, коли його можна згрупувати. Однак це не створює проблеми для полів X2many у представленні форми, оскільки їх не можна згрупувати.
Можлива структура та представлення її рендерингу
<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>
|
groupby: визначення заголовків груп¶
Елемент groupby використовується для визначення заголовків груп за допомогою елементів кнопка під час групування записів за полями Many2one. Він також приймає елементи поле, які можна використовувати для модифікаторів. Таким чином, ці поля належать до комоделі Many2one. Ці додаткові поля вибираються пакетно.
<tree>
...
<groupby name="FIELD_NAME">
<BUTTONS/>
<FIELDS/>
</groupby>
</tree>
Елемент groupby може мати такі атрибути:
- name
Назва поля
Many2oneдля використання як заголовок.Для відкриття форми поля Many2one можна визначити спеціальний елемент кнопка з
type="edit".- вимога
Обов’язкове
- тип
Можлива структура та представлення її рендерингу
<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 використовуються лише для отримання та зберігання значення, але вони ніколи не відображаються.
Пошук¶
Види пошуку відрізняються від інших типів видів тим, що вони не використовуються для відображення вмісту. Хоча вони застосовуються до певної моделі, вони використовуються для фільтрації вмісту іншого виду (зазвичай агрегованих видів; наприклад, Список та Графік).
Коренним елементом представлень пошуку є search.
Воно не потребує жодних атрибутів.
Можлива структура та представлення її рендерингу
<search>
...
</search>
|
Компоненти¶
Представлення пошуку приймають такі дочірні елементи: поле, фільтр, роздільник, група та пошукова панель.
Заповнювачі позначені великими літерами.
field: фільтр на основі значень полів¶
Елемент field визначає домени або контексти зі значеннями, наданими користувачем. Під час генерації доменів пошуку, домени полів об’єднуються один з одним та з фільтрами за допомогою оператора І.
<search>
<field name="FIELD_NAME"/>
</search>
Елемент field може мати такі атрибути:
- name
Назва поля, за яким потрібно фільтрувати.
- вимога
Обов’язкове
- тип
- string
Мітка поля.
- вимога
Необов’язково
- тип
- Default
Атрибут
stringполя моделі
- operator
За замовчуванням поля генерують домени виду
[(name, operator, value)], деname– це назва поля, аvalue– це значення, надане користувачем, можливо, відфільтроване або перетворене (наприклад, користувач має надати мітку значення поля вибору, а не саме значення).Атрибут
operatorдозволяє перевизначити оператор за замовчуванням, який залежить від типу поля (наприклад,=для полів типу float, алеilikeдля полів типу char таchild_ofдля many2one).- вимога
Необов’язково
- тип
- Default
=
- filter_domain
Домен, який використовуватиметься як домен пошуку поля, як вираз Python, що обчислюється як домен.
Він може використовувати змінну
selfдля вставки наданого значення в користувацький домен. Це можна використовувати для створення значно гнучкіших доменів, ніж з використанням лише атрибутаoperator(наприклад, пошук по кількох полях одночасно).Якщо надано обидва атрибути
operatorтаfilter_domain, пріоритет маєfilter_domain.- вимога
Необов’язково
- тип
- Default
[]
- context
Контекст для об’єднання з контекстом представлення, на яке спрямоване представлення пошуку, як вираз Python, який обчислюється як словник.
Він може містити значення, надані користувачем, які доступні у змінній
self.- вимога
Необов’язково
- тип
- Default
{}
- domain
Фільтри, що застосовуються до результатів автозаповнення для полів, що дозволяють автозаповнення (наприклад,
Many2one).- вимога
Необов’язково
- тип
- Default
[]
- groups
Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом
!.Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- вимога
Необов’язково
- тип
- 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>
- вимога
Необов’язково
- тип
- Default
False
Можлива структура та представлення її рендерингу
<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
Технічна назва фільтра. Її можна використовувати для увімкнено за замовчуванням або як перехоплювач успадкування.
- вимога
Обов’язкове
- тип
- string
Мітка фільтра.
- вимога
Обов’язкове
- тип
- help
Підказка, що відображається під час наведення курсора на фільтр.
- вимога
Необов’язково
- тип
- Default
''
- domain
Домен, який потрібно додати до домену дії як частину домену пошуку.
- вимога
Необов’язково
- тип
- Default
[]
- date
Назва поля
dateабоdatetimeдля фільтрації.При використанні цей атрибут створює набір фільтрів, доступних у підменю меню Фільтри. Доступні фільтри залежать від часу, але не є динамічними в тому сенсі, що їхні домени оцінюються під час створення екземпляра панелі керування.
Example
<filter string="Creation Date" name="filter_create_date" date="create_date"/>
- вимога
Необов’язково
- тип
- 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"/>
- вимога
Необов’язково
- тип
- 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>
- вимога
Необов’язково
- тип
- Default
False
- groups
Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом
!.Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- вимога
Необов’язково
- тип
- 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.- вимога
Необов’язково
- тип
- Default
{}
Застереження
Послідовності фільтрів (без розділяючих їх елементів, що не є фільтрами) обробляються як інклюзивно складені: вони будуть складені за допомогою оператора `` , а не звичайного `AND.
Example
<filter domain="[('state', '=', 'draft')]"/>
<filter domain="[('state', '=', 'done')]"/>
Відображаються записи, поле state яких має значення draft або done.
Example
<filter domain="[('state', '=', 'draft')]"/>
<separator/>
<filter domain="[('delay', '<', 15)]"/>
Записи, у яких значення в полі state має значення draft і значення в полі delay менше 15.
Можлива структура та представлення її рендерингу
<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
Назва поля, за яким потрібно фільтрувати.
- вимога
Обов’язкове
- тип
- string
Мітка поля.
- вимога
Необов’язково
- тип
- Default
Атрибут
stringполя моделі
- select
Поведінка та відображення поля. Воно може мати два різних значення:
- one
Можна вибрати щонайбільше одне значення. Підтримувані типи полів:
many2oneтаselection.
- multi
Можна вибрати кілька значень. Підтримувані типи полів:
many2one,many2manyтаselection.
- вимога
Необов’язково
- тип
- Default
one
- groups
Список груп користувачів, розділених комами, яким відображається елемент. Користувачі, які не належать хоча б до однієї з цих груп, не можуть бачити елемент. Групи можна виключити з попереднього пункту з від’ємним символом
!.Example
<field name="FIELD_NAME" groups="base.group_no_one,!base.group_multi_company"/>
- вимога
Необов’язково
- тип
- Default
''
- icon
Значок поля.
- вимога
Необов’язково
- тип
- Default
''
- color
Колір поля.
- вимога
Необов’язково
- тип
- Default
''
Коли елемент field має встановлений атрибут select=one, він може мати такі додаткові атрибути:
- hierarchize
Чи дочірні категорії повинні відображатися під батьківською категорією чи на тому ж рівні ієрархії.
Коли елемент field має встановлений атрибут select=multi, він може мати такі додаткові атрибути:
- enable_counters
Чи обчислюються та відображаються лічильники записів, якщо вони не дорівнюють нулю.
Порада
Цей атрибут існує для того, щоб уникнути впливу на продуктивність. Інший спосіб вирішення проблем із продуктивністю – перевизначити методи
search_panel_select_rangeтаsearch_panel_select_multi_range.- вимога
Необов’язково
- тип
- Default
False
- expand
Чи слід відображати категорії та фільтри без записів.
- вимога
Необов’язково
- тип
- Default
False
- limit
Максимальна кількість значень для отримання для поля. Якщо досягнуто ліміту, на панелі пошуку значення не відображатимуться, а натомість з’являтиметься повідомлення про помилку. Якщо встановлено значення 0, будуть отримані всі значення.
- вимога
Необов’язково
- тип
- Default
200
- domain
Умови, яким повинні відповідати записи.
Example
<searchpanel> <field name="department_id"/> <field name="manager_id" select="multi" domain="[('department_id', '=', department_id)]"/> </searchpanel>
- вимога
Необов’язково
- тип
- Default
[]
Пошук за умовчанням¶
Поля пошуку та фільтри можна налаштувати через 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.
Можлива структура та представлення її рендерингу
<kanban>
...
</kanban>
|
Примітка
Канбан-представлення завантажують та відображають максимум десять стовпців. Будь-який наступний стовпець закривається, але користувач все ще може його відкрити.
Кореневі атрибути¶
До кореневого елемента kanban можна додати додаткові атрибути для налаштування представлення.
- string
Заголовок представлення. Він відображається лише тоді, коли ви відкриваєте дію, яка не має назви та метою якої є
new(відкриття діалогового вікна).- вимога
Необов’язково
- тип
- Default
''
- create
Вимкнути/увімкнути створення записів у представленні.
- вимога
Необов’язково
- тип
- Default
True
- edit
Вимкнути/увімкнути редагування записів у представленні.
- вимога
Необов’язково
- тип
- Default
True
- delete
Вимкнути/увімкнути видалення записів у представленні через випадаюче меню Дія.
- вимога
Необов’язково
- тип
- Default
True
- default_group_by
Назва поля, за яким записи мають бути згруповані за замовчуванням, якщо групування не вказано через дію або поточний пошук.
- вимога
Необов’язково
- тип
- Default
''
- default_order
Список назв полів, розділених комами, який замінює порядок, визначений у моделі за допомогою атрибута
_order.Щоб інвертувати порядок сортування поля, додайте до нього постфікс
desc, розділений пробілом.Example
<tree default_order="sequence,name desc"> ... </tree>
- вимога
Необов’язково
- тип
- Default
''
- class
Додайте HTML-класи до кореневого HTML-елементу представлення.
- вимога
Необов’язково
- тип
- Default
''
- examples
Ключ у реєстрі прикладів
KanbanExamplesRegistry, який можна переглядати під час створення нового стовпця у згрупованому представленні канбану.Перегляньте також
- вимога
Необов’язково
- тип
- Default
''
- group_create
Чи видима панель Додати новий стовпець.
- вимога
Необов’язково
- тип
- Default
True
- group_delete
Чи можна видаляти стовпці через меню шестерень.
- вимога
Необов’язково
- тип
- Default
True
- group_edit
Чи можна редагувати стовпці через меню шестерень.
- вимога
Необов’язково
- тип
- Default
True
- groups_draggable
Чи можна змінювати порядок стовпців.
- вимога
Необов’язково
- тип
- Default
True
- records_draggable
Чи можна перетягувати записи, коли канбан-представлення згруповано.
- вимога
Необов’язково
- тип
- Default
True
- archivable
Чи можна архівувати та розархівувати записи, що належать до стовпця, коли в моделі визначено поле
active.- вимога
Необов’язково
- тип
- Default
True
- quick_create
Чи має бути можливість створювати записи без перемикання у представленні форми.
- вимога
Необов’язково
- тип
- Default
True, коли канбан-представлення згруповано за полями типу many2one, selection, char або boolean, інакшеFalse
- quick_create_view
Посилання на представлення форма, яке потрібно відкрити під час використання швидкого створення записів.
- вимога
Необов’язково
- тип
- Default
''
- on_create
Спеціальна дія, яка викликається при натисканні на Створити.
Якщо встановлено значення
'quick_create', використовується швидке створення записів. Якщо швидке створення вимкнено, викликається стандартна дія створення.- вимога
Необов’язково
- тип
- Default
''
- sample
Чи слід заповнювати представлення набором зразків записів, якщо для поточної моделі не знайдено жодного.
Ці фальшиві записи мають евристику для певних назв/моделей полів. Наприклад, поле
display_nameу моделіres.usersбуде заповнено іменами людей-прикладів, тоді як полеemailматиме формат[email protected].Користувач не може взаємодіяти з цими даними, і вони будуть видалені, щойно буде виконано дію (створено запис, додано стовпець тощо).
- вимога
Необов’язково
- тип
- 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> """ }
- вимога
Необов’язково
- тип
- Default
''
Компоненти¶
Представлення Канбан приймають такі дочірні елементи: поле, хедер, індикатор прогресу та шаблони.
Заповнювачі позначені великими літерами.
field: відображати значення полів¶
Елемент field оголошує поля для використання в шаблони. Якщо поле просто відображається, його не потрібно попередньо оголошувати.
<kanban>
<field name="FIELD_NAME"/>
...
</kanban>
Елемент field може мати такі атрибути:
- name
Назва поля для відображення.
- вимога
Обов’язкове
- тип
Можлива структура та представлення її рендерингу
<kanban>
<templates>
<t t-name="kanban-box">
<div>
<field name="name"/>
</div>
</t>
</templates>
</kanban>
|
progressbar: показувати індикатори прогресу над стовпцями¶
Елемент progressbar використовується для визначення індикатора прогресу, який відображатиметься над стовпцями канбану.
<kanban>
<progressbar field="FIELD_NAME"/>
...
</kanban>
Елемент progressbar може мати такі атрибути:
- field
Назва поля, на якому базуються підгрупи індикатора виконання.
- вимога
Обов’язкове
- тип
- colors
Зіставлення значень полів індикатора виконання зі значеннями кольорів
muted,success,warningтаdanger.- вимога
Обов’язкове
- тип
- sum_field
Назва поля, яке буде використано в сумі, що відображається поруч із індикатором прогресу. Якщо не встановлено, замість цього відображається загальна кількість записів.
- вимога
Необов’язково
- тип
- Default
''
Можлива структура та представлення її рендерингу
<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.- тип
- record
Об’єкт з усіма запитуваними полями як його атрибутами. Кожне поле має два атрибути:
valueтаraw_value. Перший відформатовано відповідно до поточних параметрів користувача, тоді як другий є необробленим значенням зread()(за винятком полівdateтаdatetime, які відформатовані відповідно до локалі користувача).- тип
- context
Поточний контекст поширюється або з дії, яка відкриває представлення канбана, або з поля one2many чи many2many, яке вбудовує представлення канбана у представлення форми.
- тип
- read_only_mode
- тип
- selection_mode
Чи відкривається представлення канбан при виборі поля many2one або many2many в мобільному середовищі.
- тип
Хоча більшість шаблонів канбану є стандартними шаблони 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>, що несе клас CSSo_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-viewqweb_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].Користувач не може взаємодіяти з цими даними, і вони будуть видалені, щойно буде виконано дію (створено запис, додано стовпець тощо).
- вимога
Необов’язково
- тип
- 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].Користувач не може взаємодіяти з цими даними, і вони будуть видалені, щойно буде виконано дію (створено запис, додано стовпець тощо).
- вимога
Необов’язково
- тип
- 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()можна використовувати для отримання деякої мета-інформації. Ці методи також доступні безпосередньо в контексті шаблону, і до них не потрібно звертатися черезwidgetrecordоб’єкт з усіма запитаними полями як його атрибутами. Кожне поле має два атрибути
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].Користувач не може взаємодіяти з цими даними, і вони будуть видалені, щойно буде виконано дію (створено запис, додано стовпець тощо).
- вимога
Необов’язково
- тип
- Default
False
Сітка¶
Enterprise featureОбмеження¶
Це представлення перебуває в процесі розробки та, можливо, потребуватиме розширення або зміни.
протестовано лише поля стовпця
date,selectionтаmany2oneномінально реалізовані та підтримуються, але не були протестовані,datetimeвзагалі не реалізовано.клітинки стовпців важко налаштувати та мають бути числовими
коригування комірок вимкнено за замовчуванням і його потрібно налаштувати, щоб його ввімкнути
Метадані ACL
create,editтаdeleteне встановлюються автоматично в кореневому каталозі представлення через обмеження в пост-обробціfields_view_get(існує фіксований явний список типів представлень, які отримують ці атрибути)
Схема¶
Представлення сітки має власну схему та додаткову перевірку в цьому модулі. Архітектура представлення така:
<grid>(1)кореневий елемент архітектури
обов’язковий атрибут
stringнеобов’язкові атрибути
create,editтаdeleteнеобов’язкові атрибути
adjustmentтаadjust_nameadjustmentможе бути абоobject, абоaction, щоб вказати, чи слід виконувати коригування комірки через виклик методу чи виконання дії.adjust_nameнадає відповідно назву методу та id дії.В обох випадках параметри коригування надаються як член контексту
grid_adjust, у випадкуobjectпараметри також надаються як параметри позиційної функції (поруч із порожнім списком ідентифікаторів):row_domainдомен, що відповідає всьому рядку скоригованої комірки
column_fieldназва стовпця для скоригованої комірки
column_valueзначення стовпця для скоригованої комірки
cell_fieldполе вимірювання скоригованої комірки
changeрізниця між старим значенням комірки та скоригованим може бути позитивною або негативною
необов’язкові атрибути
hide_line_totalтаhide_column_totalhide_line_totalвстановити значення true, щоб приховати рядок підсумку (за замовчуванням false)
hide_column_totalвстановити значення true, щоб приховати стовпець підсумок (за замовчуванням false)
необов’язковий атрибут
barchart_totalbarchart_totalвстановіть
true, щоб відобразити стовпчасту діаграму внизу сітки на основі сум стовпців (за замовчуванням false).
необов’язкові атрибути
create_inlineтаdisplay_emptycreate_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_rangestringпідпис кнопки діапазону (видимий користувачеві)
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_currentTrue, якщо поточний стовпець має бути чітко окреслений у сітці, інакшеFalseformatяк відформатувати значення цього стовпця/типу з форматування
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):dayweekmonthyear
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].Користувач не може взаємодіяти з цими даними, і вони будуть видалені, щойно буде виконано дію (створено запис, додано стовпець тощо).
- вимога
Необов’язково
- тип
- 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.partnermany2one. Якщо не вказано, представлення вдається створити порожню карту.default_orderЯкщо поле надано, представлення замінює порядок моделі за замовчуванням. Поле має бути частиною моделі, до якої застосовується представлення, а не з
res.partner.routingякщо
1відображає маршрути між записами. Для представлення потрібен дійсний токен MapBox та щонайменше два знайдені записи (тобто записи маютьres.partnermany2one, а партнер має адресу або дійсні координати).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>