Представлення¶
Представлення - це те, що визначає, як записи мають відображатися кінцевим користувачам. Вони вказані в XML, що означає, що їх можна редагувати незалежно від моделей, які вони представляють. Вони гнучкі та забезпечують високий рівень налаштування екранів, якими вони керують. Існують різні види поглядів. Кожен з них представляє режим візуалізації: форма, список, канбан тощо.
Основна структура¶
Базові представлення зазвичай мають спільну структуру, визначену нижче. Заповнювачі позначаються великими літерами.
<record id="MODEL_view_TYPE" model="ir.ui.view">
<field name="name">NAME</field>
<field name="model">MODEL</field>
<field name="arch" type="xml">
<VIEW_TYPE>
<VIEW_SPECIFICATIONS/>
</VIEW_TYPE>
</field>
</record>
Поля¶
Об’єкти представлення відображають кілька полів. Вони необов’язкові, якщо не зазначено інше.
name
(обов’язковий) -Char
Корисно лише як мнемоніка/опис представлення, коли шукаєте його в певному списку.
model
Char
Модель, пов’язана з представленням, якщо застосовно.
priority
Integer
Коли
(модель, тип)
запитує представлення, буде повернуто представлення, яке відповідає моделі та типу, з найнижчим пріоритетом (це представлення за замовчуванням).Він також визначає порядок застосування представлень під час переглянути успадкування.
groups_id
Many2many
->odoo.addons.base.models.res_users.Groups
Групи, яким дозволено використовувати/доступ до поточного перегляду.
Якщо подання розширює існуюче подання, розширення буде застосовано лише для певного користувача, якщо він має доступ до наданого
groups_id
.arch
Text
Опис макета перегляду.
Атрибути¶
Різні типи представлення мають широкий набір атрибутів, що дозволяє налаштовувати загальну поведінку. Деякі основні атрибути будуть пояснені тут. Не всі вони впливають на всі типи представлень.
Примітка
Поточний контекст і права доступу користувача також можуть впливати на можливості перегляду.
create
Вимкнути/увімкнути створення записів у представленні.
edit
(form
&list
&gantt
)Вимкнути/ввімкнути редагування запису в представленні.
delete
(form
&list
)Вимкніть/увімкніть видалення запису у представленні через спадне меню Дія.
duplicate
(form
)Вимкніть/увімкніть дублювання запису в представленні за допомогою спадного меню Дія.
decoration-{$name}
(list
&gantt
)Визначити умовне відображення запису в стилі тексту рядка на основі атрибутів відповідного запису.
Значення є виразами Python. Для кожного запису вираз обчислюється з атрибутами запису як контекстними значеннями, і якщо
true
, до рядка застосовується відповідний стиль. Ось деякі інші значення, доступні в контексті:uid
: id поточного користувача,today
: поточна місцева дата у вигляді рядкаYYYY-MM-DD
,now
: те саме, щоtoday
з додаванням поточного часу. Це значення має форматYYYY-MM-DD hh:mm:ss
.
<tree decoration-info="state == 'draft'" decoration-danger="state == 'help_needed'" decoration-bf="state='busy'"> <TREE_VIEW_CONTENT> </tree>
Попередження
Підтримувані значення відрізняються для двох типів перегляду. Перегляд Gantt підтримує лише відображення
success
,info
,warning
,danger
таsecondary
. Перегляд списку підтримуєbf
,it
,success
,info
,warning
,danger
,muted
іprimary
відображається.sample
(kanban
&list
&gantt
&graph
&pivot
&cohort
&dashboard
)Заповніть подання набором зразків записів, якщо для поточної моделі не знайдено жодного. За замовчуванням цей атрибут має значення false.
Ці підроблені записи матимуть евристику для певних імен/моделей полів. Наприклад, поле „display_name“ у моделі „res.users“ буде заповнено зразками імен людей, тоді як поле „email“ матиме форму „firstname.lastname@sample.demo“.
Користувач не зможе взаємодіяти з цими даними, і вони будуть видалені, щойно буде виконана дія (створено запис, додано стовпець тощо)
banner_route
адреса маршруту, яку потрібно отримати та додати до перегляду.Якщо цей атрибут встановлено, controller route url буде отримано та відображено над поданням. Відповідь json від контролера має містити ключ «html».
Якщо HTML містить тег <link> таблиці стилів, його буде видалено та додано до <head>.
Для взаємодії з бекендом можна використовувати теги <a type=»action»>. Будь ласка, перегляньте документацію методу _onActionClicked AbstractController (addons/web/static/src/js/views/abstract_controller.js), щоб дізнатися більше.
Тільки представлення, що розширюють AbstractView та AbstractController, можуть використовувати цей атрибут, наприклад Форма, Канбан, Список, …
Приклад:
<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> """ }
Спадкування¶
Поля успадкування¶
Два наступних поля View
використовуються для визначення успадкованих представлень.
inherit_id
Many2one
батьківське представлення поточного представлення, не встановлено за замовчуванням. Вкажіть батьківського елемента за допомогою атрибута
ref
:<field name="inherit_id" ref="library.view_book_form"/>
mode
Selection
:extension / primary
режим успадкування,
extension
за замовчуванням, якщоinherit_id
встановлено,primary
інакше.Прикладом того, де ви бажаєте перевизначити
mode
під час використанняinherit_id
, є успадкування делегування. У такому випадку ваша похідна модель буде окремою від батьківської, і представлення, що збігаються з одним, не збігатимуться з іншим. Припустімо, ви успадкували від представлення, пов’язаного з батьківською моделлю, і хочете налаштувати похідне подання, щоб відображати дані з похідної моделі.Mode
похідного перегляду має бути встановлений наprimary
, тому що це базове (і, можливо, єдине) подання для цієї похідної моделі. Інакше правила перегляду зіставлення не застосовуватимуться.
Переглянути зіставлення¶
якщо представлення запитується
(модель, тип)
, перегляд з правильною моделлю та типом,mode=primary
і найнижчим пріоритетом буде відповідати.коли представлення запитується
id
, якщо його режим неprimary
, його closest батьківський елемент з режимомprimary
відповідає.
Роздільна здатність перегляду¶
Роздільна здатність генерує остаточну arch
для запитуваного/відповідного primary
представлення:
якщо представлення має батьківського елемента, він повністю вирішений, тоді застосовуються специфікації успадкування поточного представлення
якщо представлення не має батьківського елемента, його
arch
використовується як єшукаються дочірні елементи поточного представлення з режимом
extension
, і їх специфікації успадкування застосовуються спочатку в глибину (застосовується дочірнє представлення, потім його дочірні елементи, а потім його брати та сестри)
Результат застосування дочірніх представлень дає кінцеву arch
Специфікації успадкування¶
Специфікації успадкування складаються з покажчика елементів, щоб відповідати успадкованому елементу в батьківському поданні, і дочірнього елемента, який використовуватиметься для зміни успадкованого елемента.
Існує три типи локаторів елементів для відповідності цільовому елементу:
Елемент
xpath
з атрибутомexpr
.expr
- це XPath expression1, застосований до поточноїarch
, перший вузол, який він знаходить, є збігомелемент
field
з атрибутомname
, відповідає першомуfield
з тим жеname
. Усі інші атрибути ігноруються під час зіставленнябудь-який інший елемент: збігається перший елемент з такою ж назвою та ідентичними атрибутами (без урахування атрибутів
position
іversion
)
<xpath expr="page[@name='pg']/group[@name='gp']/field" position="inside">
<field name="description"/>
</xpath>
<field name="res_id" position="after"/>
<div name="name" position="replace">
<div name="name2">
<field name="name2"/>
</div>
</div>
Специфікація успадкування може мати додатковий атрибут position
, що вказує, як має бути змінений відповідний вузол:
inside
(за замовчуванням)вміст специфікації успадкування додається до відповідного вузла
replace
вміст специфікації успадкування замінює відповідний вузол. Будь-який текстовий вузол, що містить лише
$0
у вмісті специфікації, буде замінено повною копією відповідного вузла, фактично обгортаючи відповідний вузол.after
вміст специфікації успадкування додається до батьківського вузла відповідного вузла після відповідного вузла
before
вміст специфікації успадкування додається до батьківського вузла відповідного вузла після відповідного вузла
attributes
вміст специфікації успадкування має бути елементами
attribute
з атрибутомname
і необов’язковим тілом:якщо елемент
attribute
має тіло, новий атрибут, названий за йогоname
, створюється на відповідному вузлі з текстом елементаattribute
як значенняякщо елемент
attribute
не має тіла, атрибут, названий за йогоname
, видаляється з узгодженого вузла. Якщо такий атрибут не існує, виникає помилка
<field name="sale_information" position="attributes"> <attribute name="invisible">0</attribute> <attribute name="attrs"> {'invisible': [('sale_ok', '=', False)], 'readonly': [('editable', '=', False)]} </attribute> </field>
move
може використовуватися як прямий дочірній елемент специфікації успадкування з атрибутом
inside
,replace
,after
абоbefore
position
атрибут для переміщення вузла.<xpath expr="//@target" position="after"> <xpath expr="//@node" position="move"/> </xpath> <field name="target_field" position="after"> <field name="my_field" position="move"/> </field>
Специфікації перегляду застосовуються послідовно.
- 1
функція розширення додана для простішого зіставлення у представленнях QWeb:
hasclass(*classes)
збігається, якщо контекстний вузол має всі вказані класи
Типи представлення¶
Активність¶
Перегляд Активність використовується для відображення активності, пов’язаних із записами. Дані відображаються на діаграмі із записами, які утворюють рядки, а типи дій – стовпцями. У першій комірці кожного рядка відображається картка (яка налаштовується, див. templates
, дуже схожа на Канбан), яка представляє відповідний запис. При натисканні на інші комірки відображається детальний опис усіх дій того самого типу для запису.
Попередження
Перегляд активності доступний, лише коли встановлено модуль mail
, а також для моделей, які успадковують mail.activity.mixin
.
Кореневим елементом представлення активності є <activity>
, він приймає такі атрибути:
string
(обов’язковий)Заголовок, який повинен описувати вигляд
Можливі нащадки елемента view:
field
оголошує поля для використання в logic активності. Якщо поле просто відображається у вікні активності, його не потрібно попередньо декларувати.
Можливі атрибути:
name
(обов’язково)назва поля для отримання
templates
визначає шаблони Шаблони QWeb. Визначення карток можна розділити на кілька шаблонів для ясності, але представлення активності повинні визначати принаймні один кореневий шаблон
activity-box
, який буде відтворено один раз для кожного запису.Перегляд активності використовує здебільшого стандартний javascript qweb і надає наступні контекстні змінні (див. Канбан для отримання додаткової інформації):
widget
поточний
ActivityRecord()
можна використовувати для отримання деякої мета-інформації. Ці методи також доступні безпосередньо в контексті шаблону, і до них не потрібно звертатися черезwidget
record
об’єкт з усіма запитаними полями як його атрибутами. Кожне поле має два атрибути
value
іraw_value
Календар¶
Календар переглядає записи як події в щоденному, тижневому, місячному або річному календарі. Їх кореневим елементом є <calendar>
. У представленні календаря доступні такі атрибути:
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_add
enables quick-event creation on click: only asks the user for a
name
and tries to create a new event with just that and the clicked event time. Falls back to a full form dialog if the quick creation failsall_day
назва логічного поля в записі, яке вказує, чи позначено відповідну подію як денну (і тривалість не має значення)
mode
Режим відображення за замовчуванням під час завантаження календаря. Можливі атрибути:
день
,тиждень
,місяць
,рік
scales
Розділений комами список шкал, які потрібно надати. За замовчуванням доступні всі масштаби. Перегляньте режим для можливих значень масштабу.
create
,delete
дозволяє вимкнути відповідну дію в поданні, встановивши для відповідного атрибута значення
false
<field>
оголошує поля для агрегування або використання в logic канбану. Якщо поле просто відображається в календарних картках.
Поля можуть мати додаткові атрибути:
invisible
використовуйте «True», щоб приховати значення в картках
avatar_field
лише для поля x2many, щоб відображати аватар замість display_name у картках
write_model
таwrite_field
можна додати фільтр і зберегти результат у визначеній моделі, фільтр додається в бічній панелі
filters
іcolor
використовуйте «True», щоб додати це поле у фільтр на бічній панелі. Ви можете вказати поле
color
для розфарбовування прапорця.
Когорта¶
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
(обов’язковий)Правильне поле дати або часу. Це поле сприймається представленням як кінцева дата запису. Це поле, яке визначатиме відтік.
mode
(необов’язковий)Рядок для опису режиму. Це має бути або „відтік“, або „утримання“ (за замовчуванням). Режим відтоку почнеться з 0% і накопичуватиметься з часом, тоді як утримання почнеться зі 100% і з часом зменшуватиметься.
timeline
(необов’язково)Рядок для опису шкали часу. Це має бути „зворотна“ або „пряма“ (за замовчуванням). Пряма шкала часу відображатиме дані від date_start до date_stop, тоді як зворотна часова шкала відображатиме дані від date_stop до date_start (якщо date_start у майбутньому / більше, ніж date_stop).
interval
(необов’язковий)Рядок для опису інтервалу часу. Це має бути „день“, „тиждень“, „місяць“ (за замовчуванням) або „рік“.
measure
(необов’язковий)Поле, яке можна агрегувати. Це поле використовуватиметься для обчислення значень для кожної клітинки. Якщо не встановлено, перегляд когорти підраховуватиме кількість випадків.
<field>
(необов’язково)дозволяє вказати конкретне поле, щоб керувати ним із доступних вимірювань, його основне використання полягає в тому, щоб приховати поле від вибраних вимірювань:
name
(обов’язково)назва поля для використання у вигляді.
string
(необов’язковий)назва, яке використовуватиметься для відображення поля в когортному представленні, замінює стандартний атрибут Python String поля.
invisible
(необов’язково)якщо істина, поле не відображатиметься ні в активних показниках, ні в параметрах, які можна вибрати (корисно для полів, які не мають сенсу агрегувати, наприклад, поля в різних одиницях, наприклад, € та $).
Інф. панелm¶
Enterprise featureЯк і зведені та графічні представлення, представлення інф. панелі використовується для відображення агрегованих даних. Однак, в інф. панель можна вбудовувати вкладені представлення, що дає змогу отримати більш повний і цікавий погляд на певний набір даних.
Представлення інф.панелі може відображати підпредставлення, агрегати для деяких полів (за доменом) або навіть формули (вирази, які включають один або кілька агрегатів). Наприклад, ось дуже проста інф. панель:
<dashboard>
<view type="graph" ref="sale_report.view_order_product_graph"/>
<group string="Sale">
<aggregate name="price_total" field="price_total" widget="monetary"/>
<aggregate name="order_id" field="order_id" string="Orders"/>
<formula name="price_average" string="Price Average"
value="record.price_total / record.order_id" widget="percentage"/>
</group>
<view type="pivot" ref="sale_report.view_order_product_pivot"/>
</dashboard>
Кореневим елементом представлення Інф. панелі є <dashboard>, він не приймає ніяких атрибутів.
Існує 5 можливих типів тегів у представленні інф. панелі:
view
оголошує підпредставлення.
Допустимими атрибутами є:
тип
(обов’язково)Тип підпредставлення. Наприклад, graph або pivot.
ref
(необов’язково)Ідентифікатор xml для представлення. Якщо не вказано, буде використано представлення за замовчуванням для моделі.
name
(необов’язково)Рядок, який ідентифікує цей елемент. Здебільшого корисно використовувати як ціль для xpath.
group
визначає макет стовпця. Насправді це дуже схоже на елемент групи у представленні форми.
Допустимими атрибутами є:
string
(необов’язковий)Опис, який буде відображатися як назва групи.
colspan
(необов’язково)Кількість підколонок у цьому тегу групи. За замовчуванням, 6.
col
(необов’язково)Кількість стовпців, що охоплюються цим тегом групи (має сенс лише всередині іншої групи). За замовчуванням, 6.
aggregate
оголошує агрегат. Це значення агрегату для заданого поля у поточному домені.
Зверніть увагу, що агрегати слід використовувати всередині групового тегу (інакше стиль не буде застосовано належним чином).
Допустимими атрибутами є:
field
(обов’язкове)Назва поля, яке буде використовуватися для обчислення агрегату. Можливі типи полів:
integer
(груповий оператор за замовчуванням - sum)float
(груповий оператор за замовчуванням - sum)float
(груповий оператор за замовчуванням - sum)
name
(обов’язково)Рядок для ідентифікації цього агрегату (корисний для формул)
string
(необов’язковий)Короткий опис, який буде показано над значенням. Якщо його не вказано, значення повернеться до рядка поля.
domain
(необов’язково)Додаткове обмеження на набір записів, які ми хочемо об’єднати. Цей домен буде об’єднано з поточним доменом.
domain_label
(необов’язково)Коли користувач натискає на агрегат з доменом, його буде додано до подання пошуку як фасет. За допомогою цього атрибута можна налаштувати рядок, що відображається для цього фасету.
group_operator
(необов’язково)Дійсний ідентифікатор агрегатної функції postgreSQL для використання при агрегуванні значень (див. https://www.postgresql.org/docs/9.5/static/functions-aggregate.html). Якщо не вказано, за замовчуванням використовується group_operator з визначення поля. Зауважте, що агрегування значень полів не відбувається, якщо значення group_operator дорівнює «».
Примітка
Тут також можна використовувати спеціальну агрегатну функцію
count_distinct
(визначену в odoo)<aggregate name="price_total_max" field="price_total" group_operator="max"/>
col
(необов’язково)Кількість стовпців, що охоплюються цим тегом (має сенс лише всередині групи). За замовчуванням, 1.
widget
(необов’язково)Віджет для форматування значення (як атрибут віджету для полів). Наприклад, monetary.
help
(необов’язково)Довідкове повідомлення для відображення у підказці (еквівалент довідки для поля у python)
measure
(необов’язковий)Цей атрибут є назвою поля, що описує міру, яка має бути використана на графіку та у зведеному представленні при натисканні на агрегат. Спеціальне значення __count__ можна використовувати для використання міри підрахунку.
<aggregate name="total_ojects" string="Total Objects" field="id" group_operator="count" measure="__count__"/>
clickable
(необов’язково)Логічне значення, яке вказує, чи має бути цей агрегат клікабельним (за замовчуванням - true). Натискання на агрегат, який можна натиснути, змінить вимірювання, що використовуються в підпредставленнях, і додасть значення атрибута домену (якщо такий є) до представлення пошуку.
value_label
(необов’язково)Рядок, розміщений праворуч від агрегованого значення. Наприклад, може бути корисно вказати одиницю виміру агрегованого значення.
formula
оголошує похідне значення. Формули - це значення, обчислені з агрегатів.
Зверніть увагу, що формули, як і агрегати, слід використовувати всередині групового тегу (інакше стиль не буде застосовано належним чином).
Допустимими атрибутами є:
value
(обов’язково)Рядковий вираз, який буде обчислено за допомогою вбудованого оцінювача python (у веб-клієнті). Кожен агрегат можна використовувати в контексті, в змінній
record
. Наприклад,record.price_total / record.order_id
.name
(необов’язково)Рядок для ідентифікації цієї формули
string
(необов’язковий)Короткий опис, який буде відображатися над формулою.
col
(необов’язково)Кількість стовпців, що охоплюються цим тегом (має сенс лише всередині групи). За замовчуванням, 1.
widget
(необов’язково)Віджет для форматування значення (наприклад, атрибут віджета для полів). Наприклад, monetary. За замовчуванням це „float“.
help
(необов’язково)Довідкове повідомлення для відображення у підказці (еквівалент довідки для поля у python)
value_label
(необов’язково)Рядок, розміщений праворуч від значення формули. Наприклад, може бути корисно вказати одиницю виміру значення формули.
widget
Оголошує спеціалізований віджет, який буде використано для відображення інформації. Цей механізм подібний до віджетів у представленні форми.
Допустимими атрибутами є:
name
(обов’язково)Рядок для визначення того, який віджет має бути створено. Представлення перегляне
widget_registry
, щоб отримати відповідний клас.col
(необов’язково)Кількість стовпців, що охоплюються цим тегом (має сенс лише всередині групи). За замовчуванням, 1.
Форма¶
Представлення форм використовуються для відображення даних з одного запису. Їх кореневим елементом є <form>
. Вони складаються зі звичайного HTML з додатковими структурними та семантичними компонентами.
Структурні компоненти¶
Структурні компоненти забезпечують структуру або «візуальні» функції з невеликою логікою. Вони використовуються як елементи або набори елементів у представленнях форм.
notebook
визначає розділ із вкладками. Кожна вкладка визначається дочірнім елементом
page
. Сторінки можуть мати такі атрибути:string
(обов’язково)заголовок вкладки
accesskey
ключ доступу HTML
attrs
стандартні динамічні атрибути на основі значень записів
Примітка
Зауважте, що
notebook
не слід розміщувати вgroup
group
використовується для визначення макетів стовпців у формах. За замовчуванням групи визначають 2 стовпці, а більшість прямих дочірніх груп займають один стовпець. Прямі дочірні елементи
field
груп відображають мітку за умовчанням, а мітка та саме поле мають colspan 1 кожен.Кількість стовпців у
group
можна налаштувати за допомогоюcol
атрибуту, кількість стовпців, які приймає елемент, можна налаштувати за допомогоюcolspan
.Дочірні розкладені горизонтально (намагається заповнити наступний стовпчик перед зміною рядка).
Групи можуть мати атрибут
string
, який відображається як назва групиnewline
корисно лише в елементах
group
, завершує поточний рядок раніше і негайно перемикається на новий рядок (без попереднього заповнення стовпців, що залишилися)separator
малий горизонтальний інтервал із атрибутом
string
поводиться як заголовок розділуsheet
можна використовувати як прямий дочірній елемент
form
для вужчого та більш адаптивного макета формиheader
у поєднанні з
sheet
забезпечує розташування на всю ширину над самим аркушем, зазвичай використовується для відображення кнопок робочого процесу та віджетів стану
Семантичні компоненти¶
Семантичні компоненти пов’язані з системою Odoo та дозволяють взаємодіяти з нею. Доступні семантичні компоненти:
button
викликати в систему Odoo, подібно до кнопок перегляду списку. Крім того, можна вказати такий атрибут:
special
для форм, відкритих у діалогових вікнах:
save
, щоб зберегти запис і закрити діалогове вікно,cancel
, щоб закрити діалогове вікно без збереження.confirm
повідомлення про підтвердження для відображення (і для прийняття користувачем) перед виконанням виклику кнопки Odoo (також працює в режимах перегляду канбан).
field
відображає (і дозволяє редагувати, можливо) одне поле поточного запису. Підтримується кількаразове використання поля в поданні форми, і поля можуть отримувати різні значення для модифікаторів „невидимий“ і „лише для читання“. Однак поведінка не гарантується, якщо існує кілька полів із різними значеннями для модифікатора „обов’язково“. Можливі атрибути вузла поля:
name
(обов’язково)назва поля для візуалізації
id
ідентифікатор вузла. Корисно, коли в поданні є кілька входжень одного поля (див. компонент
label
нижче). За замовчуванням це назва поля.widget
поля мають відтворення за замовчуванням на основі їх типу (наприклад,
Char
,Many2one
). Атрибутиwidget
дозволяють використовувати інший метод візуалізації та контекст.options
Об’єкт JSON, що визначає параметр конфігурації для віджета поля (включно з віджетами за замовчуванням)
class
Клас HTML, який потрібно встановити на згенерований елемент, загальні класи полів:
oe_inline
запобігти звичайний розрив рядка після полів
oe_left
,oe_right
floats поле у відповідному напрямку
oe_read_only
,oe_edit_only
лише відображає поле у відповідному режимі форми
oe_avatar
для полів зображення відображає зображення як «avatar» (квадрат, максимальний розмір 90x90, деякі декоратори зображення)
groups
відображає поле лише для певних користувачів
on_change
викликає вказаний метод, коли значення цього поля редагується, може генерувати оновлення інших полів або відображати попередження для користувача
Застаріло починаючи з версії 8.0: Використовуйте
odoo.api.onchange()
на моделіattrs
динамічні мета-параметри на основі записаних значень
domain
лише для реляційних полів, фільтри для застосування під час відображення наявних записів для вибору
context
лише для реляційних полів, контекст для передачі під час отримання можливих значень
readonly
відображати поле як у режимі лише для читання, так і в режимі редагування, але ніколи не робити його доступним для редагування
required
створює помилку та запобігає збереженню запису, якщо поле не має значення
nolabel
не відображати автоматично мітку поля, має сенс, лише якщо поле є прямим дочірнім елементом
group
placeholder
довідкове повідомлення для відображення в empty полях. Може замінювати мітки полів у складних формах. Не має бути прикладом даних, оскільки користувачі можуть сплутати текст заповнювача із заповненими полями
mode
для
One2many
, режим відображення (тип перегляду), який використовується для пов’язаних записів поля. Одне зtree
,form
,kanban
абоgraph
. Типовим єtree
(відображення списку)help
спливаюча підказка, яка відображається для користувачів під час наведення курсора на поле або його мітку
filename
для двійкових полів, назва пов’язаного поля, яке містить назву файлу
password
вказує, що поле
Char
зберігає пароль і що його дані не повинні відображатисяkanban_view_ref
для відкриття певного перегляду канбану під час вибору записів із m2o/m2m у мобільному середовищі
label
коли компонент
field
не розміщено безпосередньо вgroup
, або коли його атрибутnolabel
установлено, мітка поля не відображається автоматично поряд із його значенням. Компонентlabel
- це ручна альтернатива відображення мітки поля. Можливі атрибути:for
(обов’язковий)посилання на поле, пов’язане з міткою. Може бути або назвою поля, або його ідентифікатором (атрибут
id
, встановлений уfield
). Якщо в поданні є кілька входжень того самого поля та є кілька компонентівlabel
, пов’язаних із цими вузламиfield
, ці мітки повинні мати унікальні атрибутиfor
(у цьому випадку посилаються на атрибутid
відповідних вузлівfield
).string
ярлик для відображення. Відображати мітку поля (виходячи з визначення поля в моделі) за замовчуванням.
class
те саме, що для компонента
field
.attrs
те саме, що для компонента
field
.
Основна структура¶
<form>
<header>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<div class="oe_button_box">
<BUTTONS/>
</div>
<group>
<group>
<field name="fname"/>
</group>
</group>
<notebook>
<page string="Page1">
<group>
<CONTENT/>
</group>
</page>
<page string="Page2">
<group>
<CONTENT/>
</group>
</page>
</notebook>
</sheet>
</form>
Гант¶
Enterprise featureПредставлення Ганта належним чином відображають діаграми Ганта (для планування).
Кореневим елементом представлень Gantt є <gantt/>
, він не має дочірніх, але може приймати такі атрибути:
date_start
(обов’язково)назва поля, що містить дату початку події для кожного запису.
date_stop
(обов’язково)назва поля, що містить кінцеву тривалість події для кожного запису.
color
назва поля, яке використовується для кольору pills відповідно до його значення
decoration-{$name}
дозволяють змінювати стиль тексту рядка на основі атрибутів відповідного запису.
Значення є виразами Python. Для кожного запису вираз обчислюється з атрибутами запису як контекстними значеннями, і якщо
true
, до рядка застосовується відповідний стиль. Ось деякі інші значення, доступні в контексті:uid
: id поточного користувача,today
: поточна місцева дата у вигляді рядкаYYYY-MM-DD
,now
: те саме, щоtoday
з додаванням поточного часу. Це значення має форматYYYY-MM-DD hh:mm:ss
.
{$name}
може бути одним із таких bootstrap contextual color (danger
,info
,secondary
,success
абоwarning
).default_group_by
назва поля для групування завдань
disable_drag_drop
якщо встановлено значення true, перегляд ганта не матиме підтримки перетягування та скидання
consolidation
назва поля для відображення значення консолідації в клітинці запису
consolidation_max
словник із полем «групувати за» як ключем і максимальним значенням консолідації, якого можна досягти перед відображенням клітинки червоним кольором (наприклад,
{"user_id": 100}
)consolidation_exclude
назва поля, яке описує, чи потрібно виключити завдання з консолідації, якщо встановлено значення true, у рядку консолідації відображається смугаста зона
create
,cell_create
,edit
,delete
,plan
дозволяє вимкнутивідповідну дію в представленні, встановивши для відповідного атрибута значення
false
(за замовчуванням:true
).create
: якщо ввімкнено, на панелі керування буде доступна кнопкаДодати
для створення записів.cell_create
: якщо ввімкнено таcreate
увімкнено, кнопка «+» відображатиметься під час наведення курсора на клітинку часового інтервалу для створення нового запису в цьому слоті.edit
: якщо ввімкнено, відкриті записи будуть у режимі редагування (тому їх можна буде редагувати).plan
: якщо ввімкнено таedit
, кнопка «збільшувальне скло» відображатиметься на часових інтервалах для планування непризначених записів у цей часовий інтервал.
Example
Якщо ви не бажаєте створювати записи у представленні Ганта, а в моделі потрібні дати початку та завершення, функцію планування слід вимкнути, оскільки жодного запису не буде знайдено.
offset
Залежно від масштабу, кількість одиниць, які потрібно додати до сьогоднішнього дня, щоб обчислити період за умовчанням. Приклади: зсув +1 у default_scale тиждень відкриє перегляд ганта для наступного тижня, а зміщення -2 у default_scale місяць відкриє представлення ганта 2 місяці тому.
progress
назва поля, що містить відсоток завершення для події запису, від 0 до 100
string
назва представлення Ганта
precision
Об’єкт JSON, який визначає точність примикання для pills у кожному масштабі.
Можливі значення для шкали
day
(за замовчуванням:hour
):hour
: записує час, прив’язаний до повних годин (наприклад: 7:12 стає 8:00)hour:half
: запис часу прив’язується до півгодини (наприклад: 7:12 стає 7:30)hour:quarter
: запис часу прив’язується до півгодини (наприклад: 7:12 стає 7:15)
Можливі значення для шкали
week
(за замовчуванням:day:half
):day
: записує час, прив’язаний до повних днів (наприклад, 7:28 стає 23:59:59 попереднього дня, 22:32 стає 12:00 поточного дня)day:half
: записує час до півгодини (наприклад, 7:28 стає 12:00)
Можливі значення для шкали
week
(за замовчуванням:day:half
):day
: записує час, прив’язаний до повних днів (наприклад, 7:28 стає 23:59:59 попереднього дня, 22:32 стає 12:00 поточного дня)day:half
: записує час до півгодини (наприклад, 7:28 стає 12:00)
Шкала
year
завжди прив’язується до повного дня.Приклад атрибута точності:
{"day": "hour:quarter", "week": "day:half", "month": "day"}
total_row
логічне значення, щоб контролювати, чи слід відображати рядок із загальною кількістю записів. (за замовчуванням:
false
)collapse_first_level
логічне значення, щоб контролювати, чи можливо згорнути кожен рядок, якщо згруповано одним полем. (за замовчуванням:
false
, згортання починається при групуванні за двома полями)display_unavailability
логічне значення для позначення дат, повернутих функцією
gantt_unavailability
моделі, як доступних у представленні Ганта. У них ще можна планувати записи, але візуально відображається їх недоступність. (за замовчуванням:false
)default_scale
масштаб за замовчуванням під час візуалізації представлення. Можливі значення (за замовчуванням:
month
):day
week
month
year
scales
розділений комами список допустимих масштабів для цього перегляду. За замовчуванням дозволені всі масштаби. Для можливих значень масштабу для використання в цьому списку перегляньте
default_scale
.templates
визначає Шаблони QWeb шаблон
gantt-popover
, який використовується, коли користувач наводить курсор на один із записів у представленні ганта.Представлення Гант використовує здебільшого стандартний javascript qweb і надає такі контекстні змінні:
widget
поточний
GanttRow()
можна використовувати для отримання певної мета-інформації. МетодgetColor
для перетворення в ціле число кольору також доступний безпосередньо в контексті шаблону без використанняwidget
.on_create
Якщо це вказано під час натискання кнопки Додати в представленні, замість відкриття загального діалогового вікна запускати дію клієнта. тут має міститися xmlid дії (наприклад:
on_create="%(my_module.my_wizard)d"
form_view_id
представлення, яке відкривається, коли користувач створює або редагує запис. Зауважте, що якщо цей атрибут не встановлено, представлення ганта повернеться до ідентифікатора представлення форми в поточній дії, якщо така є.
dynamic_range
якщо встановлено значення true, представлення ганта розпочнеться з першого запису, а не з початку року/місяця/дня.
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.
Графік¶
Графічне представлення використовується для візуалізації агрегацій для кількох записів або груп записів. Його кореневим елементом є <graph>
, який може приймати такі атрибути:
type
один із
bar
(за замовчуванням),pie
таline
, тип графіка для використанняstacked
використовується лише для гістограм. Якщо присутній і встановлено значення
True
, смуги складаються в групуdisable_linking
встановіть значення
True
, щоб запобігти перенаправленню кліків на графіку до представлення спискуorder
якщо встановлено, значення осі x буде відсортовано за замовчуванням відповідно до їх вимірювання щодо заданого порядку (
asc
абоdesc
). Використовується лише для графіківbar
таpie
.
Єдиним дозволеним елементом у представленні графіка є field
, яке може мати такі атрибути:
name
(обов’язково)назва поля для використання в представленні. Якщо використовується для групування (а не агрегування)
title
(необов’язково)рядок, що відображається у верхній частині графіка.
invisible
(необов’язково)якщо істина, поле не відображатиметься ні в активних мірах, ні в мірах, які можна вибрати.
type
вказує, чи слід використовувати поле як критерій групування чи як агреговане значення в межах групи. Можливі значення:
row
(за замовчуванням)групи за вказаним полем. Усі типи графіків підтримують принаймні один рівень групування, деякі можуть підтримувати більше.
col
дозволено в представленні графіків, але використовується лише у зведених таблицях
measure
поле для агрегування в групу
interval
у полях дати та дати й часу групує за вказаним інтервалом (
день
,тиждень
,місяць
,квартал
аборік
) замість групування за конкретною датою та часом ( фіксована друга роздільна здатність) або дата (фіксована роздільна здатність дня).
Показники автоматично генеруються з полів моделі; використовуються лише агреговані поля. Ці показники також відсортовані в алфавітному порядку в рядку поля.
Попередження
агрегації подання графіків виконуються для вмісту бази даних, незбережені функціональні поля не можна використовувати в поданнях графіків
Канбан¶
Перегляд канбану є візуалізацією дошки канбану: він відображає записи як «картки», що знаходиться на півдорозі між переглядом списку та нередагованим виглядом форми. Записи можуть бути згруповані в стовпці для використання під час візуалізації робочого процесу або маніпуляції (наприклад, завдання чи керування прогресом роботи) або розгруповані (використовуються просто для візуалізації записів).
Примітка
Перегляд Канбан завантажить і відобразить максимум десять стовпців. Будь-який стовпець після цього буде закрито (але користувач усе ще може відкрити його).
Кореневим елементом представлення Канбан є <kanban>
, він може використовувати такі атрибути:
default_group_by
чи має бути згруповане представлення канбану, якщо групування не вказано через дію чи поточний пошук. Має бути назва поля для групування, якщо інше групування не вказано
default_order
порядок сортування карток, який використовується, якщо користувач ще не відсортував записи (через список)
class
додає класи HTML до кореневого елемента HTML перегляду Канбан
examples
якщо встановити ключ у KanbanExamplesRegistry, приклади налаштувань стовпців будуть доступні в згрупованому представленні канбану. Тут приклад того, як визначити ці налаштування.
group_create
чи відображається панель «Додати новий стовпець» чи ні. За-замовчування: true.
group_delete
чи можна видалити групи через контекстне меню. За замовчуванням: true.
group_edit
чи можна видалити групи через контекстне меню. За замовчуванням: true.
archivable
чи можна архівувати/відновлювати записи, що належать до стовпця, якщо в моделі визначено поле
active
. За замовчуванням: true.quick_create
чи має бути можливість створювати записи без переходу до представлення форми. За замовчуванням
quick_create
увімкнено, коли представлення Канбан згруповано за полями many2one, selection, char або boolean, і вимкнено, якщо ні.quick_create_view
Посилання на представлення
form
, що вказує на представлення, яке використовується для швидкого створення записів.records_draggable
чи має бути можливість перетягувати записи, коли канбан згрупований. За замовчуванням: true.
Установіть значення
true
, щоб завжди вмикати його, іfalse
, щоб завжди його вимикати.
Можливі нащадки елемента view:
field
оголошує поля для використання в logic канбану. Якщо поле просто відображається в поданні Канбан, його не потрібно попередньо декларувати.
Можливі атрибути:
name
(обов’язково)назва поля для отримання
progressbar
оголошує елемент індикатора прогресу для розміщення поверх стовпців канбану.
Можливі атрибути:
field
(обов’язково)назва поля, значення якого використовуються для підгрупування записів стовпців на панелі виконання
colors
(обов’язково)JSON зіставляє значення поля вище з кольорами «danger», «warning», «success» або «muted»
sum_field
(необов’язковий)назва поля, значення записів стовпця якого буде підсумовано та відображено поруч із індикатором прогресу (якщо опущено, відображається загальна кількість записів)
templates
визначає список шаблонів Шаблони QWeb. Визначення карток можна розділити на кілька шаблонів для ясності, але представлення канбану повинні визначати принаймні один кореневий шаблон
kanban-box
, який буде відтворено один раз для кожного запису.Представлення Гант використовує здебільшого стандартний javascript qweb і надає такі контекстні змінні:
widget
поточний
KanbanRecord()
можна використовувати для отримання деякої мета-інформації. Ці методи також доступні безпосередньо в контексті шаблону, і до них не потрібно звертатися черезwidget
record
об’єкт з усіма запитаними полями як його атрибутами. Кожне поле має два атрибути
value
іraw_value
, перше форматується відповідно до поточних параметрів користувача, останнє є прямим значенням ізread()
(окрім для полів дати та часу, які відформатовані відповідно до локалі користувача)context
поточний контекст, що походить від дії, і поле one2many або many2many у випадку представлення Канбан, вбудованого в представленні Форми
user_context
self-explanatory
read_only_mode
self-explanatory
selection_mode
встановіть значення true, коли перегляд канбану відкривається в мобільному середовищі з поля m2o/m2m для вибору записів.
Примітка
натискання на поле m2o/m2m у мобільному середовищі відкриває представлення канбану
кнопки та поля
Хоча більшість шаблонів Канбан є стандартними Шаблони QWeb, представлення Канбан спеціально обробляє елементи
field
,button
іa
:за замовчуванням поля замінюються їх відформатованим значенням, якщо не вказано атрибут
widget
, у цьому випадку їх рендеринг і поведінка залежать від відповідного віджета. Можливі значення (серед іншого):handle
для полів
sequence
(абоinteger
), за якими відсортовано записи, дозволяє перетягувати записи, щоб змінити їх порядок.
кнопки та посилання з атрибутом
type
починають виконувати операції, пов’язані з Odoo, а не стандартну функцію HTML. Можливі типи:action
,object
стандартна поведінка для кнопок Odoo, можна використовувати більшість атрибутів, пов’язаних зі стандартними кнопками Odoo.
open
відкриває запис картки у вигляді форми в режимі лише для читання
edit
відкриває запис картки у представленні форми в режимі редагування
delete
видаляє запис картки та видаляє картку
Якщо вам потрібно розширити представлення Канбан, перегляньте KanbanRecord()
.
Список¶
Кореневим елементом представлень списку є <tree>
2. Корінь представлення списку може мати такі атрибути:
editable
за замовчуванням вибір рядка представлення списку відкриває відповідне представлення форми. Атрибути
editable
роблять сам перегляд списку доступним для редагування на місці.Дійсні значення:
top
іbottom
, завдяки чому нові записи відображаються відповідно у верхній або нижній частині списку.Архітектура вбудованого форми походить від списку. Більшість атрибутів, дійсних для полів і кнопок форми, таким чином, приймаються для представлення списків, хоча вони можуть не мати жодного значення, якщо представлення списку не редагується
Примітка
якщо для атрибута
edit
встановлено значенняfalse
, опціяeditable
буде проігнорована.multi_edit
редагований або нередагований список може активувати функцію багаторазового редагування, визначивши
multi_edit=1
default_order
перевизначає порядок представлення, замінюючи порядок моделі (
_order
атрибут моделі). Значення – це список полів, розділених комами, з постфіксомdesc
для сортування у зворотному порядку:<tree default_order="sequence,name desc">
decoration-{$name}
дозволяють змінювати стиль тексту рядка на основі атрибутів відповідного запису.
{$name}
може бутиbf
(font-weight: bold
),it
(font-style: italic
) або будь-який bootstrap contextual color (danger
,info
,muted
,primary
,success
абоwarning
).create
,edit
,delete
,import
,export_xlsx
дозволяє вимкнути відповідну дію в представленні, встановивши для відповідного атрибута значення
false
limit
стандартний розмір сторінки. Це має бути додатне ціле число
groups_limit
коли представлення списку згруповано, кількість груп на сторінці за замовчуванням. Це має бути ціле число позиції
expand
коли представлення списку згрупований, автоматично відкривати перший рівень груп, якщо встановлено значення true (за замовчуванням: false)
Можливі дочірні елементи представлення списку:
button
відображає кнопку в клітинці списку
icon
значок для відображення кнопки
string
якщо
icon
немає, текст кнопкиякщо є
icon
,alt
текст для значка
type
тип кнопки, вказує, як її натискання впливає на Odoo:
object
викликати метод у моделі списку.
name
кнопки - це метод, який викликається з ідентифікатором запису поточного рядка та поточним контекстом.action
завантажити і виконати
ir.actions
,name
кнопки є ідентифікатором бази даних дії. Контекст розширюється за допомогою моделі списку (якactive_model
), запису поточного рядка (active_id
) і всіх записів, наразі завантажених у списку (active_ids
, може бути лише підмножиною записи бази даних, що відповідають поточному пошуку)
name
див.
type
args
див.
type
attrs
динамічні атрибути на основі значень записів.
Зіставлення атрибутів на домени, домени оцінюються в контексті запису поточного рядка, якщо
True
відповідний атрибут встановлено в комірці.Можливий атрибут
invisible
(приховує кнопку).states
скорочення для
invisible
attrs
: список станів, розділених комами, вимагає, щоб модель мала полеstate
і щоб воно використовувалося в поданні.Робить кнопку
невидимою
, якщо запис не в одному з перелічених станівНебезпека
Використання
states
у поєднанні зattrs
може призвести до несподіваних результатів, оскільки домени поєднуються з логічним AND.context
об’єднано з контекстом представлення під час виконання виклику кнопки Odoo
field
визначає стовпець, де має відображатися відповідне поле для кожного запису. Можна використовувати такі атрибути:
name
назва поля для відображення в поточній моделі. Дана назва може використати лише один раз для предмставлення
string
заголовок стовпця поля (за замовчуванням використовується
string
поля моделі)invisible
отримує та зберігає поле, але не відображає стовпець у таблиці. Необхідно для полів, які не повинні відображатися, але використовуються, наприклад,
@colors
groups
перелічує групи, які мають бачити поле
widget
альтернативні представлення для відображення поля. Можливі значення представлення списку (серед іншого):
progressbar
відображає поля
float
як індикатор виконання.handle
для полів
sequence
(абоinteger
), за якими відсортовано записи, замість відображення значення поля просто відображає піктограму перетягування, щоб змінити порядок записів.
sum
,avg
відображає відповідний агрегат у нижній частині стовпця. Агрегація обчислюється лише для поточно відображених записів. Операція агрегування має відповідати
group_operator
відповідного поляattrs
динамічні атрибути на основі значень записів. Впливає лише на поточне поле, отже, напр.
invisible
приховає поле, але залишить видимим те саме поле інших записів, сам стовпець не приховаєwidth
(дляeditable
)якщо в списку немає даних, ширину стовпця можна змінити за допомогою цього атрибута. Значенням може бути абсолютна ширина (наприклад, „100px“) або відносна вага (наприклад, „3“, тобто цей стовпець буде в 3 рази більшим за інші). Зауважте, що коли в списку є записи, ми дозволяємо браузеру автоматично адаптувати ширину стовпців відповідно до їх вмісту, і цей атрибут ігнорується.
decoration-{$name}
дозволяють змінювати стиль тексту комірки на основі атрибутів відповідного запису.
{$name}
може бутиbf
(font-weight: bold
),it
(font-style: italic
) або будь-який bootstrap contextual color (danger
,info
,muted
,primary
,success
абоwarning
).nolabel
якщо встановлено значення «1», заголовок стовпця залишиться порожнім. Крім того, стовпець не можна сортувати.
optional
робить стовпець необов’язковим. Якщо встановлено значення «сховати», стовпець буде приховано за умовчанням. Якщо встановлено значення «показати», стовпець буде видимим за умовчанням. Вибір видимості користувача зберігається в локальному сховищі браузера.
Примітка
Якщо представлення списку
editable
, будь-який атрибут поля з форми представлення також є дійсним і використовуватиметься під час налаштування вбудованого представлення форми.Примітка
У випадку під-представленні списку (відображення One2many/Many2many у представленні форми), атрибут
column_invisible
може бути корисним, щоб приховати стовпець залежно від батьківського об’єкта.<field name="product_is_late" attrs="{'column_invisible': [('parent.has_late_products', '=', False)]}"/>
Примітка
Коли подання списку згруповано, числові поля агрегуються та відображаються для кожної групи. Крім того, якщо в групі занадто багато записів, праворуч від рядка групи з’явиться пейджер. З цієї причини недоцільно мати числове поле в останньому стовпці, коли в поданні списку його можна згрупувати (однак це добре для полів x2manys у поданні форми: їх не можна згрупувати ).
groupby
визначає спеціальні заголовки (з кнопками) для поточного представлення під час групування записів у many2one полях. Також можна додати
field
всерединуgroupby
, який можна використовувати для модифікаторів. Таким чином, ці поля належать до комоделі many2one. Ці додаткові поля будуть отримані пакетно.name
назва поля many2one (у поточній моделі). Настроюваний заголовок відображатиметься під час групування представлення за назвою цього поля.
<groupby name="partner_id"> <field name="name"/> <!-- name of partner_id --> <button type="edit" name="edit" string="Edit"/> <button type="object" name="my_method" string="Button1" attrs="{'invisible': [('name', '=', 'Georges')]}"/> </groupby>
Можна визначити спеціальну кнопку (
type="edit"
), щоб відкрити представлення форми many2one.control
визначає спеціальні елементи керування для поточного представлення.
Це має сенс, якщо батьківське представлення
tree
знаходиться всередині поля One2many.Не підтримує жодних атрибутів, але може мати дочірніх:
create
додає кнопку для створення нового елемента в поточному списку.
Примітка
Якщо визначено будь-який
створити
, він перезапише стандартну кнопку «додати рядок».Підтримуються такі атрибути:
string
(обов’язково)Текст, що відображається на кнопці.
context
Цей контекст буде об’єднано з існуючим під час отримання значення за замовчуванням нового запису.
Наприклад, його можна використовувати для заміни значень за замовчуванням.
У наведеному нижче прикладі кнопка «додати рядок» за умовчанням буде замінена трьома новими кнопками: «Додати продукт», «Додати розділ» і «Додати примітку».
«Додати продукт» встановить для поля „display_type“ значення за умовчанням.
Дві інші кнопки встановлять для поля „display_type“ значення відповідно „line_section“ і „line_note“.
<control> <create string="Add a product" /> <create string="Add a section" context="{'default_display_type': 'line_section'}" /> <create string="Add a note" context="{'default_display_type': 'line_note'}" /> </control>
- 2
з історичних причин воно бере свій початок у представленнях типу дерева, яке пізніше було перепрофільовано на відображення більше типу таблиці/списку
Карта¶
Enterprise featureЦе представлення здатне відображати записи на карті та маршрути між ними. Запис представлений шпильками. Це також дозволяє візуалізувати поля з моделі у спливаючому вікні, прив’язаному до шпильки запису.
Примітка
Модель, до якої представлення подання, має містити res.partner many2one, оскільки представлення покладається на поля адреси та координат res.partner для локалізації записів.
Api¶
Представлення використовує API платформ даних про місцезнаходження, щоб отримати плитки (фон карти), виконати геопереадресацію (перетворення адрес на набір координат) і отримати маршрути. Представлення реалізує два API, стандартний, openstreet map може отримувати плитки та виконувати геопересилання. Для цього API не потрібен маркер. Щойно дійсний токен MapBox буде надано в загальних налаштуваннях, перегляд переключиться на API Mapbox. Цей API є швидшим і дозволяє обчислювати маршрути. Маркер доступний, зареєструвавшись в MapBox
Структурні компоненти¶
Кореневим елементом представлення є <map>
, дозволено кілька атрибутів
res_partner
Містить res.partner many2one. Якщо не надано, перегляд створить порожню карту.
default_order
Якщо надано поле, перегляд замінить порядок моделі за замовчуванням. Поле має бути частиною моделі, до якої застосовано подання, а не з res.partner
routing
якщо
true
, будуть показані маршрути між записами. Для перегляду все ще потрібен дійсний маркер MapBox і принаймні два розташовані записи. (тобто записи мають res.partner many2one, а партнер має адресу або дійсні координати)hide_name
якщо
true
приховати назву у спливаючому вікні маркера (за замовчуванням: false)hide_address
якщо
true
приховати адресу зі спливаючого вікна маркера (за замовчуванням: false)
Елемент <map>
може містити декілька елементів <field>
. Кожен елемент <field>
буде інтерпретуватися як рядок у спливаючому вікні маркера. Атрибути поля такі:
name
Поле для відображення.
string
Цей рядок відображатиметься перед вмістом поля. Його можна використовувати як опис.
limit
Розмір сторінки (за замовчуванням: 80). Це має бути додатне ціле число.
Жоден атрибут або елемент не є обов’язковим, але, як зазначено вище, якщо не надано res.partner many2one, представлення не зможе знайти записи.
- Наприклад, ось карта:
<map res_partner="partner_id" default_order="date_begin" routing="true" hide_name="true"> <field name="partner_id" string="Customer Name"/> </map>
Зведена таблиця¶
Зведене таюлиця використовується для візуалізації агрегацій у представленні зведена таблиця. Його кореневим елементом є <pivot>
, який може приймати такі атрибути:
disable_linking
Установіть значення
True
, щоб видалити посилання клітинок таблиці на представлення списку.display_quantity
Установіть значення
true
, щоб стовпець Кількість відображався за умовчанням.default_order
Назва міри та порядок (за зростанням або спаданням), які використовуватимуться як порядок за замовчуванням у представленні.
<pivot default_order="foo asc"> <field name="foo" type="measure"/> </pivot>
Єдиним дозволеним елементом у представленні графіка є field
, яке може мати такі атрибути:
name
(обов’язково)назва поля для використання в представленні. Якщо використовується для групування (а не агрегування)
string
назва, яке використовуватиметься для відображення поля у зведеній таблиці, замінює стандартний атрибут python String поля.
type
вказує, чи слід використовувати поле як критерій групування чи як агреговане значення в межах групи. Можливі значення:
row
(за замовчуванням)групування за вказаним полем, кожна група отримує окремий рядок.
col
створює групи по стовпцях
measure
поле для агрегування в групу
interval
у полях дати та дати й часу групує за вказаним інтервалом (
день
,тиждень
,місяць
,квартал
аборік
) замість групування за конкретною датою та часом ( фіксована друга роздільна здатність) або дата (фіксована роздільна здатність дня).
invisible
якщо істина, поле не відображатиметься ні в активних показниках, ні в параметрах, які можна вибрати (корисно для полів, які не мають сенсу агрегувати, наприклад, поля в різних одиницях, наприклад, € та $).
Показники автоматично генеруються з полів моделі; використовуються лише агреговані поля. Ці показники також відсортовані в алфавітному порядку в рядку поля.
Попередження
Подібно до графічного перегляду, зведена агрегує дані про вміст бази даних, що означає, що незбережені функціональні поля не можна використовувати в зведених представленнях
У зведеній таблиці 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>
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()
.
Пошук¶
Представлення пошуку відрізняються від попередніх типів представлення, оскільки вони не відображають вміст: хоча вони застосовуються до певної моделі, вони використовуються для фільтрації вмісту іншого ппредставлення (загалом агрегованих представлень, наприклад, Список або Графік). Крім цієї різниці у варіантах використання, вони визначаються однаково.
Кореневим елементом представлення пошуку є <search>
. Він не потребує атрибутів.
Можливі дочірні елементи представлення пошуку:
field
поля визначають домени або контексти зі значеннями, наданими користувачем. Коли генеруються пошукові домени, домени полів складаються один з одним і з фільтрами за допомогою AND.
Поля можуть мати такі атрибути:
name
назва поля для фільтрації
string
мітка поля
operator
за замовчуванням поля генерують домени у формі
[(name, operator, provided_value)]
, деname
- це назва поля, аprovided_value
- це значення, надане користувач, можливо відфільтрований або трансформований (наприклад, очікується, що користувач надасть мітку значення поля вибору, а не саме значення).Атрибут
operator
дозволяє перевизначати оператор за замовчуванням, який залежить від типу поля (наприклад,=
для полів float , алеilike
для полів char)filter_domain
повний домен для використання як домен пошуку поля, може використовувати змінну
self
для введення наданого значення в користувацький домен. Може бути використаний для створення значно більш гнучких доменів, ніж одинoperator
(наприклад, пошук у кількох полях одночасно)Якщо надано і
operator
, іfilter_domain
,filter_domain
має пріоритет.context
дозволяє додавати контекстні ключі, включно з наданими користувачем значеннями (які для
domain
доступні якself
змінна, масив значень, наприклад[id_1, id_2]
дляMany2one
поле). За замовчуванням поля не створюють домени.Примітка
домен і контекст включають і обидва генеруються, якщо вказано
контекст
. Щоб генерувати лише контекстні значення, встановітьfilter_domain
у порожній список:filter_domain="[]"
groups
зробити поле доступним лише для певних користувачів
domain
якщо поле може забезпечувати автозаповнення (наприклад,
Many2one
), фільтрує можливі результати завершення.
filter
фільтр - це попередньо визначений перемикач у вікні пошуку, його можна лише ввімкнути або вимкнути. Його головні цілі - додавати дані до контексту пошуку (контексту, переданого до вікна представлення даних для пошуку/фільтрування) або додавати нові розділи до фільтра пошуку.
Фільтри можуть мати такі атрибути:
string
(обов’язково)етикетка фільтра
domain
(необов’язково)Odoo домен буде додано до домену дії як частину домену пошуку.
date
(необов’язково)назва поля типу
date
абоdatetime
. Використання цього атрибута призводить до створення набору фільтрів, доступних у підменю меню фільтрів. Запропоновані фільтри залежать від часу, але не динамічні в тому сенсі, що їх домени оцінюються під час створення екземпляра панелі керування.Приклад:
<filter name="filter_create_date" date="create_date" string="Creation Date"/>
Наведений вище приклад дозволяє легко шукати записи зі значеннями поля дати створення в одному з наведених нижче періодів (якщо поточний місяць – серпень 2019 року).
Create Date > August July June Q4 Q3 Q2 Q1 -------------- 2019 2018 2017
Допускається багаторазовий вибір варіантів.
default_period
(необов’язковий)має сенс лише для фільтра з непорожнім атрибутом
date
. визначає, який період активується, якщо фільтр є в стандартному наборі фільтрів, активованих під час ініціалізації представлення. Якщо не вказано, за умовчанням використовується „this_month“.Щоб вибрати серед таких варіантів: today, this_week, this_month, last_month, antepenultimate_month, fourth_quarter, third_quarter, second_quarter, first_quarter, this_year, last_year, antepenultimate_year.
Приклад:
<filter name="filter_create_date" date="create_date" string="Creation Date" default_period="this_week"/>
context
словник Python, об’єднаний у домен дії для створення домену пошуку
Ключ
group_by
можна використовувати для визначення groupby, доступного в меню „Групувати за“. Значення „group_by“ може бути дійсною назвою поля.<filter name="groupby_category" string="Category" context="{'group_by': 'category_id'}"/>
Groupby, визначений вище, дозволяє групувати дані за категоріями.
Якщо поле має тип
date
абоdatetime
, фільтр генерує підменю меню Групувати за, у якому доступні такі параметри інтервалів: день, тиждень, місяць, квартал, рік.Якщо фільтр міститься в стандартному наборі фільтрів, активованих під час ініціалізації перегляду, записи групуються за місяцями за замовчуванням. Це можна змінити за допомогою синтаксису „date_field:interval“, як у наведеному нижче прикладі.
Приклад:
<filter name="groupby_create_date" string="Creation Date" context="{'group_by': 'create_date:week'}"/>
Примітка
На результати read_groups, згрупованих у полі, може впливати його атрибут group_expand, що дозволяє відображати порожні групи, коли це необхідно. Для отримання додаткової інформації зверніться до документації атрибутів
Field
.name
логічна назва для фільтра, можна використовувати, щоб увімкнути його за замовчуванням, також можна використовувати як хук успадкування
help
довший пояснювальний текст для фільтра може відображатися як підказка
groups
робить фільтр доступним лише для певних користувачів
Порада
Нове в версії 7.0.
Послідовності фільтрів (без нефільтрів, які їх розділяють) розглядаються як складені: вони складатимуться за допомогою
OR
, а не звичайногоAND
, напр.<filter domain="[('state', '=', 'draft')]"/> <filter domain="[('state', '=', 'done')]"/>
якщо вибрано обидва фільтри, буде вибрано записи,
state
якихdraft
абоdone
, але<filter domain="[('state', '=', 'draft')]"/> <separator/> <filter domain="[('delay', '<', 15)]"/>
якщо вибрано обидва фільтри, буде вибрано записи,
state
яких єdraft
іdelay
менше 15.separator
можна використовувати для розділення груп фільтрів у простих представленнях пошуку
group
можна використовувати для розділення груп фільтрів, легше читати, ніж
separator
у складних представленнях пошукуsearchpanel
дозволяє відобразити панель пошуку ліворуч від будь-якого перегляду кількох записів. За замовчуванням у режимах представленнях списку та канбану ввімкнено панель пошуку. Панель пошуку можна активувати на інших видах за допомогою атрибута:
view_types
відокремлений комами список типів представлення, на яких можна ввімкнути панель пошуку за замовчуванням: „tree,kanban“
Цей інструмент дозволяє швидко фільтрувати дані на основі заданих полів. Поля вказані як прямі дочірні елементи
searchpanel
з назвою тегуfield
і наступними атрибутами:name
(обов’язково)назва поля для фільтрації
select
визначає поведінку та відображення. Можливі значення
one
(за замовчуванням) можна вибрати не більше одного значення. Підтримувані типи полів: many2one і selection.multi
можна вибрати кілька значень (прапорці). Підтримувані типи полів: many2one, many2many та selection.
groups
обмежується окремими користувачами
string
визначає мітку для відображення
icon
вказує, яка піктограма використовується
color
визначає колір значка
Додаткові необов’язкові атрибути доступні у випадку
multi
:enable_counters
за замовчуванням значення false. Якщо встановлено значення true, лічильники записів обчислюватимуться та відображатимуться, якщо значення відмінні від нуля.
Ця функція була реалізована на випадок, якщо продуктивність буде надто поганою.
Ще один спосіб вирішити проблеми з продуктивністю – належним чином перевизначити методи
search_panel_select_range
іsearch_panel_select_multi_range
.expand
за замовчуванням значення false. Якщо встановлено значення false, категорії або фільтри з 0 записами будуть приховані.
limit
за замовчуванням - 200. Ціле число, що визначає максимальну кількість значень, які потрібно отримати для поля. Якщо ліміт досягнуто, на панелі пошуку не буде відображено жодних значень, а натомість з’явиться повідомлення про помилку, оскільки ми вважаємо, що це марно/погано з точки зору продуктивності. Усі значення буде отримано, якщо встановлено значення 0.
Додаткові додаткові атрибути доступні відповідно до вибраного випадку:
Для випадку
one
:hierarchize
(доступно лише для полів many2one) за замовчуванням - true. Обробляє стиль відображення категорій:
Якщо встановлено справжні дочірні категорії, вони відображатимуться під їхнім пов’язаним батьківським. Якщо ні, усі категорії відображатимуться на одному рівні.
Для
multi
випадку:domain
:визначає умови, яким мають задовольняти записи спільної моделі.
Домен може використовуватися для вираження залежності від іншого поля (з select=»one») панелі пошуку. Розгляньте /!Цей атрибут несумісний із select=»one» з увімкненими лічильниками; якщо select=»multi» має атрибут
domain
, лічильники всіх select=»one» будуть вимкнені.<searchpanel> <field name="department_id"/> <field name="manager_id" select="multi" domain="[('department_id', '=', department_id)]"/> <searchpanel/>
У наведеному вище прикладі діапазон значень manager_id (імена менеджерів), доступний на екрані, залежатиме від поточного значення, вибраного для поля
department_id
.groupby
: назва поля спільної моделі (доступно лише для полів many2one і many2many). Значення будуть згруповані за цим полем.
Пошук за умовчанням¶
Поля пошуку та фільтри можна налаштувати через контекст
дії за допомогою ключів search_default_name
. Для полів значення має бути значенням, яке потрібно встановити в полі, для фільтрів це логічне значення або число. Наприклад, припустивши, що foo
є полем, а bar
є фільтром, контекст дії:
{
'search_default_foo': 'acro',
'search_default_bar': 1
}
автоматично ввімкне фільтр bar
і здійснить пошук у полі foo
acro.
Числове значення (від 1 до 99) можна використовувати для опису порядку груп за замовчуванням. Наприклад, якщо foo
і bar
посилаються на два groupby
{
'search_default_foo': 2,
'search_default_bar': 1
}
має ефект, щоб активувати спочатку bar
, а потім foo
.