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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow