Ricerca…


Osservazioni

Se stai pensando di aggiungere nuovi metodi in Python per usarli in RPC da JavaScript, allora considera le seguenti opzioni di decoratori di metodi: se devi trattare id / recordset, allora per la definizione del metodo python scegli decorator:

  • @ api.multi - per ottenere recordset nel tuo metodo
  • @ api.one - per ottenere browse_records uno ad uno nel tuo metodo negli esempi precedenti @ api.multi è usato, ma @ api.one può anche essere usato per gestire gli id, a seconda dei requisiti (Tuttavia, si consiglia vivamente di usare @ api.multi anziché @ api.one per motivi di prestazioni).

O se è una funzione semplice che non ha a che fare con i record / id allora per il metodo python scegli decoratore:

  • @ api.model: consente di essere educato con le API vecchio stile.
  • @ api.multi - Anche in questo caso puoi usarlo anche qui, basta passare [ ] (array vuoto) come primo argomento in javascript ...

Riferimenti: documentazione Odoo RPC , decoratori del metodo Odoo 8 API

Un esempio di modello Odoo per chiamare i metodi da

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)

Esempi Odoo RPC

Gli esempi che seguono dimostrano come chiamare la funzione Python da JavaScript in Odoo 8. Negli esempi chiamiamo i metodi di my_model descritti all'inizio di questa pagina.
Supponiamo che negli esempi seguenti la variabile "list_of_ids" contenga una lista (array) di id di record esistenti del modello "my.model".

  • Richiamo del metodo foo_manipulate_records_1 decorato con @ api.multi :
    new instance.web.Model("my.model")
        .call( "foo_manipulate_records_1", [list_of_ids])
            .then(function (result) {
                // do something with result
        });

  • Richiamo del metodo foo_manipulate_records_2 decorato 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
        });

  • Chiama il metodo bar_no_deal_with_ids decorato con @ api.model :
    new instance.web.Model("my.model")
        .call( "bar_no_deal_with_ids", [arg1, arg2])
            .then(function (result) {
                // do something with result
        });

Inoltre, se ha qualche senso in base all'implementazione, puoi chiamare la funzione decorata con @ api.multi anche se non hai a che fare con id (basta passare l'array vuoto al posto degli id, come primo elemento dell'elenco degli argomenti):

    new instance.web.Model("my.model")
        .call( "foo_manipulate_records_2", [[], arg1, arg2])
            .then(function (result) {
                // do something with result
        });

in questo modo può essere utile in alcuni casi, poiché la funzione non decorata in v8.0 api è considerata come @ api.multi (come @ api.multi è un decoratore predefinito)

Cxcept di due parametri per la chiamata RPC che vengono utilizzati negli esempi precedenti (il nome della funzione e l'elenco degli argomenti), è possibile utilizzare il terzo parametro , un dizionario di argomenti per le parole chiave . Si consiglia vivamente di aggirare un contesto (in alcuni casi potrebbe anche essere necessario), in quanto potrebbe modificare il comportamento della procedura remota (localizzazione, ecc.). Vedi sotto l'esempio con argomento di contesto in chiamata RPC (lo stesso può essere applicato a tutti gli esempi sopra)

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
    });

Ovviamente puoi anche usare il contesto personalizzato, se necessario, invece di girare quello esistente come in questo esempio.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow