odoo-8
RPC utilizando la API de Odoo v8 (función Call Python desde JavaScript)
Buscar..
Observaciones
Si está considerando agregar nuevos métodos en Python para usarlos en RPC desde JavaScript, considere las siguientes opciones de decoradores de métodos: si tiene que lidiar con identificadores / conjuntos de registros, entonces para la definición del método python elija decorador:
- @ api.multi - para obtener un conjunto de registros en su método
- @ api.one: para obtener browse_records uno por uno en su método en los ejemplos anteriores se usa @ api.multi, pero @ api.one también se puede usar para tratar los identificadores, dependiendo de los requisitos (Sin embargo, se recomienda encarecidamente usar @ api.multi en lugar de @ api.one por razones de rendimiento).
O si es una función simple que no tiene que lidiar con registros / ID, entonces para el método python elige decorador:
- @ api.model - Permite ser educado con la API de estilo antiguo.
- @ api.multi - Nuevamente, también puede usarlo aquí, simplemente pase
[ ]
(matriz vacía) como primer argumento en javascript ...
Referencias: documentación de Odoo RPC , decoradores de métodos Odoo 8 API
Un ejemplo de modelo de Odoo para llamar a métodos de
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)
Ejemplos de Odoo RPC
Los siguientes ejemplos muestran cómo llamar a la función Python desde JavaScript en Odoo 8. En los ejemplos, llamamos a los métodos de my_model descritos anteriormente en esta página.
Suponemos que en los siguientes ejemplos, la variable "list_of_ids" contiene una lista (matriz) de identificadores de registros existentes del modelo "my.model".
- Llamada del método foo_manipulate_records_1 decorado con @ api.multi :
new instance.web.Model("my.model") .call( "foo_manipulate_records_1", [list_of_ids]) .then(function (result) { // do something with result });
- Llamada del método foo_manipulate_records_2 decorado con @ 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 });
- Llamada del método bar_no_deal_with_ids decorado con @ api.model :
new instance.web.Model("my.model") .call( "bar_no_deal_with_ids", [arg1, arg2]) .then(function (result) { // do something with result });
Además, si tiene algún sentido dependiendo de la implementación, puede llamar a la función decorada con @ api.multi incluso si no tiene que lidiar con identificadores (simplemente pase una matriz vacía en lugar de identificadores, como primer elemento de la lista de argumentos):
new instance.web.Model("my.model") .call( "foo_manipulate_records_2", [[], arg1, arg2]) .then(function (result) { // do something with result });
de esta manera puede ser útil en algunos casos, ya que la función no decorada en la vi.0 v8.0 se considera como @ api.multi (ya que @ api.multi es un decorador predeterminado)
Puede utilizar el tercer parámetro , un diccionario de argumentos de palabras clave, a partir de dos parámetros para llamadas RPC que se utilizan en los ejemplos anteriores (el nombre de la función y la lista de argumentos). Es muy recomendable cambiar el contexto (en algunos casos puede ser incluso necesario), ya que puede cambiar el comportamiento del procedimiento remoto (localización, etc.). Vea a continuación el ejemplo con argumento de contexto en la llamada RPC (se puede aplicar lo mismo a todos los ejemplos anteriores)
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
});
Por supuesto, también puede usar un contexto personalizado, si es necesario, en lugar de cambiar el existente como en este ejemplo.