Действия

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

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

type
категория текущего действия, определяет, какие поля могут использоваться и как интерпретируется действие
name
короткое, удобочитаемое описание действия для отображения в интерфейсе клиента
binding_model_id

если установлено, действие доступно в экшенбаре для данной модели

Клиент может получить действие в 4-х видах:

  • False
    если какое либо диалоговое окно открыто то оно закроется
  • Строка
    если действие клиента совпадает, интерпретируется как тег клиентского действия, иначе рассматривать как число
  • Число
    считывает соответствующую запись действия из базы данных, может быть id в базе данных или external id
  • Словарь
    рассматривается в качестве дескриптора действия клиента, а затем выполняется

Биндинги

Помимо двух обязательных атрибутов, все действия также имеют общие необязательные атрибуты, которые используются для представления действия в контекстном меню произвольной модели:

binding_model_id
имя модели, с которой это действие связано
binding_type

указывает тип привязки, который в основном зависит от контекстного меню, в котором будет отображаться действие

action (по умолчанию)
Указывает, что действие появится в контекстном меню Action связанной модели.
report
Указывает, что действие будет отображаться в контекстном меню Print связанной модели.
binding_view_types
разделенный запятыми список типов представлений, для которых действие появится в контекстном меню, в основном это «List» и/или «Form». По умолчанию list,form (и List, и Form)

Действия Окна (Window Actions) (ir.actions.act_window)

Это наиболее распространенный тип действия, используется для визуализации моделей с помощью представлений: действия окна определяются набор представлений (или конкретного представления) для модели (или конкретного набора записей модели).

Его поля:

res_model
модель, к которой будет применено представление
views
Список пар (view_id, view_type). Второй элемент каждой пары - это категория представления (List, Form, Graph, …), а первый - это необязательный id базы данных (или False). Если id не указан, клиенту запросит возьмет представление указанного типа для запрошенной модели (это выполняется автоматически fields_view_get()). Тип представления, указанный в списке первым, будет назначаться по умолчанию и откроется при выполнении действия. Каждый тип представления должен быть указан в списке только один раз
res_id (необязательный параметр)
если представление form стоит по умолчанию, то этот параметр определяет запись, которая будет загружена в форму (в противном случае запись будет создана)
search_view_id (необязательный параметр)
пара (id, name), id - идентификатор базы данных для конкретного представления поиска, который будет загружен для действия. По умолчанию берется представление поиска назначенное по умолчанию для модели
target (необязательный параметр)
Определяет будут ли представления открыты: в области основного контента (current), в полноэкранном режиме (fullscreen) или в диалоговом окне/попапе (new). Используйте main вместо current, чтобы сбросить хлебные крошки(breadcrumbs). По умолчанию используется current.
context (необязательный параметр)
дополнительные данные для контекста, передаваемого в представления
domain (необязательный параметр)
фильтр, который добавляется ко всем поисковым запросам
limit (необязательный параметр)
количество записей, отображаемых в представлении List по умолчанию. По умолчанию 80

Например, для открытия клиентов (партнеров с установленным флагом customer) в представлении List и Form:

{
    "type": "ir.actions.act_window",
    "res_model": "res.partner",
    "views": [[False, "tree"], [False, "form"]],
    "domain": [["customer", "=", true]],
}

Или, чтобы открыть представление Form конкретного продукта (полученного отдельно) в новом диалоговом окне:

{
    "type": "ir.actions.act_window",
    "res_model": "product.product",
    "views": [[False, "form"]],
    "res_id": a_product_id,
    "target": "new",
}

Действия окна, хранящиеся в базе данных имеют несколько различных полей, которые игнорируются клиентами, и используются в основном для составления списка представлений views:

view_mode (default= tree,form )
Список типов представлений, разделенных запятыми, в виде строки (БЕЗ ПРОБЕЛОВ). Все эти типы будут присутствовать в созданном списке views (с как минимум view_id равным False)
view_ids

M2M1 ссылка на объекты представлений, определяет начальное содержание views

view_id
конкретное представление добавляется к списку views в случае когда его тип является частью списка view_mode и еще не заполнен одним из представлений в view_ids

Это используется в основном когда действия определяются с помощью Файлы с данными:

<record model="ir.actions.act_window" id="test_action">
    <field name="name">A Test Action</field>
    <field name="res_model">some.model</field>
    <field name="view_mode">graph</field>
    <field name="view_id" ref="my_specific_view"/>
</record>

будет использовано «my_specific_view» представление, даже в том случае если оно не является представлением по умолчанию для данной модели.

Составление последовательности views на стороне сервера состоит в следующем:

  • берется каждый (id, type) из view_ids (отсортированный по sequence)
  • если view_id определен а его тип еще на заполнен, добавляется его (id, type)
  • для каждого незаполненного тип в view_mode, добавляется (False, type)
[1] технически не M2M: добавляет поле последовательности и может состоять только из типа представления без id представления.

URL действия (ir.actions.act_url)

Позволяет открывать URL (вебсайт/веб страница) через действие Odoo. Может быть настроено с помощью двух полей:

url
адрес, который открывается, когда срабатывает действие
target
открывает адрес в новом окне/вкладке, если установлен параметр new. Заменяет текущую страницу следующей, если self. По умолчанию new
{
    "type": "ir.actions.act_url",
    "url": "https://odoo.com",
    "target": "self",
}

заменит текущее содержимое страницы официальным сайтом Odoo.

Действия Сервера (ir.actions.server)

class odoo.addons.base.models.ir_actions.IrActionsServer(pool, cr)[исходный код]

Модель действий сервера. Действие сервера работает на модели base и предлагает различные типы действий, которые можно выполнить автоматически, например, с использованием правил базовых действий, вручную, добавив действие в контекстное меню «More».

Начиная с версии Odoo 8.0, кнопка «Create Menu Action» доступна в представлении Form модели действий. Создает запись в меню «Дополнительно» модели base. Это позволяет легко создавать действия сервера и запускать их в массовом режиме через интерфейс.

Доступные действия:

  • «Execute Python Code»: блок кода Python, который будет выполнен
  • «Create a new Record»: создает новую запись с новыми значениями
  • «Write on a Record»: обновляет значения записи
  • «Execute several actions»: определяет действие, которое запускает другие действия сервера

Позволяет запускать произвольных серверный код из любого допустимого места действия. Только два поля относятся к клиентам:

id
внутренний идентификатор действия сервера для запуска
context (необязательный параметр)
Данные контекста для использования при выполнении действия сервера

Записи в базе данных значительно богаче и могут выполнять ряд конкретных или общих действий, основанных на их state. Некоторые поля (и соответствующее поведение) разделяются между состояниями:

model_id
Модель Odoo связанная с действием.

state

  • code: Выполняет код Python переданный через аргумент code.
  • object_create: Создает новую модель crud_model_id следуя fields_lines спецификациям.
  • object_write: Обновлеят текущие записи указанным в fields_lines способом
  • multi: Выполняет действия указанные в аргументе child_ids.

Поля состояний

В зависимости от их состояния, поведение определяется через различные поля. Соответствующее состояние указывается после каждого поля.

code (код)

кусок Python кода, который будет выполнен при вызове действия

<record model="ir.actions.server" id="print_instance">
    <field name="name">Res Partner Server Action</field>
    <field name="model_id" ref="model_res_partner"/>
    <field name="state">code</field>
    <field name="code">
        raise Warning(record.name)
    </field>
</record>
crud_model_id (create)(required)
модель в которой будет создана новая запись
link_field_id (create)
many2one ссылка на ir.model.fields, определяет m2o поле текущей записи где будут установлены вновь создаваемые записи (модели должны совпадать)
fields_lines (create/write)

поля для переопределения при создании или копировании записи. One2many с полями:

col1
ir.model.fields установить в соответствующей модели (crud_model_id для создания, model_id для обновления)
value
значение для поля интерпретируемое через type
type (value|reference|equation)
Если value установлено, то value поля интерпретируется как буквенное значение (возможно преобразованное), если equation, то value поля интерпретируется как Python выражение и выполняется
child_ids (multi)
Укажите несколько зависимых действий(ir.actions.server), которые необходимо выполнить в состоянии multi. Если действия сами возвращают действия, последнее будет возвращено клиенту как собственное следующее действие multi

Вычисляемый контекст

Ряд ключевых слов, доступных в вычисляемом контексте или окружающих действий сервера:

  • model модель, связанная с действием через model_id
  • record/records запись/набор записей на которых будет исполнено действие, может быть недействительным.
  • env Odoo окружение
  • datetime, dateutil, time, timezone соответствующие Python мудули
  • log: log(message, level='info') функция логирования для записи отладочной информации в таблицу ir.logging
  • Warning конструктор для Warning исключений

Действия отчетов (ir.actions.report.xml)

Инициирует печать отчета

name (обязательный параметр)
полезен только в качестве запоминающегося описания, чтобы можно было найти в списке аналогичных объектов
model (обязательный параметр)
модель к которой относится отчет
report_type (default=qweb-pdf)
укажите qweb-pdf для создания PDF файлов печатных форм, или qweb-html для HTML
report_name (обязательный параметр)
имя отчета (которое будет присвоено выданному PDF файлу)
groups_id
Many2many поле со ссылкой на группы которым разрешено использовать отчет
multi
если установлено True,действие не будет отображаться в представлении Form.
paperformat_id
Many2one формат бумаги, который вы хотите использовать для этого отчета (если не указан, будет использоваться формат компании)
attachment_use

если установлено True, то отчет сгенерируется один раз при первом использовании, и при следующих вызовах будет браться из сохраненной копии.

Может использоваться для отчетов, которые должны генерироваться только один раз (например, по юридическим причинам)

attachment
python выражение, которое определяет имя печатной формы; запись доступна как переменная object

Действия клиента (ir.actions.client)

Запускает действие, которое реализуется полностью на стороне клиента.

tag
идентификатор действия на стороне клиента, произвольная строка. О том как действовать получив, ее клиент должен уже знать
params (необязательный параметр)
словарь Python дополнительных данных для отправки клиенту, наряду с тегом действия клиента
target (необязательный параметр)
Определяет будут ли действия клиента открыты: в области основного контента (current), в полноэкранном режиме (fullscreen) или в диалоговом окне/попапе (new). Используйте main вместо current, чтобы сбросить хлебные крошки(breadcrumbs). По умолчанию используется current.
{
    "type": "ir.actions.client",
    "tag": "pos.ui"
}

говорит клиенту запустить интерфейс Рабочего Места Кассира, сервер вообще не в курсе, как он работает.

Автоматические дейтсвия (ir.cron)

Действия запускаются автоматически с заданной частотой.

name
Название автоматического действия (в основном используется при отображении лога)
interval_number
Число, определяющее длительность interval_type между двумя исполнениями действия
interval_type
Единица измерения длительности интервала (minutes, hours, days, weeks, months,
numbercall
Количество раз, когда это действие должно быть выполнено. Если хотите чтобы действие выполнялось бесконечно, установите значение -1.
doall
Булево значение, уточняющее, нужно ли выполнять пропущенные действия в случае перезапуска сервера.
model_id
Модель, в которой будет называться это действие
code

Код содержащийся в действии. Может быть простой вызов метода модели:

model.<method_name>()
nextcall
Следующая запланированная дата выполнения этого действия (формат date/time)