跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

G

guohuadeng

@guohuadeng
关于
帖子
65
主题
52
群组
0
粉丝
3
关注
0

帖子

最新 最佳 有争议的

  • odoo地图全景视图模块免费发布(可以在地图上看到多个客户,或者多个订单的分布,实施项目高大上)
    G guohuadeng

    今天听说google回归中国, Great!!终于可以将浏览器主页从 “about:blank” 换一个了。

    为表庆祝,免费发布私家模块,web_google_china_maps,看名字就知道,在中国能用的 google模块。虽然是改自鬼子的模块,但也是下了不少功能,全在细节。

    而且不是官方市场上简单的某个客户位置的定位模块,而是能让你在一张地图中看到所有客户,所有订单什么的模块。这是我们商业项目里用得极多的一个模块,用上后轻松卖上7位数。

    这个模块简单做点增强,可以轻松做出“摩拜的一天”那种交通大数据视图。
    注意:默认是使用我们的google key,请自行修改。

    全景图,鼠标放上去显示详情
    替代文字

    导航路线图
    替代文字

    用法和 tree 视图等一样,详情请看 readme。

    适用于 odoo10,新版的还是留一手。

    Python

    <!-- View -->
    <record id="view_partner_map" model="ir.ui.view">
        <field name="name">view.partner.map</field>
        <field name="model">res.partner</field>
        <field name="arch" type="xml">
            <!-- Define aliase name for geolocation fields into view attributes -->
            <map string="Map" lat="partner_latitude" lng="partner_longitude">
                <field name="name"/>
                <field name="street"/>
                <field name="street2"/>
                <field name="city"/>
                <field name="zip"/>
                <field name="email"/>
                <field name="state_id"/>
                <field name="country_id"/>
                <field name="partner_latitude"/>
                <field name="partner_longitude"/>
            </map>
        </field>
    </record>
    
    <!-- Action -->
    <record id="action_partner_map" model="ir.actions.act_window">
        ...
        <field name="view_type">form</field>
        <field name="view_mode">tree,form,map</field>
        ...
    </record>
    
    <!-- View -->
    <record id="view_partner_map" model="ir.ui.view">
        <field name="name">view.partner.map</field>
        <field name="model">res.partner</field>
        <field name="arch" type="xml">
            <!-- Define aliase name for geolocation fields into view attributes -->
            <map string="Map" lat="partner_latitude" lng="partner_longitude">
                <field name="name"/>
                <field name="street"/>
                <field name="street2"/>
                <field name="city"/>
                <field name="zip"/>
                <field name="email"/>
                <field name="state_id"/>
                <field name="country_id"/>
                <field name="partner_latitude"/>
                <field name="partner_longitude"/>
            </map>
        </field>
    </record>
    
    <!-- Action -->
    <record id="action_partner_map" model="ir.actions.act_window">
        ...
        <field name="view_type">form</field>
        <field name="view_mode">tree,form,map</field>
        ...
    </record>
    

    点此至官网下载,不要忘记给个五星好评,会记住的

    另外,好用的 odoo定制化模块 又更新了,多谢来个五星好评

    点此下载,莫忘好评


  • odoo11,12实现树状视图,odoo前端开发的实例教程,引入ztree.js
    G guohuadeng

    odoo的前端,比起很多平台,界面是十分优秀的,利用现有组件也能很快的实现功能。
    但一旦实际和友商PK,就会发现有很多不足,这些硬伤在PK中会大大降低你的杀伤力。
    替代文字
    树状视图算是最重要的一个,这个该是国内国际各大厂商的标配了,在财务、分组目录、地理位置等实际应用中十分常见。所以,实现父子关系的树状视图绝对是打单的重头戏,针对odoo11,12的前端大变化,我们开发了相关的模块,包括在单条记录中使用树状选择(如目录、科目),在列表、看板中使用树状列表导航查询,全部使用odoo标准的开发方式,widget实现,简单的xml设置。

    本文涉及模块可以在此下载,收费插件。希望童鞋们能学习后自行完成。

    多层级树状导航高级搜索
    字段多层级树状视图选择

    ** 先看最终效果,list, kanban, pivot, graph 中的效果**
    替代文字

    ** field中的效果。**

    替代文字

    这里写下开发过程,掌握后基本可以自己开发各种 odoo 的前端增强了。

    原生ztree外观比较丑,为了更符合 odooer的审美,用了 fontawsome来改造样式。

    • 引入 ztree.js

    • 列表做 qweb 页面

    • 列表继承原 odoo 的 FieldMany2One 组件

    • 在需要树状列表处理的相应模块写 view,继承更改字段视图。

    ztree widget是模块核心,主要代码如下:

    引入ztree

    <template id="assets_backend" name="odtree assets" inherit_id="web.assets_backend">
        <xpath expr="." position="inside">
            <link rel="stylesheet" type="text/css" href="/app_web_widget_ztree/static/src/lib/ztree_v3/css/awesomeStyle/fa.less"/>
            <link rel="stylesheet" type="text/css" href="/app_web_widget_ztree/static/src/lib/ztree_v3/css/awesomeStyle/awesome.less"/>
            <link rel="stylesheet" type="text/less" href="/app_web_widget_ztree/static/src/less/views.less"/>
            <script type="text/javascript" src="/app_web_widget_ztree/static/src/lib/ztree_v3/js/jquery.ztree.core.js"/>
            <script type="text/javascript" src="/app_web_widget_ztree/static/src/js/widget_ztree.js"/>
        </xpath>
    </template>
    

    qweb template 构建需要ztree的部份

    <!--常规的-->
    <div t-name="App.zTree" class="ztree"
                    t-att-id="widget.ztree_id"
                    t-att-data-ztree_index="widget.ztree_index"
                    t-att-data-ztree_field="widget.ztree_field"
                    t-att-data-ztree_model="widget.ztree_model"
                    t-att-data-ztree_parent_key="widget.ztree_parent_key">
    </div>
     
    <!--field 中的widget-->
    <t t-name="App.FieldZtree">
        <t t-if="widget.mode === 'readonly'">
            <a t-if="!widget.nodeOptions.no_open" class="o_form_uri" href="#"/>
            <span t-if="widget.nodeOptions.no_open"/>
        </t>
        <div t-if="widget.mode === 'edit'" class="o_field_widget o_field_many2one">
            <div class="o_input_dropdown">
                <input type="text" class="o_input"
                    t-att-barcode_events="widget.nodeOptions.barcode_events"
                    t-att-tabindex="widget.attrs.tabindex"
                    t-att-autofocus="widget.attrs.autofocus"
                    t-att-placeholder="widget.attrs.placeholder"
                    t-att-id="widget.idForLabel"/>
                <span class="o_dropdown_button" draggable="false"/>
            </div>
            <button type="button" t-if="!widget.nodeOptions.no_open" class="fa fa-external-link btn btn-default o_external_button" tabindex="-1" draggable="false"/>
        </div>
    </t>
    

    实现widget的代码,这个主要按正常odoo js教程,在 init, start, render 几个标准widget执行过程中继承即可,多用 _super,同时按 ztree 教程设置好 setting 参数,传参生成ztree

    buildTreeView: function (search_val) {
        var self = this;
        if (self.many2one) {
            self.many2one.destroy();
            self.many2one = undefined;
        }
        var setting = {
            callback: {
                onClick: function (event, treeId, treeNode, clickFlag) {
                    self._selectNode(event, treeNode);
                }
            }
        };
        self._search(search_val).then(function (result) {
            //todo: 不能默认让node selected,会出现quick_create 混乱
            if (self.value && self.value.data.id && self.value.data.id > 0)
                var ztree_selected_id = self.value.data.id;
            self.many2one = new zTree(setting, {
                zNodes: result,
                ztree_field: self.field.name,
                ztree_model: self.field.relation,
                ztree_parent_key: self.ztree_parent_key,
                ztree_expend_level: self.ztree_expend_level,
                ztree_selected_id: ztree_selected_id,
            });
            self.many2one.appendTo(self.$input.parent());
            // self.$(".ztree").replaceWith(self.many2one);
            self.$input.css('height', 'auto');
        });
    },
    

    为了更像原生的 m2o ,做了很多附加代码,主要是把原生many2one的执行函数调整,用ztree方式进行赋值和点击事件处理,比如最重要的输入后查找过滤功能

    _bindAutoComplete: function () {
        var self = this;
        this._super.apply(this, arguments);
        this.$input.autocomplete({
            source: function (req) {
                if (!self.many2one)
                    self.buildTreeView(req.term);
            },
            focus: function (event, ui) {
                event.preventDefault(); // don't automatically select values on focus
            },
            close: function (event, ui) {
                if (event.which === $.ui.keyCode.ESCAPE) {
                    event.stopPropagation();
                }
                console.log('ui close');
            },
            autoFocus: true,
            html: true,
            minLength: 0,
            delay: this.AUTOCOMPLETE_DELAY,
        });
     
        this.$input.autocomplete("option", "position", {my: "left top", at: "left bottom"});
    },
    

    最后,要在视图中使用。以产品目录的输入改为 树状视图 为例

    <!-- Product -->
    <record id="app_product_template_form_view" model="ir.ui.view">
        <field name="name">app.product.template.form</field>
        <field name="model">product.template</field>
        <field name="inherit_id" ref="product.product_template_form_view"/>
        <field name="arch" type="xml">
            <xpath expr="//field[@name='categ_id']" position="attributes">
                <!-- Add your fields or attributes here -->
              <attribute name="widget">ztree_select</attribute>
              <attribute name="ztree_expend_level">2</attribute>
              <attribute name="limit">16</attribute>
              <attribute name="order">name</attribute>
            </xpath>
        </field>
    </record>
    

    可以看到,核心就一个 widget="ztree_select",为了使用方便,可以做不少参数,比如默认展开的级别,排序名称等。

    以上是field的处理,在list,kanban的处理会更复杂些,主要是对 search_view 操作实现过滤查询,和对 view_manager 中各种视图切换时,能实现不同的渲染,更改原生view的dom结构。

    renderSuperbar: function (sender) {
        //todo: 在form 中的one2many表单,也是list,此时不能render
        var self = this;
        //不在主视图
        //如果视图不变,不处理
        if (!need_render)
            return false;
        if (!sender.getParent().getParent().$el.hasClass('o_view_manager_content'))
            return false;
        //没有数据就清理
        if (!self.bar_data) {
            if (self.$superbar)
                self.$superbar.destroy();
            return false;
        }
        //如果不在允许的view_mode,不处理,默认只有 list, kanban
        if (!self.bar_data.attrs.view_mode) {
            if (self.$superbar)
                self.$superbar.destroy();
            return false;
        }
        else {
            var views = self.bar_data.attrs.view_mode.split(',');
            var viewTag = sender.arch.tag;
            //o的list要改为tree
            if (views.indexOf(viewTag) < 0)  {
                if (self.$superbar)
                    self.$superbar.destroy();
                return false;
            }
        }
        if (self.$superbar)
            self.$superbar.destroy();
        //一旦viewType换了,处理渲染
        need_render = false;
        self.$superbar = new Superbar(self.bar_data, this, sender);
        self.$superbar.appendTo(sender.getParent().$el);
        self.ztree_position = self.bar_data.attrs.position;
        sender.getParent().$el.css('display', 'flex');
        sender.getParent().$el.children('div:first').css('flex', '1');
        if (self.ztree_position && self.ztree_position.toLowerCase() == 'left') {
            sender.getParent().$el.children('div:first').css('order', '2');
            sender.getParent().$el.children('div:last').css('border-left', '0');
        } else {
            sender.getParent().$el.children('div:first').css('order', '-2')
        }
    },
    

    完成了 树状导航,就可以使用 view 在实际功能中定义了,比如实现订单按客户和状态来进行过滤导航。
    替代文字

    几行xml代码搞定,你可以按自己的需要在任意的视图中增加树状导航。

    ```
    
    ``` odoo 是个优秀的框架,努力让她更强大!

  • odoo11,12最新会计科目表,多级科目树状导航实现,更丰富内容
    G guohuadeng

    替代文字
    感谢社区完成了最新中国会计,处理了增值税等一堆烦心事。

    本次单独做了模块。主要是为了细节更顺手,也结合现有树状视图组件,让财务更好用。相关资源可以在我们官网或者odoo官网下载 点此查看

    主要更新如下:基于社区标准会计,最新中国化财务,作了优化。

    1. 2018最新会计科目表,处理营改增后会计科目调整。
    2. 将菜单中设置为"财务"。
    3. 补充分类及标签信息。
    4. 更新税信息。
    5. 增加树状结构,可设置上级科目,配合 "app_web_superbar" 使用可轻易实现树状导航。
    6. 注意,必须在没有业务数据,没有会计科目的初始环境。可以使用 "app_odoo_customize" 模块清除财务数据,重置会计科目。
    

    增加了多级科目的设置后,使用 superbar 可以在树状视图中查看相关会计明细,十分方便。点击科目树,即可查看相关科目产生的会计凭证。

    替代文字

     

    原生odoo更换科目表比较麻烦,现实开发中时有需要重设科目的需求,特别是经常要面对外贸客户。 为了少点击几次鼠标,我们将 app_odoo_customize 模块也更新了。

    (顺便祝贺下荣登 odoo 官网 #1 用户下载)
    操作比较简单,进入odooApp定制界面,点两下鼠标,就可以重新设置会计科目表了

    替代文字

    ======

    同时,还更新了下中国化模块。odoo Chinese Enhance. 中国化增强-基础

    1. 中文默认值,如国家、时区、货币等。处理模块 base, product.
    2. 客户加简称,地址显示中文化,客户编码显示优先
    3. todo:中文演示数据(只有demo模式才加载)
    

    Enjoy...


  • 产品与变体自动唯一sku编码模块,odoo12,11,10支持
    G guohuadeng

    产品编码,sku码是产品的重要属性。很遗憾odoo默认功能中需要人工对产品进行sku编码,试过大量的第三方插件,都不符合实际生产情况。为此,随着odoo12的升级,我们将原针对odoo10开发的产品编码模块进行了重构,更加符合工业制造,以及系列产品编码情况。

    模块支持odoo12,11,10版本,odoo官网下载地址 app_product_auto_code
    收费模块,具体可见 原文网站

    在工业生产,商业贸易中,按不同产品不同分类进行编码是最常见的情况,本模块目标即是按不同产品目录生成不同的产品唯一sku编码。另外,本模块核心功能是支持产品变体,实现同一系列产品有相同的前缀码,不同的后缀码。

    
    * 按不同产品目录生成不同产品编码
    * 支持产品spu,产品变体sku编码,同一系列间以顺序号区分,主体码相同
    * 内置成品、半成品、原料、服务、常规产品编码
    * sku产品编码唯一
    * 生成的产品编码符合ean-13规则,可直接设置为条码
    * 在目录中设置各种默认产品属性,故产品只要选择好对应目录,其关键属性自动填入,大量减少了odoo 实施难度。
    * 一如既往,我们的模块全部是中英双语支持
    

    比如

    ipad系列:PN20181001

    ipad-32G: PN20181001#001

    ipad-64G: PN20181001#002

    同时,odoo中产品的各种属性设置麻烦,且内在规则复杂,按照odoo的整体逻辑思想,我们在产品目录的设置中,也增加了设置产品默认属性值的功能。 即您只要选择了产品所属目录,则可自动填写产品的销售、采购、库存属性。

    替代文字


  • Odoo 12中物联网盒子iot box的使用,如何用树莓派DIY实现并连接扫码枪,照相机,电子秤,外显等(pos box, iot box)
    G guohuadeng

    原文地址:
    http://www.sunpop.cn/odoo-12-iotbox-diy-rom/

    Odoo是个优秀的ERP框架,使用B/S架构为其带来了开发实施上不少的优势,但在直连操作硬件时,比如温湿传感器、电子秤、钱箱、打印机、身份证读卡器、银行卡读卡器、RFID读卡器等,B/S架构就烦多了。好在官方为我们提供了loT Box,为硬件连接带来了极大的方便。

    IoT Box通过Wifi、蓝牙、USB、网线等方式连接设备。IoT再通过内网或者互联网连接到Odoo服务器。Odoo的各种应用通过IoT操作各种设备。例如,PoS应用通过IoT操作小票打印机、银行刷卡机。又如,车间生产的工序应用Work Order,操作工序上的摄像头、测量仪器等,完成拍照、测量等工作,并获取工作结果(照片、测量结果)到Odoo系统中。

    以下是配置IoT box实现在制造工序中调用特定物联网硬件--摄像头,实现制造工序中质量检查的配置及实例。注意:必须是odoo12企业版(虽然我们也实现了在社区版支持)。

    替代文字

    配置物联网盒子

    替代文字

    连接成功
    替代文字

    检查物联网盒子中的摄像头
    替代文字

    替代文字

    替代文字

    创建质检点,设置组装工序必须执行 质检拍照流程,执行工序。
    替代文字

    创建制造工单(必须使用工序)
    替代文字

    调用IoT box 拍照:
    替代文字
    质检完成

    使用强大的物联网盒子,可以实现很多功能。如温度传感器在生鲜物流行业应用,粉粉尘传感器在制造业中的环保应用。

    以下是各种传感器列表,一定有你喜欢的

    ==========

    声音传感器
    HC-SR04超声波测距模块
    315MHz 发射模块
    315MHz 接收模块
    有源蜂鸣器 5V
    大气压强传感器
    人体红外感应模块 HC-SR501
    DHT11温湿度模块(须配10K电阻)
    有源蜂鸣器 12V
    NRF24L01+ 无线收发模块
    激光传感器 KY-008
    DS18B20温度计
    光敏电阻模块
    3色LED模块 KY-016
    烟雾气敏传感器 MQ-2
    红外发射传感器
    面包板电源模块
    TCS3200颜色传感器
    对射光电传感器
    DS18B20测温模块
    振动开关传感器
    ST188 光电式传感器
    GY-30 数字光强度检测模块
    寻线传感器 KY-033
    水位传感器 Water Sensor
    PCF8591 AD/DA转换模块
    红外线接收器 TSOP4838
    雨滴传感器
    GY-521 MPU-6050模块
    红外发射模块 KY-005
    升压模块 XL6009
    倾斜/倾倒传感器
    火焰传感器
    GY-273 电子指南针罗盘模块
    降压电源模块 LM2596S
    MPU-6050 三轴陀螺仪模块
    霍尔传感器模块

    ============

    下面我们来自行 DIY 一个odoo物联网盒子 iot box

    官网购买的价格是,企业版用户 25欧/月,全套设备大概155欧。为了方便,也为了更高性价比,让我们按官方教程来实现DIY的loT BOX。

    因论坛排版麻烦,请移步:
    Odoo 12中物联网盒子iot box的使用,如何用树莓派DIY实现并连接扫码枪,照相机,电子秤,外显等(pos box, iot box) - | odoo专业实施开发培训_广州尚鹏,供应链制造,外贸、家具生鲜开源ERP、微信
    http://www.sunpop.cn/odoo-12-iotbox-diy-rom/


  • odoo12 免费常用及高级widget大全,社区及企业版共计100多个
    G guohuadeng

    原文地址(持续更新):
    odoo12 免费常用及高级widget大全,社区及企业版 https://www.sunpop.cn/odoo12-free-widget-base-advance-all/

    odoo 12 从2018年10月16日发布至今,大概快3个月。 从12发布到现在,我们一直在熟悉新版的变化,并进行实施开发。如今12完全可以在我们的项目中进行商用,也迁移了很多原有的10和11模块到odoo12。

    odoo12除了在业务流程逻辑上进行了不少优化(太不人道,开发的一堆要重写!!),在前端也基本完全重构。 前端的js由原来单文件拆成了 view = controller + render + model 的结构,更为规范(最不人道,不但要重写,还要难入门。。。。)。除了性能,12很明显的特征就是界面更友好,操作更方便,这极大的得益于前端的重构,具体上就是用大量的 widget 实现UI优化。

    花了不少时间,基本把所有widget都试了下,光是odoo12本身就已经有超过100个widget,少量是企业版的(自求多福),很多功能十分好,实现了很多想要的效果。 在此简单整理下,后续会更新些说明。
    简述

    至于 widget 怎么用,如果你能对widget感兴趣,应该具备一定能力了。 一句话,“odoo的源码就是大宝库”。这里放个 label_selection 的截图,本来是要写一个类似的,结果找源码找到了,发现十分好用。常规的 listview 有decoration可以用不同色,但太不明显,用了这个,在不同状态可以有更明显的css样式,简单处理下也可以用在时间上。比如还有2天就到期,显示红色 danger,还有5天的就显示橙色 warning。 业务跟单是硬需求,十分好用!!
    替代文字

    以下是 odoo 12 社区版和企业版的全部 widget了(如果你还找到别的,欢迎补充),第三方的有很多,比如我们的ztree树状视图什么的哈,odoo 市场这里找

    熟用 widget 会让你升级很快(当然第一是要熟悉odoo业务功能,路漫漫。。),毕竟官方的建议是能用 python就用python,没事儿不要写前端!!

    可以看看这几篇了解下odoo12的前端:

    更新快速日期数字搜索插件,简单说下odoo11,12的前端开发变化
    https://www.sunpop.cn/app_search_range_date_number/

    个性化odoo标题系统名等及开发增强模块-Odoo11版本发布。odoo10与odoo11开发上的升级要点。
    https://www.sunpop.cn/app_odoo_customize_v11/

    odoo中各组件的颜色及用法tree,kanban,many2many_tags,app_ui_enhance
    https://www.sunpop.cn/odoo_widget_color/

    odoo 常用widget (odoo10的旧版了)
    https://www.sunpop.cn/odoo-常用widget/

    以下正文。。odoo12 所有的widget, 基础与高级的大全
    看 widget 名字基本就知道干什么的了

    odoo12 基础 widget
    ace
    attachment_image
    binary
    boolean
    boolean_button
    boolean_favorite
    boolean_toggle
    char
    CopyClipboardChar
    CopyClipboardText
    dashboard_graph
    date
    datetime
    domain
    email
    float
    float_factor
    float_time
    float_toggle
    handle
    html
    image
    input
    integer
    kanban_state_selection
    label_selection
    link_button
    monetary
    pdf_viewer
    percentage
    percentpie
    phone
    priority
    progressbar
    state_selection
    statinfo
    text
    toggle_button

    高级 widget,多数为关联型及模块专有
    appointment_employee_url
    asyncwidget
    barcode_handler
    bullet_state
    deprec_lines_toggler
    field_float_scannable
    field_partner_autocomplete
    filters
    form.many2many_tags
    gauge
    hierarchy_kanban
    hr_org_chart
    html
    html_frame
    inventory_barcode_handler
    iot
    iot_picture
    kanban.many2many_tags
    kanban.many2one
    kanban_activity
    list.many2one
    lot_barcode_handler
    mail_activity
    mail_followers
    mail_thread
    many2many
    many2many_binary
    many2many_checkboxes
    many2many_select
    many2many_tags
    many2many_tags_email
    many2manyattendee
    many2one
    marketing_activity_graph
    mrp_time_coun
    one2many
    one2many_list
    pad
    password_meter
    payment
    picking_barcode_handler
    previous_order
    radio
    reference
    report_layout
    res_partner_many2one
    section_and_note_one2many
    section_and_note_text
    selection
    selection_badge
    sms_widget
    statusbar
    tablet_image
    tablet_kanban_view
    tablet_list_view
    terback_arrow
    test
    test_barcode_handler
    timesheet_uom
    timezone_mismatch
    upgrade_boolean
    upgrade_radio
    url
    website_button

  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组