Представлення¶
Представлення - це те, що визначає, як записи мають відображатися кінцевим користувачам. Вони вказані в 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Корисно лише як мнемоніка/опис представлення, коли шукаєте його в певному списку.
modelCharМодель, пов’язана з представленням, якщо застосовно.
priorityIntegerКоли
(модель, тип)запитує представлення, буде повернуто представлення, яке відповідає моделі та типу, з найнижчим пріоритетом (це представлення за замовчуванням).Він також визначає порядок застосування представлень під час переглянути успадкування.
groups_idMany2many->odoo.addons.base.models.res_users.GroupsГрупи, яким дозволено використовувати/доступ до поточного перегляду.
Якщо подання розширює існуюче подання, розширення буде застосовано лише для певного користувача, якщо він має доступ до наданого
groups_id.archTextОпис макета перегляду.
Атрибути¶
Різні типи представлення мають широкий набір атрибутів, що дозволяє налаштовувати загальну поведінку. Деякі основні атрибути будуть пояснені тут. Не всі вони впливають на всі типи представлень.
Примітка
Поточний контекст і права доступу користувача також можуть впливати на можливості перегляду.
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_idMany2oneбатьківське представлення поточного представлення, не встановлено за замовчуванням. Вкажіть батьківського елемента за допомогою атрибута
ref:<field name="inherit_id" ref="library.view_book_form"/>
modeSelection: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абоbeforepositionатрибут для переміщення вузла.<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()можна використовувати для отримання деякої мета-інформації. Ці методи також доступні безпосередньо в контексті шаблону, і до них не потрібно звертатися черезwidgetrecordоб’єкт з усіма запитаними полями як його атрибутами. Кожне поле має два атрибути
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дозволяє швидке створення події після кліку: запитує у користувача лише
nameта намагається створити нову подію лише з цим ім’ям та часом події кліку. Повертається до повного діалогового вікна форми, якщо швидке створення не вдається.all_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(необов’язково)якщо істина, поле не відображатиметься ні в активних показниках, ні в параметрах, які можна вибрати (корисно для полів, які не мають сенсу агрегувати, наприклад, поля в різних одиницях, наприклад, € та $).
Інф. панель¶
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не слід розміщувати вgroupgroupвикористовується для визначення макетів стовпців у формах. За замовчуванням групи визначають 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_rightfloats поле у відповідному напрямку
oe_read_only,oe_edit_onlyлише відображає поле у відповідному режимі форми
oe_avatarдля полів зображення відображає зображення як «avatar» (квадрат, максимальний розмір 90x90, деякі декоратори зображення)
groupsвідображає поле лише для певних користувачів
on_changeвикликає вказаний метод, коли значення цього поля редагується, може генерувати оновлення інших полів або відображати попередження для користувача
Застаріло починаючи з версії 8.0: Використовуйте
odoo.api.onchange()на моделіattrsдинамічні мета-параметри на основі записаних значень
domainлише для реляційних полів, фільтри для застосування під час відображення наявних записів для вибору
contextлише для реляційних полів, контекст для передачі під час отримання можливих значень
readonlyвідображати поле як у режимі лише для читання, так і в режимі редагування, але ніколи не робити його доступним для редагування
requiredстворює помилку та запобігає збереженню запису, якщо поле не має значення
nolabelне відображати автоматично мітку поля, має сенс, лише якщо поле є прямим дочірнім елементом
groupplaceholderдовідкове повідомлення для відображення в 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):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, представлення ганта розпочнеться з першого запису, а не з початку року/місяця/дня.
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використовується лише для
barдіаграм. Якщо присутній та встановлено значення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()можна використовувати для отримання деякої мета-інформації. Ці методи також доступні безпосередньо в контексті шаблону, і до них не потрібно звертатися черезwidgetrecordоб’єкт з усіма запитаними полями як його атрибутами. Кожне поле має два атрибути
valueіraw_value, перше форматується відповідно до поточних параметрів користувача, останнє є прямим значенням ізread()(окрім для полів дати та часу, які відформатовані відповідно до локалі користувача)contextпоточний контекст, що походить від дії, і поле one2many або many2many у випадку представлення Канбан, вбудованого в представленні Форми
user_contextself-explanatory
read_only_modeself-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=1default_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дозволяє disактивувати відповідну дію у вигляді, встановивши відповідний атрибут у значення
falselimitстандартний розмір сторінки. Це має бути додатне ціле число
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див.
typeargsдив.
typeattrsдинамічні атрибути на основі значень записів.
Зіставлення атрибутів на домени, домени оцінюються в контексті запису поточного рядка, якщо
Trueвідповідний атрибут встановлено в комірці.Можливий атрибут
invisible(приховує кнопку).statesскорочення для
invisibleattrs: список станів, розділених комами, вимагає, щоб модель мала полеstateі щоб воно використовувалося в поданні.Робить кнопку
невидимою, якщо запис не в одному з перелічених станівНебезпека
Використання
statesу поєднанні зattrsможе призвести до несподіваних результатів, оскільки домени поєднуються з логічним AND.contextоб’єднано з контекстом представлення під час виконання виклику кнопки Odoo
fieldвизначає стовпець, де має відображатися відповідне поле для кожного запису. Можна використовувати такі атрибути:
nameназва поля для відображення в поточній моделі. Дана назва може використати лише один раз для предмставлення
stringзаголовок стовпця поля (за замовчуванням використовується
stringполя моделі)invisibleотримує та зберігає поле, але не відображає стовпець у таблиці. Необхідно для полів, які не повинні відображатися, але використовуються, наприклад,
@colorsgroupsперелічує групи, які мають бачити поле
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.