Chapter 9: Ready For Some Action?¶
So far we have mostly built our module by declaring fields and views. We just introduced business logic in the previous chapter thanks to computed fields and onchanges. In any real business scenario, we would want to link some business logic to action buttons. In our real estate example, we would like to be able to:
скасувати або визначити майно як продане
прийняти або відмовитися від пропозиції
Можна заперечити, що ми вже можемо робити ці речі, змінюючи стан вручну, але це не дуже зручно. Крім того, ми хочемо додати додаткову обробку: коли пропозиція приймається, ми хочемо встановити ціну продажу та покупця майна.
Тип об’єкта¶
Reference: the documentation related to this topic can be found in Дії and Управління помилками.
Примітка
Ціль: у кінці цього розділу:
Ви повинні мати можливість скасувати або встановити майно як продане:

Скасована власність не може бути продана, а продана власність не може бути скасована. Для ясності до подання додано поле 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
.Очікуваний результат див. на другому зображенні Ціль.
Порада: щоб використовувати піктограму як кнопку, перегляньте цей приклад.
Коли пропозиція прийнята, встановіть покупця та ціну продажу відповідного майна.
Очікуваний результат див. на третьому зображенні Ціль.
Зверніть увагу: в реальному житті на дану нерухомість може бути прийнята лише одна пропозиція!
Тип дії¶
In Chapter 5: Finally, Some UI To Play With, we created an action that was linked to a menu. You may be wondering if it is possible to link an action to a button. Good news, it is! One way to do it is:
<button type="action" name="%(test.test_model_action)d" string="My Action"/>
Ми використовуємо type="action"
і посилаємося на зовнішній ідентифікатор в name
.
In the next chapter we’ll see how we can prevent encoding incorrect data in Odoo.