Public release from ruodoo-project: 19.0 - 2026-07-26 21:17:35 UTC

This commit is contained in:
CI Publish Bot
2026-07-26 21:17:45 +00:00
commit 4f7b594ec8
1335 changed files with 191620 additions and 0 deletions

194
directive_test/TECHNICAL.md Normal file
View File

@ -0,0 +1,194 @@
# 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` и реализует два элемента:
```python
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`.