7.7 KiB
Directive Test
name: directive_test
version: 19.0.1.0.0
author: Mk.Lab
depends: directive_layer, base_user_role, sale, mail, account, account_payment, mrp, project, stock
Назначение
Демонстрационный модуль интеграции directive_layer с базовыми моделями Odoo. Служит референсом для разработчиков при подключении директив к новым моделям.
Паттерн интеграции
Каждая интегрируемая модель подключается к directive.mixin через _inherit и реализует два элемента:
class SomeModel(models.Model):
_name = 'some.model'
_inherit = ['some.model', 'directive.mixin']
def _directive_generation_spec(self) -> list[dict]:
return [{ ...spec... }]
def action_executor_response(self, payload: dict) -> bool:
# вызывается при завершении директивы
return True
Структура спецификации _directive_generation_spec()
| Ключ | Описание |
|---|---|
event |
Тип события: on_write или on_callback |
key |
Уникальный ключ директивы (для режима create_once) |
field |
Имя поля (для on_write) |
from |
Значение поля до изменения |
to |
Значение поля после изменения |
callback |
Имя метода (для on_callback) |
when |
Момент вызова: after |
if_result |
Условие на результат метода |
use_record_template_group |
Брать группу шаблонов из поля записи |
mode |
create_once — создать директиву только один раз |
domain |
Дополнительный фильтр по записям модели |
Интегрированные модели
project.task + directive.mixin
Файл: models/project_task.py
| Параметр | Значение |
|---|---|
| Событие | on_write |
| Поле | stage_id |
| Переход | от ID 9 к ID 10 |
| Тип исполнителя | human |
Callback directive_on_done_post_message(payload) — публикует в чат задачи сообщение: «Директива выполнена: {directive_name}».
account.move + directive.mixin
Файл: models/account_move.py
| Параметр | Значение |
|---|---|
| Событие | on_write |
| Поле | state |
| Переход | draft → posted |
| Domain | move_type = 'in_invoice' (только входящие счета) |
| Тип исполнителя | software (аудит-бот) |
Callback action_audit_response(payload) — публикует в чат счёта результат проверки с оценкой риска.
sale.order + directive.mixin
Файл: models/sale_order.py
| Параметр | Значение |
|---|---|
| Событие | on_write |
| Поле | state |
| Переход | draft → sale |
| Тип исполнителя | software (WMS-агент) |
Callback action_wms_response(payload) — публикует в чат заказа информацию о резервировании товара с указанием ячейки.
account.payment + directive.mixin
Файл: models/account_payment.py
| Параметр | Значение |
|---|---|
| Событие | on_write |
| Поле | state |
| Переход | draft → in_process |
| Domain | payment_type = 'outbound' (только исходящие) |
| Тип исполнителя | software (банковский шлюз) |
Callback action_bank_gateway_response(payload) — публикует в чат платежа банковский референс в формате REF-{id}-X99.
stock.picking + directive.mixin
Файл: models/stock_picking.py
| Параметр | Значение |
|---|---|
| Событие | on_callback |
| Метод | button_validate |
| Когда | after |
| Условие | if_result: True |
| Тип исполнителя | software (AGV-робот) |
Callback action_agv_callback(payload) — публикует в чат перемещения информацию о доставке в зону производства.
mrp.workorder + directive.mixin
Файл: models/mrp_workorder.py
| Параметр | Значение |
|---|---|
| Событие | on_write |
| Поле | state |
| Переход | pending → ready |
| Domain | name ilike 'резка' |
| Тип исполнителя | machine (IoT/CNC) |
Callback action_iot_signal(payload) — публикует в чат рабочей операции телеметрию оборудования (температура шпинделя, вибрация) и обновляет заголовок производственного заказа.
mrp.production (расширение без mixin)
Файл: models/mrp_workorder.py
Добавляет метод action_choose_directive_group() в модель производственного заказа. Метод берёт первый рабочий центр из workorder_ids и открывает визард directive.choose.group.wizard с active_model='mrp.workorder'. При отсутствии рабочих центров выводит предупреждение.
Имитация программных агентов (cron)
Файл: models/directive_directive.py
Метод: _cron_simulate_system_agents()
Запускается планировщиком для автоматического продвижения директив программных и машинных исполнителей по стадиям:
| Текущая стадия | Действие |
|---|---|
planned |
_set_stage('in_progress') |
in_progress |
action_done() |
Фильтр: executor_type in ['software', 'machine'], stage_code in ['draft', 'planned', 'in_progress'].
Представления
Файл: views/project_task_views.xml
Добавляет единообразный набор элементов в формы шести объектов: project.task, sale.order, account.move, account.payment, stock.picking, mrp.production.
| Элемент | Расположение | Описание |
|---|---|---|
| Кнопка «Выбрать тип» | header |
Открывает визард выбора группы шаблонов |
| Кнопка «Директивы» | oe_button_box |
Открывает список директив объекта |
Поле directive_execution_status |
sheet |
Текущий статус исполнения (readonly) |
Для задачи (project.task) дополнительно добавляется кнопка «Demo: Callback» для ручного тестирования механизма callback.
Демо-пользователи
Файл: data/users.xml
| XML ID | Логин | Имя |
|---|---|---|
user_directive_executor |
directive_executor |
Directive Executor |
user_directive_requester |
directive_requester |
Directive Requester |
user_directive_dispatcher |
directive_dispatcher |
Directive Dispatcher |
Все пользователи получают только base.group_user. Роли директив назначаются через base_user_role.