Розділ 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.