odoo-8
RPC с использованием API-интерфейса Odoo v8 (функция вызова Python из JavaScript)
Поиск…
замечания
Если вы планируете добавлять новые методы в Python для использования их в RPC из JavaScript, тогда рассмотрите следующие варианты декораторов методов: если вам нужно иметь дело с идентификаторами / наборами записей, то для определения метода python выберите decorator:
- @ api.multi - получить набор записей в вашем методе
- @ api.one - для получения browse_records один за другим в вашем методе в приведенных выше примерах используется @ api.multi, но @ api.one также может использоваться для обработки идентификаторов в зависимости от требований (однако настоятельно рекомендуется использовать @ api.multi вместо @ api.one по соображениям производительности).
Или, если это простая функция, которая не должна иметь дело с записями / идентификаторами, то для метода python выберите декоратор:
- @ api.model - Позволяет быть вежливым с API старого стиля.
- @ api.multi - Опять же, вы можете использовать его здесь также, просто передайте
[ ]
(пустой массив) в качестве первого аргумента в javascript ...
Ссылки: Документация Odoo RPC , Декораторы методов Odoo 8 API
Пример модели Odoo для вызова методов из
class my_model(models.Model):
_name = "my.model"
name = fields.Char('Name')
@api.multi
def foo_manipulate_records_1(self):
""" function returns list of tuples (id,name) """
return [(i.id,i.name) for i in self]
@api.multi
def foo_manipulate_records_2(self, arg1, arg2)
#here you can take advantage of "self" recordset and same time use aditional arguments "arg1", "arg2"
pass
@api.model
def bar_no_deal_with_ids(self, arg1, arg2):
""" concatenate arg1 and arg2 """
return unicode(arg1) + unicode(arg2)
Примеры RPC Odoo
Примеры ниже демонстрируют, как вызвать функцию Python из JavaScript в Odoo 8. В примерах мы называем методы my_model, описанные ранее на этой странице.
Предположим, что в следующих примерах переменная «list_of_ids» содержит список (массив) идентификаторов существующих записей модели «my.model».
- Вызов метода foo_manipulate_records_1, украшенный с помощью @ api.multi :
new instance.web.Model("my.model") .call( "foo_manipulate_records_1", [list_of_ids]) .then(function (result) { // do something with result });
- Вызов метода foo_manipulate_records_2, украшенный @ api.multi :
new instance.web.Model("my.model") .call( "foo_manipulate_records_2", [list_of_ids, arg1, arg2]) .then(function (result) { // do something with result });
- Вызов метода bar_no_deal_with_ids, украшенный с помощью @ api.model :
new instance.web.Model("my.model") .call( "bar_no_deal_with_ids", [arg1, arg2]) .then(function (result) { // do something with result });
Также, если это имеет смысл в зависимости от реализации, вы можете вызвать функцию, украшенную @ api.multi, даже если вам не нужно иметь дело с идентификаторами (просто передайте пустой массив вместо ids, как первый элемент списка аргументов):
new instance.web.Model("my.model") .call( "foo_manipulate_records_2", [[], arg1, arg2]) .then(function (result) { // do something with result });
этот способ может быть полезен в некоторых случаях, поскольку unecorated function в v8.0 api рассматривается как @ api.multi (поскольку @ api.multi является декоратором по умолчанию)
При использовании двух параметров для вызова RPC, которые используются в приведенных выше примерах (имя функции и список аргументов), вы можете использовать третий параметр - словарь аргументов ключевого слова . Настоятельно рекомендуется обходить контекст (в некоторых случаях это может быть даже необходимо), так как это может изменить поведение удаленной процедуры (локализация и т. Д.). Ниже приведен пример с аргументом контекста в вызове RPC (то же самое можно применить ко всем приведенным выше примерам)
var self = this;
new instance.web.Model("my.model")
.call("foo_manipulate_records_2", [[], arg1, arg2], {'context':self.session.user_context})
.then(function (result) {
// do something with result
});
Разумеется, вы также можете использовать пользовательский контекст, если это необходимо, вместо того, чтобы оборачивать существующий, как в этом примере.