如何在没有RPC的Javascript中获得Odoo记录?



我正在开发和扩展Odoo 14中的POS。

我已经创建了一个新的屏幕,我将能够看到所有记录从poss .order草案状态

在我的javascript文件中,我已经创建了屏幕,并试图通过我的自定义函数获取记录。

JS文件:

odoo.define('opens_pos_order.UnpaidOrdersScreen', function(require) { 
'use strict'; 
const PosComponent = require('point_of_sale.PosComponent'); 
const ProductScreen = require('point_of_sale.ProductScreen'); 
const {useListener} = require('web.custom_hooks'); 
const Registries = require('point_of_sale.Registries'); 
const models = require('point_of_sale.models'); 
var rpc = require('web.rpc')
class UnpaidOrdersScreen extends PosComponent { 
constructor() { 
super (... arguments);

var orders = rpc.query({
model: 'pos.session',
method: 'get_unpaid_orders',
args: [this.env.pos.pos_session.id]
}).then(function (data) {
return data;
});
var res = orders.then(data => console.log(data));

console.log(res)
this.orders = res;
};
back() { 
this.trigger('close-temp-screen'); 
}
} 
UnpaidOrdersScreen.template = 'UnpaidOrdersScreen'; 
Registries.Component.add(UnpaidOrdersScreen); 
return UnpaidOrdersScreen; 
});

这里的问题是RPC,返回是一个承诺对象,所以我的变量this.orders不能得到我期望的结果。

我的python函数是这样的:

from odoo import api, fields, models, _
from odoo.exceptions import AccessError, UserError, ValidationError
import json
class PosSession(models.Model):
_inherit = 'pos.session'

@api.model
def get_unpaid_orders(self, session_id=None):
res = []
orders = self.env['pos.order'].search([('session_id', '=', session_id), ('state', '=', 'draft')])
for order in orders:
o = {
'id': order.id,
'name': order.name,
'price': order.amount_total,
}
res.append(o)
return json.dumps(res)

这个想法是我可以看到这个xml文件中的所有记录:

<?xml version="1.0" encoding="UTF-8"?> 
<templates id="template" xml:space="preserve"> 
<t t-name="UnpaidOrdersScreen" owl="1"> 
<div class="clientlist-screen screen"> 
<div class="screen-content"> 
<div class="top-content"> 
<div class="button back" t-on-click="back"> 
Back 
</div> 
</div> 
<section class="full-content"> 
<div class="client-window"> 
<section class="subwindow list">
<div class="subwindow-container">
<div class="subwindow-container-fix scrollable-y"> 
<table class="client-list"> 
<thead> 
<tr> 
<th> Name </th> 
<th> Orders </th> 
</tr> 
</thead> 
<tbody>
<t t-foreach="categories" t-as="categ" t-key="categ.id"> 
<tr> 
<td> <t t-esc="categ.name"/> </td> 
</tr> 
</t>
</tbody> 
</table> 
</div> 
</div> 
</section> 
</div> 
</section> 
</div> 
</div> 
</t> 
</templates>

是否有其他方法从Javascript表中获取记录?或者我怎么能从我的函数返回一个非承诺对象?

对于ooo14,您可以扩展point_of_sale.OrderWidget来获取订单例如:

odoo.define('custom_module_name.OrderWidget', function(require) {
'use strict';
const OrderWidget = require('point_of_sale.OrderWidget');
const Registries = require('point_of_sale.Registries');

const PosCuOrderWidget = OrderWidget => class extends OrderWidget {
_updateSummary() {

var order_lines = this.env.pos.get_order_list();

// Do some operations
}
};
Registries.Component.extend(OrderWidget, PosCuOrderWidget);
return OrderWidget;
});

我认为如果你在一个单独的方法中异步调用它,它可能会工作。请试试这个

class UnpaidOrdersScreen extends PosComponent { 
constructor() { 
super (... arguments);

var orders = this.get_orders()
var res = orders.then(data => console.log(data));

console.log(res)
this.orders = res;
};
back() { 
this.trigger('close-temp-screen'); 
}
async get_orders(){
var result = await this.rpc({
model: 'pos.session',
method: 'get_unpaid_orders',
args: [this.env.pos.pos_session.id]
})
return result
}
} 

这就解决了使用models.js的问题。下面是一个例子:

在models.js:

...
},
example: function(){
this.unpaid_orders = this.get_unpaid_orders_example();
this.unpaid_orders.then(result => this.unpaid_orders = result);
},
get_unpaid_orders_example: function() {
self = this;
return rpc.query({
model: 'pos.session',
method: 'get_unpaid_orders',
args: [self.env.pos.pos_session.id],
}).then(function(result){
return result;
});
},
...