2017-12-15 5 views
0

Originalcode aus dem Point of Sale-ModulWie kann ich eine Variable von einem JavaScript versprechen (Python-Aufrufe), den ausstehenden Zustand in Odoo vermeiden?

Im point_of_sale Modul gibt es eine Liste von Objekten, wie die folgende

module.PosModel = Backbone.Model.extend({ 

    models: { 

     // [...] 

     { 
      model: 'pos.session', 
      fields: ['id', 'journal_ids','name','user_id','config_id','start_at','stop_at','sequence_number','login_number'], 
      domain: function(self){ return [['state','=','opened'],['user_id','=',self.session.uid]]; }, 
      loaded: function(self,pos_sessions){ 
       self.pos_session = pos_sessions[0]; 

       var orders = self.db.get_orders(); 
       for (var i = 0; i < orders.length; i++) { 
        self.pos_session.sequence_number = Math.max(self.pos_session.sequence_number, orders[i].data.sequence_number+1); 
       } 
      }, 
     }, 
     { 
      model: 'product.product', 
      fields: ['display_name', 'list_price','price','pos_categ_id', 'taxes_id', 'ean13', 'default_code', 
         'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type', 'description_sale', 'description', 
         'product_tmpl_id'], 
      domain: [['sale_ok','=',true],['available_in_pos','=',true]], 
      context: function(self){ return { pricelist: self.pricelist.id, display_default_code: false }; }, 
      loaded: function(self, products){ 
       self.db.add_products(products); 
     }, 

     // [...] 

    } 

Und dann die Information der Daten wie diese

geladen wird
load_server_data: function(){ 
    var self = this; 
    var loaded = new $.Deferred(); 
    var progress = 0; 
    var progress_step = 1.0/self.models.length; 
    var tmp = {}; // this is used to share a temporary state between models loaders 

    function load_model(index){ 
     if(index >= self.models.length){ 
      loaded.resolve(); 
     }else{ 
      var model = self.models[index]; 
      self.pos_widget.loading_message(_t('Loading')+' '+(model.label || model.model || ''), progress); 
      var fields = typeof model.fields === 'function' ? model.fields(self,tmp) : model.fields; 
      var domain = typeof model.domain === 'function' ? model.domain(self,tmp) : model.domain; 
      var context = typeof model.context === 'function' ? model.context(self,tmp) : model.context; 
      var ids  = typeof model.ids === 'function'  ? model.ids(self,tmp) : model.ids; 
      progress += progress_step; 


      if(model.model){ 
       if (model.ids) { 
        var records = new instance.web.Model(model.model).call('read',[ids,fields],context); 
       } else { 
        var records = new instance.web.Model(model.model).query(fields).filter(domain).context(context).all() 
       } 

// [...] 

Was ich versucht habe. Zuerst versuchen

Also, ich möchte das Domänenfeld des product.product Modells ändern. Ich versuche dies

if (typeof jQuery === 'undefined') { throw new Error('Product multi POS needs jQuery'); } 

+function ($) { 
    'use strict'; 

    openerp.pos_product_multi_shop = function(instance, module) { 
     var PosModelParent = instance.point_of_sale.PosModel; 
     instance.point_of_sale.PosModel = instance.point_of_sale.PosModel.extend({ 
      load_server_data: function(){ 
       console.log('-- LOAD SERVER DATA'); 
       var self = this; 

       self.models.forEach(function(elem) { 
        if (elem.model == 'product.product') { 
         // return [['id', 'in', [2]]]; // if I return this domain it works well 
         domain_loaded = function() { 
          return new instance.web.Model('product.product').call(
           'get_available_in_pos_ids', 
           [self.pos_session.config_id[0]], 
          ) 
         } 
         elem.domain = $.when(domain_loaded); 
        } 
       }) 

       var loaded = PosModelParent.prototype.load_server_data.apply(this, arguments); 
       return loaded; 
      }, 
     }); 
    } 
}(jQuery); 

Wenn ich eine Domäne direkt zurückgibt, funktioniert es. Aber wenn ich es durch eine Funktion ersetze, die eine Python-Funktion mit call aufruft, wird die Domäne nicht gut geladen: [['sale_ok','=',true],['available_in_pos','=',true]]. Ich habe es mit $.when und ohne es versucht und es funktioniert nicht.

Zusätzlich muss elem.domain eine Funktion sein, da self.pos_session nur existiert, wenn alle vorherigen Modellinformationen ausgeführt werden.

Zweitens versuchen

Ich habe diesen folgenden Code versucht, so gut:

if (elem.model == 'product.product') { 
    // return [['id', 'in', [2]]]; // if I return the domain like this it works 
    console.log('>> OLD DOMAIN') 
    console.log(elem.domain); 
    elem.domain = function() { 
     console.log('>>> PRODUCT SESSION'); 
     console.log(self.pos_session); 
     var product_product_obj = new instance.web.Model('product.product'); 
     return product_product_obj.call(
      'get_available_in_pos_ids', 
      [self.pos_session.config_id[0]], 
     ) 
    } 
    console.log('>> NEW DOMAIN') 
    console.log(elem.domain); 
} 

Also zuerst '>> OLD DOMAIN' gedruckt wird, dann '>> NEW DOMAIN' und endlich '>>> PRODUCT SESSION' wird gedruckt. Also wird die Funktion ausgeführt. Aber die Domains werden nicht gut zurückgegeben.

Dritter Versuch. Mit "dann"

Und ich kann then nicht verwenden, weil ich die variable Zuweisung tun muss. Auf der anderen Seite ist die Zuweisung gut gemacht, wenn ich die neue Domäne drucke, erscheint die Funktion im Protokoll.

Auch wenn ich then verwende ich aus Python das Ergebnis gut

var domain_return = product_product_obj.call(
    'get_available_in_pos_ids', 
    [self.pos_session.config_id[0]], 
).then(function(result) { 
    console.log('>> RESULT: '); 
    console.log(result) 
}); 

ich auch versucht, mit anderen Versprechen immer bin, aber ich habe ein ausstehendes Ergebnis, das ignoriert und alle Produkte werden

elem.domain = function() { 
    return new Promise(function next(resolve, reject) { 
     console.log('>>> PRODUCT SESSION'); 
     console.log(self.pos_session); 
     var product_product_obj = new instance.web.Model('product.product'); 
     var domain_return = product_product_obj.call(
      'get_available_in_pos_ids', 
      [self.pos_session.config_id[0]], 
     ).then(function(result) { 
      console.log('>> RETURN: '); 
      console.log(result); 
      resolve(result); 
     }); 
     console.log('>> DOMAIN RETURN: '); 
     console.log(domain_return); 
    }); 
} 
gezeigt

Der Rest der Domänen des Objekts wird ohne Aufruf von Python-Funktionen berechnet. Also kann ich kein Beispiel von einem anderen Ort kopieren

Also, gibt es eine Möglichkeit, das ausstehende Ergebnis zu vermeiden? Ich kann async/await noch nicht verwenden.

Vielleicht hilft es syncronous zu machen, aber ich weiß, das

Antwort

0

Schließlich fand vermieden werden sollte ich eine Abhilfe die geladene Funktion überschreiben, wo alle Produkte bereits

var PosModelParent = instance.point_of_sale.PosModel; 
instance.point_of_sale.PosModel = instance.point_of_sale.PosModel.extend({ 
    load_server_data: function(){ 
     let self = this; 
     self.models.forEach(function(elem) { 
      if (elem.model == 'product.product') { 
       elem.fields = ['display_name', 'list_price','price','pos_categ_id', 'taxes_id', 'ean13', 'default_code', 
       'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type', 'description_sale', 'description', 
       'product_tmpl_id', 'available_in_pos_ids']; 
       elem.loaded = function(self, products){ 
        console.log('>> PRODUCTS: '); 
        console.log(products); 
        var shop_id = self.pos_session.config_id[0];        
        var new_products = []; 
        products.forEach(function(prod) { 
         if (prod.available_in_pos_ids.includes(shop_id)) { 
          new_products.push(prod); 
         } 
        }) 
        self.db.add_products(new_products); 
       } 
      } 
     }) 
     var loaded = PosModelParent.prototype.load_server_data.apply(this, arguments); 
     return loaded; 
    }, 
}); 
geladen werden
Verwandte Themen