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 wirdload_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