odoo-8
RPC utilisant l'API Odoo v8 (fonction Call Python à partir de JavaScript)
Recherche…
Remarques
Si vous envisagez d'ajouter de nouvelles méthodes en Python pour les utiliser dans RPC à partir de JavaScript, envisagez les options suivantes pour les décorateurs de méthodes: si vous devez gérer les identifiants / jeux d'enregistrements, puis la définition de méthode python, choisissez décorateur:
- @ api.multi - pour obtenir un jeu d' enregistrements dans votre méthode
- @ api.one - pour obtenir browse_records un à un dans votre méthode in example ci-dessus examples @ api.multi est utilisé, mais @ api.one peut également être utilisé pour traiter les identifiants, selon les besoins (il est cependant fortement recommandé d'utiliser @ api.multi au lieu de @ api.one pour des raisons de performances).
Ou si c'est une fonction simple qui n'a pas à gérer les enregistrements / identifiants, alors pour la méthode python, choisissez décorateur:
- @ api.model - Permet d'être poli avec l'ancienne API.
- @ api.multi - Encore une fois, vous pouvez aussi l'utiliser ici, passez simplement
[ ]
(tableau vide) en premier argument dans javascript ...
Références: documentation Odoo RPC , décorateurs de méthodes Odoo 8 API
Un exemple de modèle Odoo pour appeler des méthodes depuis
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)
Odoo RPC exemples
Les exemples ci-dessous montrent comment appeler la fonction Python depuis JavaScript dans Odoo 8. Dans les exemples, nous appelons les méthodes de my_model décrites plus haut sur cette page.
Nous supposons que dans les exemples suivants, la variable "list_of_ids" contient la liste (tableau) des identifiants des enregistrements existants du modèle "my.model".
- Appel de la méthode foo_manipulate_records_1 décoré avec @ api.multi :
new instance.web.Model("my.model") .call( "foo_manipulate_records_1", [list_of_ids]) .then(function (result) { // do something with result });
- Appel de la méthode foo_manipulate_records_2 décoré avec @ 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 });
- Appel de la méthode bar_no_deal_with_ids décoré avec @ api.model :
new instance.web.Model("my.model") .call( "bar_no_deal_with_ids", [arg1, arg2]) .then(function (result) { // do something with result });
Aussi, si cela a du sens selon l'implémentation, alors vous pouvez appeler la fonction décorée avec @ api.multi même si vous n'avez pas à gérer les identifiants (passez simplement un tableau vide à la place des identifiants, comme premier élément de la liste d'arguments):
new instance.web.Model("my.model") .call( "foo_manipulate_records_2", [[], arg1, arg2]) .then(function (result) { // do something with result });
Cette façon de faire peut être utile dans certains cas, car la fonction non décorée dans la version 8.0 api est considérée comme @ api.multi (comme @ api.multi est un décorateur par défaut)
Si vous utilisez deux paramètres pour l'appel RPC utilisés dans les exemples ci-dessus (le nom de la fonction et la liste d'arguments), vous pouvez utiliser le troisième paramètre - un dictionnaire d'arguments de mots clés . Il est fortement recommandé de contourner un contexte (dans certains cas, cela peut même être nécessaire), car cela peut changer le comportement de la procédure distante (localisation, etc.). Voir ci-dessous l'exemple avec un argument de contexte dans l'appel RPC (même chose pour tous les exemples ci-dessus)
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
});
Bien sûr, vous pouvez également utiliser un contexte personnalisé, si nécessaire, plutôt que de contourner l'existant comme dans cet exemple.