Розділ 10: Готові до дій?¶
Поки що ми здебільшого будували наш модуль, оголошуючи поля та представлення. Ми щойно представили бізнес-логіку в попередньому розділі завдяки обчислюваним полям і onchanges. У будь-якому реальному бізнес-сценарії ми хотіли б пов’язати деяку бізнес-логіку з кнопками дій. У нашому прикладі нерухомості ми хотіли б мати можливість:
скасувати або визначити майно як продане
прийняти або відмовитися від пропозиції
Можна заперечити, що ми вже можемо робити ці речі, змінюючи стан вручну, але це не дуже зручно. Крім того, ми хочемо додати додаткову обробку: коли пропозиція приймається, ми хочемо встановити ціну продажу та покупця майна.
Тип дії¶
Посилання: документацію, пов’язану з цією темою, можна знайти в Дії і Управління помилками.
Примітка
Ціль: у кінці цього розділу:
Ви повинні мати можливість скасувати або встановити майно як продане:

Скасована власність не може бути продана, а продана власність не може бути скасована. Для ясності до подання додано поле state
.
Ви повинні мати можливість прийняти або відхилити пропозицію:

Після того, як пропозиція прийнята, потрібно встановити ціну продажу та покупця:

У нашому модулі нерухомості ми хочемо зв’язати бізнес-логіку з деякими кнопками. Найпоширеніший спосіб зробити це:
Додайте кнопку в представленні, наприклад, у
header
представлення:
<form>
<header>
<button name="action_do_something" type="object" string="Do Something"/>
</header>
<sheet>
<field name="name"/>
</sheet>
</form>
і пов’яжіть цю кнопку з бізнес-логікою:
from odoo import fields, models
class TestAction(models.Model):
_name = "test.action"
name = fields.Char()
def action_do_something(self):
for record in self:
record.name = "Something"
return True
Якщо призначити type="object"
нашій кнопці, фреймворк Odoo виконає метод Python з name="action_do_something"
для даної моделі.
Перша важлива деталь, на яку слід звернути увагу, полягає в тому, що назва нашого методу не має префікса підкреслення (_
). Це робить наш метод публічним методом, який можна викликати безпосередньо з інтерфейсу Odoo (через виклик RPC). До цього часу всі створені нами методи (compute, onchange) викликалися внутрішньо, тому ми використовували приватні методи з префіксом підкреслення. Ви завжди повинні визначати свої методи як приватні, якщо їх не потрібно викликати з інтерфейсу користувача.
Також зауважте, що ми виконуємо цикл на self
. Завжди припускайте, що метод можна викликати для кількох записів; це краще для повторного використання.
Нарешті, загальнодоступний метод повинен завжди щось повертати, щоб його можна було викликати через XML-RPC. Якщо сумніваєтеся, просто поверніть True
.
У вихідному коді Odoo є сотні прикладів. Одним із прикладів є ця кнопка в представленні та її відповідний метод Python
Exercise
Скасувати та встановити майно як продане.
Додайте кнопки „Скасувати“ та „Продано“ до моделі
estate.property
. Скасовану власність не можна встановити як продану, а продану власність не можна скасувати.Очікуваний результат див. на першому зображенні Ціль.
Порада: щоб викликати помилку, ви можете використати функцію UserError. У вихідному коді Odoo є багато прикладів ;-)
Додайте кнопки „Прийняти“ та „Відхилити“ до моделі
estate.property.offer
.Очікуваний результат див. на другому зображенні Ціль.
Порада: щоб використовувати піктограму як кнопку, перегляньте цей приклад.
Коли пропозиція прийнята, встановіть покупця та ціну продажу відповідного майна.
Очікуваний результат див. на третьому зображенні Ціль.
Зверніть увагу: в реальному житті на дану нерухомість може бути прийнята лише одна пропозиція!
Тип об’єкта¶
У Розділ 6: Нарешті, інтерфейс для гри з ми створили дію, яка була пов’язана з меню. Можливо, вам цікаво, чи можна пов’язати дію з кнопкою. Хороші новини, це так! Один із способів зробити це:
<button type="action" name="%(test.test_model_action)d" string="My Action"/>
Ми використовуємо type="action"
і посилаємося на зовнішній ідентифікатор в name
.
У наступному розділі ми побачимо, як ми можемо запобігти кодуванню неправильних даних в Odoo.