Как вызвать сервер Odoo с помощью API

Я определил действие сервера в Odoo 10. Легко создать кнопку в представлении для вызова этого действия сервера, используя идентификатор действия сервера. Например, если идентификатор действия сервера равен 123:

<button name="123" type="action" string="Run Action"/>

Есть ли способ вызвать это действие через API? Я не уверен, как это сделать, поскольку у действия сервера нет имени метода. Это просто идентификатор. Мне также нужно иметь возможность передавать контекст действию. Это возможно?


person flyingL123    schedule 17.06.2017    source источник
comment
Под API вы подразумеваете XML/JSON RPC?   -  person Naglis    schedule 18.06.2017
comment
Да, я имею в виду xml rpc API   -  person flyingL123    schedule 18.06.2017


Ответы (1)


В базовом модуле Odoo определена модель ir.actions.server (base/ir/ir_actions.py). Существует метод run, который можно вызывать из XMLRPC API.

Чтобы использовать контекст, просто добавьте его в вызов как параметр ключевого слова (kwargs) с именем context, например:

models.execute_kw(db, uid, password,
    'res.partner', 'check_access_rights',
    ['read'], {'raise_exception': False, 'context': {'test': True}})

(Пример был расширен из официального примера "Вызов методов")

Это кажется немного волшебным, но это делается здесь.

person CZoellner    schedule 19.06.2017
comment
Но как я могу вызвать этот метод запуска с контекстом? Разве метод не требует, чтобы active_model и active_id передавались в контексте? В противном случае вы не получите доступ к записи в коде действий. - person flyingL123; 19.06.2017
comment
Вы всегда можете вызвать его с локальными созданными контекстами. Как вы используете API: собственный или с помощью библиотеки Python (например, oerpeek)? - person CZoellner; 19.06.2017
comment
Можете ли вы уточнить, что вы подразумеваете под «Вы всегда можете называть это с помощью локальных созданных контекстов»? Я вызываю API из сценариев PHP, используя эту библиотеку. Глядя на документацию Odoo, я не вижу никакого способа передать context к методу. В нем говорится, что каждый вызов execute_kw принимает массив/список параметров, передаваемых по положению, и сопоставление/словарь параметров для передачи по ключевому слову (необязательно). Он ничего не говорит о передаче context методу. - person flyingL123; 19.06.2017
comment
Я отредактировал свой ответ. До сих пор не был уверен, но это возможно :-) - person CZoellner; 19.06.2017
comment
Это удивительно, спасибо, что нашли это. Но мне нужно вызвать run для конкретного экземпляра модели. execute_kw не принимает аргумент ID. Я считаю, что он работает на самом классе модели. Я все еще не могу определить правильный формат для вызова run для определенного действия сервера, а также для передачи контекста. - person flyingL123; 19.06.2017
comment
Метод run определен как multi, поэтому Odoo вызовет его, извлекая идентификаторы из args[0]. Пример: models.execute_kw(db, uid, password, 'ir.actions.server', 'run', ([1,2,3],), {'context': {'test': True}}) запустит действия сервера с идентификаторами 1, 2 и 3. - person CZoellner; 19.06.2017
comment
Я так многому здесь научился. Спасибо. Теперь я вижу, что active_id и active_model присутствуют в контексте действия. Я вижу это, регистрируя env.context. Я вижу значения для active_model = product.product и active_id = 7. Однако действие сервера не имеет никакого значения в параметре record. Там просто написано, что record = None. Разве действие сервера не должно автоматически искать record для меня? - person flyingL123; 19.06.2017
comment
Это должно происходить здесь, но почему-то нет. Действие создано по модели product.product, поэтому я не понимаю, почему бы ему не установить переменную record. Если только self._context не отличается от context, о котором мы говорили. - person flyingL123; 19.06.2017
comment
Это будет глубоко в деталях и далеко от первоначального вопроса. Может быть, вы должны спросить еще один :-) - person CZoellner; 20.06.2017