Odoo自定义Widgets (三)

简介:

大家好,

接着上一章讲,odoo 中的Widgets使用方法。

上一次,我们讲到是利用了odoo中widget的继承机制,继承了fieldminxin 类,然后在其上面进行新的方法添加。

但这里注意,原始方法是没有被修改的。那么,这里就出现了一个问题,以前很多fields已经使用某个widget,如果要更新这个widgets ,但又希望是通过安装插件的方式来更新某个widgets,我们应该如何处理呐?这个时候,就需要用到odoo widgets中的继承方法。

这里,我们还是通过一个实例来讲解。

odoo.define('web_widget_float_formula', function(require) {
    "use strict";

    var form_view = require('web.FormView');
form_view.include({

     // 注意看,这里用了一个 include 方法,之前一直用的是extend
     // 其含义,是在现有挂件对象中,包含新方法
   
        _process_save: function(save_obj) {
            for (var f in this.fields) {
                if (!this.fields.hasOwnProperty(f)) { continue; }
                f = this.fields[f];
                if (f.hasOwnProperty('_formula_text') && f.$el.find('input').length > 0) {
                    f._compute_result();
                    f._clean_formula_text();
                }
            }

            return this._super(save_obj);

            //_super方法,是可以将原始值进行覆盖
        },
    });

跟着这个事例,我们有这样一个需求:

在销售订单中,我们希望通过 扫条码 来添加销售订单SO中的商品。

步骤一:(通过继承,在sale.order 模型中,添加新的方法,叫so_barcode)

class SaleOrder(models.Model):
    _inherit = 'sale.order'
_barcode_scanned = fields.Char("Barcode Scanned", help="Value of the last barcode scanned.", store=False)
 //字段,存储最后被扫描的条码值

    @api.model
    def so_barcode(self, barcode, so_id):
        sale_order = self.env['sale.order'].search([('id', '=', so_id)])
        if not sale_order:
            # 判断销售订单是否已经创建
            raise UserError(_('Please Choose Your Customer And Fix Your Sale Order'))
        product_id = self.env['product.product'].search([('barcode', '=', barcode)])
        //产品id,通过将条码与产品数据库中的条码进行匹配
        sale_order_line = sale_order.order_line.search([('product_id', '=', product_id.id)], limit=1)
        //在销售订单行中,查看 产品 是否已经存在
        if sale_order_line:
            sale_order_line.product_uom_qty = sale_order_line.product_uom_qty + 1
//若已经存在,直接总量添加1
        else:
//若没有存在,在行中添加新的商品
            line_values = {
                'name': product_id.name,
                'product_id': product_id.id,
                'product_qty': 1,
                'product_uom': product_id.product_tmpl_id.uom_id.id,
                'price_unit': product_id.product_tmpl_id.list_price,
                'order_id': sale_order.id,
                'date_planned': datetime.today().strftime(DEFAULT_SERVER_DATETIME_FORMAT),
            }
            sale_order.update({'order_line': [(0, 0, line_values)]})

步骤二:(构建前端挂件,SaleBarcodeHandler)

odoo.define('sale_order_barcode.SaleBarcodeHandler', function (require) {
    "use strict";
    var core = require('web.core');
    var Model = require('web.Model');
    var FormViewBarcodeHandler = require('barcodes.FormViewBarcodeHandler');
var _t = core._t;
//基础方法集的引入
var SaleBarcodeHandler = FormViewBarcodeHandler.extend({
   //继承并拓展原始FormViewBarcodeHandler
 init: function (parent, context) {
         if (parent.ViewManager.action) {
             this.form_view_initial_mode= parent.ViewManager.action.context.form_view_initial_mode;
   //这里的主要目的是让新打开的视图中,是否为可编辑根据父级定义而定
         } else if (parent.ViewManager.view_form) {
             this.form_view_initial_mode= parent.ViewManager.view_form.options.initial_mode;
   //这里的主要目的是让新打开的视图中,是否为可编辑根据父级定义而定
         }
         return this._super.apply(this, arguments);
     },
     start: function () {
         this._super();
         this.so_model = new Model("sale.order");
         this.form_view.options.disable_autofocus = 'true';
         if (this.form_view_initial_mode) {
             this.form_view.options.initial_mode = this.form_view_initial_mode;
         }
     },
   //增加这些方法的目的是什么? - 这个问题是思考题,大家可以回去思考。我们会在下一章节中进行解答
on_barcode_scanned: function(barcode) {
            var self = this;
            var so_id = self.view.datarecord.id
            self.so_model.call('so_barcode',[barcode, so_id]).then(function () {
                self.getParent().reload();
            });
        //一旦,条码被扫描,就将barcode 和so_id传入 so_barcode 实例,并重新执行其父类的刷新;更新订单行。

        },
    });
    core.form_widget_registry.add('sale_barcode_handler', SaleBarcodeHandler);
    return SaleBarcodeHandler;
});
var core = require('web.core');
    core.bus.on('web_client_ready', null, function () {
        //注意,这里的bus 是用于挂件间传递信息,只有当web_client_ready 时,才会把数据传入当前widgets挂件
目录
相关文章
|
存储 供应链 Oracle
探究ERP系统的云端部署与SaaS模式
探究ERP系统的云端部署与SaaS模式
1469 0
|
数据采集 JSON JavaScript
全面拥抱FastApi —三大参数及验证
全面拥抱FastApi —三大参数及验证
|
4月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
424 1
|
4月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
571 0
|
4月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
271 0
|
4月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
6月前
|
API 数据安全/隐私保护 Python
拼多多批量上架软件, 电商一键上货发布工具,python电商框架分享
多线程批量上传架构,支持并发处理商品数据 完整的拼多多API签名和token管理机制
|
XML 前端开发 数据库
echarts饼图前后端代码SpringCloud+Vue3
echarts饼图前后端代码SpringCloud+Vue3
228 0
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
程序员 C# 图形学
全面的C#/.NET自学入门指南
全面的C#/.NET自学入门指南
379 0