【问题标题】:How to get Odoo records in Javascript without RPC?如何在没有 RPC 的情况下在 Javascript 中获取 Odoo 记录?
【发布时间】:2021-11-01 01:05:20
【问题描述】:

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

我创建了一个新屏幕,可以在其中查看 pos.order 中处于 draft 状态的所有记录。

在我的 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,返回的是一个 Promise 对象,所以我的变量 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 中的表中获取记录吗? 或者我怎样才能从我的函数中返回一个非 Promise 对象?

【问题讨论】:

    标签: javascript python odoo odoo-14


    【解决方案1】:

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

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

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:

    对于Odoo14,您可以扩展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;
    
    });
    

    【讨论】:

    • 不能满足我的需要...因为我想要的是获得在前一个会话中创建的“草稿”订单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多