Odoo 中文社区

    • 注册
    • 登录
    • 搜索
    • 版块
    • 标签
    • 热门
    • 用户
    • 群组
    1. 主页
    2. guohuadeng

    Odoo中文社区可以通过以下两个域名访问:shine-it.net , odoo.net.cn

    由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

    本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

    开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

    如果您登录系统碰到问题,请在微信公众号留言:

    G
    • 资料
    • 关注 0
    • 粉丝 3
    • 主题 49
    • 帖子 62
    • 最佳 6
    • 有争议的 0
    • 群组 0

    guohuadeng

    @guohuadeng

    广州尚鹏信息科技有限公司一直专注于为华南地区的企业提供整体信息化及移动应用平台。我们使用#1开源ERP odoo 作为核心技术方案,为客户提供ERP、电商、企业微信、钉钉、App的定制化开发与实施服务。
    我们用产品说话。
    http://www.odooapp.cn

    7
    声望
    4127
    资料浏览
    62
    帖子
    3
    粉丝
    0
    关注
    注册时间 最后登录
    网站 www.sunpop.cn

    guohuadeng 取消关注 关注

    guohuadeng 发布的最佳帖子

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

      今天听说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定制化模块 又更新了,多谢来个五星好评

      点此下载,莫忘好评

      发布在 Odoo 开发与实施交流
      G
      guohuadeng
    • odoo11,12实现树状视图,odoo前端开发的实例教程,引入ztree.js

      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 是个优秀的框架,努力让她更强大!
      发布在 Odoo 开发与实施交流
      G
      guohuadeng
    • odoo11,12最新会计科目表,多级科目树状导航实现,更丰富内容

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

      本次单独做了模块。主要是为了细节更顺手,也结合现有树状视图组件,让财务更好用。相关资源可以在我们官网或者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...

      发布在 Odoo 开发与实施交流
      G
      guohuadeng
    • 产品与变体自动唯一sku编码模块,odoo12,11,10支持

      产品编码,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 开发与实施交流
      G
      guohuadeng
    • Odoo 12中物联网盒子iot box的使用,如何用树莓派DIY实现并连接扫码枪,照相机,电子秤,外显等(pos box, iot box)

      原文地址:
      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/

      发布在 Odoo 开发与实施交流
      G
      guohuadeng
    • odoo12 免费常用及高级widget大全,社区及企业版共计100多个

      原文地址(持续更新):
      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

      发布在 Odoo 开发与实施交流
      G
      guohuadeng

    guohuadeng 发布的最新帖子

    • odoo saas高可用架构部署,性能扩展安全增强

      原文可参考,更好的阅读体验:
      https://www.sunpop.cn/odoo_saas_high_performant_ha_redis/

      Odoo是一个全功能ERP平台,也是一个在线服务门户。随着odoo越来越流行,已经有了大量的海量部署。

      比如官方的500万用户和每个月上百的企业SAAS用户,国内某odoo电商App的500万+注册用户等,我们为客户支持的在线应用,也达到了十万用户级别。海量数据应用更是比比皆是,国内使用odoo的上市公司,特别是制造行业,其SKU数量都在数十万级以上。
      替代文字

      为更好的支持海量用户及海量数据,我们需要进行odoo的高可用性部署,以达到高性能,高稳定性,高扩展性,高安全性。我们以一个多租户电商供应链门户应用为例,简述高可用架构的部署。由于odoo本身就是一个B/S架构的应用,所以本架构也可以适用于所有的odoo部署。

      odoo采用了业界流行的基础架构,包括:

      操作系统:Linux,官方推荐Ubuntu
      数据库:Postgresql
      Web服务器:内置 Werkzeug,前端一般通过Nginx,Apache等代理
      前端:基于JavaScript的富客户端,通过Json-rpc调用后台数据。技术基于Jquery + backbone + owl(odoo14开始采用的mvvm架构)
      后台:Python 3.6 +,使用threading + gevent 实现多线程,多协程。同时支持多进程启动

      这些通用且以开源为核心的架构,保证了其具备很好的可扩展性,可以方便的进行集群及高可用部署。

      在本应用场景中,管理方为集团公司,下属多个子公司。每个子公司对自有客户、自有供应链业务进行管理,集团公司同时统一管理所有客户及产品,并通过odoo制定业务规范管理日常运营。

      消费者/零售商户

      即我们的b2b, b2c客户,这些客户通过使用odoo开发的App、微信小程序及电商平台。基于互联网访问。

      供货商

      为平台提供端口的供应商,与1类似,通过App、微信小程序及网站管理商品及发货。基于互联网访问

      平台管理方

      平台业主,包括集团用户与子公司的用户,主要通过odoo管理业务。基于内网或者通过VPN进入内网,访问平台。

      互联网

      基于odoo建立的门户网站,以及基于odoo接口实现的App或者微信小程序。通过互联网提供服务,odoo仅通过互联网提供接口服务,供客户端调用,相关管理后台功能不通过互联网开放。

      防火墙

      防火墙进行安全隔离,企业可以自行定制相关策略,防范网络攻击等。

      VPN+安全策略

      核心平台部署于集团IDC,odoo的后台业务管理服务仅向内网用户提供,故所有子公司及相关管理用户,只可通过内网或者VPN登入内网,才可进行业务管理。

      前端服务群组

      前端服务器群组一般包括反向代理服务器和负载均衡服务器。

      我们使用Nginx反向代理服务器,odoo通过Nginx对外提供Web服务,一般1主1备实现高可用即可,同时可以构建Nginx集群提供更好的性能。相关的SSL证书也通过Nginx进行配置以保证连接安全。

      当使用多Nginx服务器后,我们需要增加负载均衡服务器如F5等进行用户动态分配。

      使用Nginx作为前端有另外一个好处,就是当平台需要符合国家的网络安全等级保护要求时,很多内容通过Nginx即可进行。

      核心odoo服务集群

      Odoo设计时就考虑了集群及多租户情况。按实际业务情况,我们可以分为多个odoo服务集群,将应用负载分离,以保证高性能。

      每个集群可以由多台odoo服务器组成,这样当某台odoo故障下线时,其它odoo服务器可以承担服务,以保证高可用。

      这些服务器通过7中的前端服务器群组进行任务分配,一般这些服务器集群我们会在DMZ区进行更好的安全保障。

      8.1 核心odoo服务集群

      提供系统核心服务,包括对外部App接口,对内部的业务管理。

      8.2 定时任务odoo服务集群

      Odoo的定时任务即Cron,我们一般是用来进行业务计算或者数据同步的。比如同步其它系统的用户、商品信息,同步天猫/Amazon的订单信息,定期与支付服务商对账等。制造业中会用来做MRP计算或补货运算。

      Odoo的Cron是可以单独执行的,由于这种服务可以免http服务,所以将其独立开来有助于提高性能,所以我们建立了独立的定时任务服务集群。

      8.3 其它odoo服务集群

      由于odoo可以多进程开启,所以我们可以根据实际业务需要,将某些应用独立开来建立单独的odoo服务器或者odoo服务器集群。

      就原生功能而言,其IOT物联网服务,即时聊天是比较独立的,如有特殊性能要求,可以将其独立部署。

      在本文的应用中,我们也可以将对外的接口服务,进行独立部署。

      注意!当我们拆分独立的odoo应用集群时,一定要注意代码的处理,特别是本集群内的odoo服务器,要保证多台服务器间代码的一致,可以用 Linux的rsync服务即可。

      CDN/文件服务群组

      为提高性能,静态文件可使用专门的CDN或文件服务器存储,可以使用自有CDN或者云服务商的CDN。

      我们可能自行决定哪些静态文件进行CDN处理,一般包括:css,js, 字体,图片,系统附件等。

      数据缓存集群

      Odoo本身有数据缓存机制,Postgresql也有内置数据缓存机制。为了更高的数据读取性能,我们可以增加部署Redis,作为PostgreSQL的二级缓存, 提升数据库的性能,减少IO请求。

      此功能需要进行一定的二次开发,控制数据读取。一般乐观数据如商品品类等基于不变化的我们从redis中取。悲观数据比如商品要记录其浏览量,加购物车量的,我们从数据库中取。

      Redis可以进行集群部署,细节可自行查询相关文章。

      PG数据库集群

      数据是企业的核心,所以数据库是平台中最重要的组成部份。Postgresql作为最主流的数据库,有多种成熟的集群方案功能。

      首先在硬件层架构上,我们要尽量保证:

      使用物理机而非虚拟机作为数据库服务器
      使用SSD或者高转速硬盘保证高IO性能
      使用Raid保证存储的高可用及高IO性能

      接着进行高可用架构部署,我们的目标主要为:

      读写分离,实现高性能
      主备复制,实现高可用

      相关方案已经很成熟,比如我们可以直接使用:

      华为云方案:

      https://support.huaweicloud.com/bestpractice-rds/rds_pg_0009.html

      阿里云方案:

      https://help.aliyun.com/document_detail/127875.htm?spm=a2c4g.11186623.2.8.202b5beeeH4Bwv#concept-1443745

      他们都提供公有云或私有云的部署方案。

      如果要自行建设,也有多种方案选择。

      可以使用 postgresql数据库自带的基于Standby的异步流复制进行replication配置。
      可以使用pgpool,这是个应该是最流行的一个集连接池、主备切换与负载均衡于一身的pg数据库连接件。
      商业产品

      相关方案比较多,可自行查阅。

      运维监控服务

      一般业主都有自己的基础运维体系,odoo使用的都是通用平台,所以可以很方便的将上述基础架构纳入集团整体IT运维架构中。

      以下做些简述。

      1 备份

      定期数据库备份。

      定期应用服务及配置备份。

      基于GIT的代码版本管理,release管理。

      2 主机监控

      将上述主机纳入监控平台。

      3 日志与审计

      Odoo业务数据的变更自带审计功能,用好即可。

      系统运行的Log最好不使用操作系统的Log,通过配置,记录到单独的数据库中,做好预警管理。

      其它具体运维参照业主方SLA标准实施即可。

      以上,作为Odoo高可用架构部署的参考,以帮助我们支持海量用户与海量数据,提高性能、稳定性及安全性。

      发布在 Odoo 开发与实施交流
      G
      guohuadeng
    • odoo14最新免费会计科目表模块-2021版更新最新税率,支持14,13,12,11多odoo版本

      可阅读原文,获得更好体验:

      odoo14最新免费会计科目表模块-2021版更新最新税率,支持14,13,12,11多odoo版本

      替代文字

      请在 odoo 官网下载: 中国会计科目2021/2020

      为区分版本:

      odoo14: 2021最新会计

      odoo13-11: 2020最新会计

      在 odoo14版中,一定先用 app_odoo_customize 模块,执行操作 “清除会计科目”

      同时,我们进行了大量模块更新,以支持最新 odoo14,可在以下200多个业务模块中参考,尚鹏odoo模块十分注重与 odoo原生业务整合,所有模块符合原生业务逻辑,与odoo原功能完美匹配及增强。

      替代文字

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

      本次单独做了最新免费会计科目模块,调整了各种最新税率如13%增值税,多级会计科目等,采用金蝶的科目命名规范。主要是为了细节更顺手,也结合现有树状视图组件,让财务更好用。

      相关模块在此下载

      主要更新如下:

      最新中国化财务,主要针对标准会计科目表作了优化。

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

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

      superbar 是我们的收费模块,可以在官方搜索,购买后可以得到 ztree 及 superbar 相关的共计 16个免费模块。

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

      (请多下载,争取再荣登 odoo 官网 #1 用户下载)

      操作比较简单,进入odooApp定制界面,点两下鼠标,就可以重新设置会计科目表了。

      注意,如果是 odoo12,一定要以超级用户登录。

      ======

      同时,还更新了下中国化模块

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

      Enjoy...

      发布在 Odoo 开发与实施交流
      G
      guohuadeng
    • 免费开源odoo14,13,12,11,10改logo,自定义,清除所有数据模块

      原文地址,更好阅读体验: https://www.sunpop.cn/app_odoo_customize_debrand/

      odoo14马上要发布,odoo自定义模块也加紧升级,现在已经直接支持odoo14。

      作为odoo开发者,经常要进行调试,数据清理,也要为客户提供自定义工作,因此专门开发了这个开源模块,欢迎使用。

      欢迎在官网 好评支持

      您的支持将让中国的开发者,中国的odooapp在官方市场更受关注,谢谢 :)

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

      在符合odoo开源协议的前提下,去除odoo版权, 去除odoo 相关logo信息,自定义你的odoo

      可完全自行设置下列 odoo 选项,让 odoo 看上去像是你的软件产品

      • odoo14, 13版本下载--持续更新

      • odoo12版本下载--持续更新

      • odoo11版本下载--持续更新

      • odoo10版本下载--持续更新

      替代文字

      模块功能

          1. 删除菜单导航页脚的 Odoo 标签
          2. 将弹出窗口中 "Odoo" 设置为自定义名称
          3. 自定义用户菜单中的 Documentation, Support, About 的链接
          4. 在用户菜单中增加快速切换开发模式
          5. 在用户菜单中增加快速切换多国语言
          6. 对语言菜单进行美化,设置国旗图标
          7. 在用户菜单中增加中/英文用户手册,可以不用翻墙加速了
          8. 在用户菜单中增加开发者手册,含python教程,jquery参考,Jinja2模板,PostgresSQL参考
          9. 在用户菜单中自定义"My odoo.com account"
          10. 单独设置面板,每个选项都可以自定义
          11. 提供236个国家的国旗文件(部份需要自行设置文件名)
          12. 多语言版本
          13. 自定义登陆界面中的 Powered by Odoo
          14. 快速删除测试数据,支持模块包括:销售/POS门店/采购/生产/库存/会计/项目/消息与工作流等.
          15. 将各类单据的序号重置,从1开始,包括:SO/PO/MO/Invoice 等
          16. 修复odoo启用英文后模块不显示中文的Bug
          17. 可停用odoo自动订阅功能,避免“同样对象关注2次”bug,同时提升性能
          18. 显示/隐藏应用的作者和网站-在应用安装面板中
          19. 一键清除所有数据(视当前数据情况,有时需点击2次)
          20. 在应用面板显示快速升级按键,点击时不会导航至 odoo.com
          21. 清除并重置会计科目表
          22. 全新升级将odoo12用户及开发手册导航至国内网站,或者自己定义的网站
          23. 增加清除网站数据功能
          24. 自定义 odoo 原生模块跳转的url(比如企业版模块)
          25. 增加删除费用报销数据功能
          26. 增加批量卸载模块功能
          27. 增加odoo加速功能
          28. 快速管理顶级菜单
          29. App版本比较,快速查看可本地更新的模块
          30. 一键导出翻译文件 po
          31. 显示或去除 odoo 推荐
          32. 增加修复品类及区位名的操作 
          33. 增加 Demo 的显示设置 
          34. 增加清除质检数据 
          35. 优化至odoo14适用 
      
      
      Debranding Title,Language,Documentation,Quick Debug,Quick Data Clear)
      Quick customize, debranding, boost, reset data, debug. Language Switcher. 
      Easy Delete data.reset account chart.
      odoo debrand, odoo debranding, customize my odoo. 
       
      

      App Odoo Customize(Debranding Title,Language,Documentation,Quick Debug)

      White label odoo.
      Support Odoo 13, 12, 11, 10, 9.
      You can config odoo, make it look like your own platform..

      1. Deletes Odoo label in footer
      2. Replaces "Odoo" in Windows title
      3. Customize Documentation, Support, About links and title in usermenu
      4. Adds "Developer mode" link to the top right-hand User Menu.
      5. Adds Quick Language Switcher to the top right-hand User Menu.
      6. Adds Country flags  to the top right-hand User Menu.
      7. Adds English and Chinese user documentation access to the top right-hand User Menu.
      8. Adds developer documentation access to the top right-hand User Menu.
      9. Customize "My odoo.com account" button
      10. Standalone setting panel, easy to setup.
      11. Provide 236 country flags.
      12. Multi-language Support.
      13. Change Powered by Odoo in login screen.(Please change '../views/app_odoo_customize_view.xml' #15)
      14. Quick delete test data in Apps: Sales/POS/Purchase/MRP/Inventory/Accounting/Project/Message/Workflow etc.
      15. Reset All the Sequence to beginning of 1: SO/PO/MO/Invoice...
      16. Fix odoo reload module translation bug while enable english language
      17. Stop Odoo Auto Subscribe(Moved to app_odoo_boost)
      18. Show/Hide Author and Website in Apps Dashboard
      19. One Click to clear all data (Sometime pls click twice)
      20. Show quick upgrade in app dashboard, click to show module info not go to odoo.com
      21. Can clear and reset account chart. Be cautious
      22. Update online manual and developer document to odoo12
      23. Add reset or clear website blog data
      24. Customize Odoo Native Module(eg. Enterprise) Url
      25. Add remove expense data
      26. Add multi uninstall modules
      27. Add odoo boost modules link.
      28. Easy Menu manager.
      29. Apps version compare. Add Install version in App list. Add Local updatable filter in app list.
      30. 1 key export app translate file like .po file.
      31. Show or hide odoo Referral in the top menu.
      32. Fix odoo bug of complete name bug of product category and stock location..
      33. Add Demo Ribbon Setting.
      34. Add Remove all quality data.
      35. Fixed for odoo 14.
      
       
      This module can help to white label the Odoo.
      Also helpful for training and support for your odoo end-user.
      The user can get the help document just by one click.
       
      
      For more support https://www.sunpop.cn
      发布在 Odoo 开发与实施交流
      G
      guohuadeng
    • 如何升级到odoo13,模块从odoo12到13的开发对比及注意要点

      原文地址,持续更新:
      https://www.sunpop.cn/odoo13_upgrade_from_odoo12_key_compare/

      odoo13正式发布已有1个多月,引入了更多的功能,更快的速度(从代码变化中可以很明显的感受到),更友好的的界面。

      我们也成功的在客户上线了2个odoo13的项目,项目的部份模块也放到了官方市场,近百个odoo13的模块,多数是按 odoo13 的开发规范和业务规范将 odoo13 的模块进行了升级。
      odoo 13 的项目模块集合
      可在此购买或免费下载。

      我们总结了 odoo12 --> odoo13 的部份不同,分为 1 模型,2 视图,3 前端开发, 4 业务逻辑三大部份,让大家了持续更新。

      参考:开发变更(FQ)

      业务:https://www.sunpop.cn/odoo13_new_function_update-_renewal/

      Tip: 可通过指令操作找出需要改的后端代码

      grep -nri 'oldname\|sudo([^\)]\+)\|api.multi\|api.returns\|api.one\|api.cr\|api.model_cr\|12.0\|compute=' $MODULE
      
      

      =============
      替代文字

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

      1 模型
      1.1 manifest
      改版本号如 13.19.11.30
      1.2 移除的@api
      @api.multi, @api.returns, @api.one, @api.cr, @api.model_cr
      1.3 chromeheadless 即将取代 wkhtmltopdf
      1.4 多用 active_ids 取代 active_id
      1.5 compute变化
      多用 compute 取代 onchange
      compute_sudo 默认是True
      增加 @api.depends_context
      翻译的 key 是 lang,这个常用
      延迟 recompute(),flush()后才存储
      compute设置关联字段值时,要注意关联字段已有赋值
      recompute会改生在 create, write 和 onchange
      更好的 recompute 触发器
      1.6 延迟update,write()不马上更改,要flush()
      1.7 @api.create_multi 批量创建,多用提升性能
      1.8 debug模式下log可见到更多的权限信息
      1.9 增加 with_user(user) 直接处理用户切换, 判断值 env.su
      1.10 审计处理从 track,track_sequence 改为 tracking
      1.11 ir.actions.act_window 中移除 multi,替代为binding_view_types
      1.12 小数点处理去除dp.get_precision
      1.13 selections 类型的 field 只能支持 string
      1.14 binary字段类型默认是存到附件模型中
      1.15 sql执行注意增加 cr.commit
      1.16 多公司处理,depends_context(company), with_company()
      1.17 cli指令增加参数 upgrade-path
      2 视图
      2.1 tree views 的汇总增加 avg
      2.2 xml定义移除view_type
      2.3 views 增加参数 import, optional, expand
      2.4 tree中 groupby 中可放 button 标签

      3 前端
      3.1 jQuery 3.x
      3.2 Chartjs
      3.3 bootstrap 4.x
      3.4 fontawsome 5.x
      要改为直接使用名称,如area-chart 改 chart-area
      3.5 rpc 传参要用 context
      3.6 multi-company widget
      4 业务逻辑
      4.1 财务
      account.invoice 改为 account.move
      account.invoice.line 改为 account.move.line
      account.invoice.tax 改为 account.move.lin
      account.voucher 改为 account.move
      account.voucher.line 改为 account.move.line
      4.2 基础
      res.partner的客户/供应商由 customer_rank/ supplier_rank处理

      发布在 Odoo 开发与实施交流
      G
      guohuadeng
    • 免费开源odoo13,12,11,10改logo,自定义,清除所有数据模块

      原文地址,更好阅读体验: https://www.sunpop.cn/app_odoo_customize_debrand_v12/

      作为odoo开发者,经常要进行调试,数据清理,也要为客户提供自定义工作,因此专门开发了这个开源模块,欢迎使用。

      欢迎在官网 好评支持

      您的支持将让中国的开发者,中国的odooapp在官方市场更受关注,谢谢 :)

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

      在符合odoo开源协议的前提下,去除odoo版权, 去除odoo 相关logo信息,自定义你的odoo

      可完全自行设置下列 odoo 选项,让 odoo 看上去像是你的软件产品

      • odoo13版本下载--持续更新

      • odoo12版本下载--持续更新

      • odoo11版本下载--持续更新

      • odoo10版本下载--持续更新

      替代文字

      模块功能

      1. 删除菜单导航页脚的 Odoo 标签
      2. 将弹出窗口中 "Odoo" 设置为自定义名称
      3. 自定义用户菜单中的 Documentation, Support, About 的链接
      4. 在用户菜单中增加快速切换开发模式
      5. 在用户菜单中增加快速切换多国语言
      6. 对语言菜单进行美化,设置国旗图标
      7. 在用户菜单中增加中/英文用户手册,可以不用翻墙加速了
      8. 在用户菜单中增加开发者手册,含python教程,jquery参考,Jinja2模板,PostgresSQL参考
      9. 在用户菜单中自定义"My odoo.com account"
      10. 单独设置面板,每个选项都可以自定义
      11. 提供236个国家的国旗文件(部份需要自行设置文件名)
      12. 多语言版本
      13. 自定义登陆界面中的 Powered by Odoo
      14. 快速删除测试数据,支持模块包括:销售/POS门店/采购/生产/库存/会计/项目/消息与工作流等.
      15. 将各类单据的序号重置,从1开始,包括:SO/PO/MO/Invoice 等
      16. 修复odoo启用英文后模块不显示中文的Bug
      17. 可停用odoo自动订阅功能,避免“同样对象关注2次”bug,同时提升性能
      18. 显示/隐藏应用的作者和网站-在应用安装面板中
      19. 一键清除所有数据(视当前数据情况,有时需点击2次)
      20. 在应用面板显示快速升级按键,点击时不会导航至 odoo.com
      21. 清除并重置会计科目表
      22. 全新升级将odoo12用户及开发手册导航至国内网站,或者自己定义的网站
      23. 增加清除网站数据功能
      24. 自定义 odoo 原生模块跳转的url(比如企业版模块)
      25. 增加删除费用报销数据功能
      26. 增加批量卸载模块功能
      27. 增加odoo加速功能
      

      使用方法:将解压后的 app_odoo_customize 放到 odoo的 addons目录下,激活开发者模式,应用-->更新应用列表, 找到 "App odoo Customize"模块,安装即可。

      Debranding Title,Language,Documentation,Quick Debug,Quick Data Clear)
      Quick customize, debranding, boost, reset data, debug. Language Switcher.
      Easy Delete data.reset account chart.
      odoo debrand, odoo debranding, customize my odoo.

      App Odoo Customize(Debranding Title,Language,Documentation,Quick Debug)
      ============
      White label odoo.
      Support Odoo 13, 12, 11, 10, 9.
      You can config odoo, make it look like your own platform.
      1. Deletes Odoo label in footer
      2. Replaces "Odoo" in Windows title
      3. Customize Documentation, Support, About links and title in usermenu
      4. Adds "Developer mode" link to the top right-hand User Menu.
      5. Adds Quick Language Switcher to the top right-hand User Menu.
      6. Adds Country flags  to the top right-hand User Menu.
      7. Adds English and Chinese user documentation access to the top right-hand User Menu.
      8. Adds developer documentation access to the top right-hand User Menu.
      9. Customize "My odoo.com account" button
      10. Standalone setting panel, easy to setup.
      11. Provide 236 country flags.
      12. Multi-language Support.
      13. Change Powered by Odoo in login screen.(Please change '../views/app_odoo_customize_view.xml' #15)
      14. Quick delete test data in Apps: Sales/POS/Purchase/MRP/Inventory/Accounting/Project/Message/Workflow etc.
      15. Reset All the Sequence to beginning of 1: SO/PO/MO/Invoice...
      16. Fix odoo reload module translation bug while enable english language
      17. Stop Odoo Auto Subscribe(Performance Improve)
      18. Show/Hide Author and Website in Apps Dashboard
      19. One Click to clear all data (Sometime pls click twice)
      20. Show quick upgrade in app dashboard, click to show module info not go to odoo.com
      21. Can clear and reset account chart. Be cautious
      22. Update online manual and developer document to odoo12
      23. Add reset or clear website blog data
      24. Customize Odoo Native Module(eg. Enterprise) Url
      25. Add remove expense data
      26. Add multi uninstall modules
      27. Add odoo boost modules link.
      

      This module can help to white label the Odoo.
      Also helpful for training and support for your odoo end-user.
      The user can get the help document just by one click.

      For more support https://www.sunpop.cn

      发布在 Odoo 开发与实施交流
      G
      guohuadeng
    • 解决odoo13 无法断点调试的bug fixed,Process finished with exit code -1073740940 (0xC0000374)

      原文地址,更好阅读体验:
      https://www.sunpop.cn/odoo13_bug_fixed_can_not_debug_on_python_3-7/

      在对odoo 进行断点调试时,只要将 python 升级到 3.6及以上的版本,必然会报错退出

      Process finished with exit code -1073740940 (0xC0000374)
      

      此问题在 odoo12 时,是可以通过不升级,使用 python 3.5 来解决的,随着 odoo 13 的升级,最低的环境要求变成了 python 3.6 ,因此已经没有 work around 了,只能找到解决办法。

      原来以为是 Pycharm 的问题,将 ide 换成了 vscode,然后发现 vscode 要配置的东西实在太多,还是使用熟悉的 IDE 好,只能生磕了。

      此问题从 odoo12 一直困扰,也尝试过解决但无果,大量扒资料,前后也有数天。。。才发现是个 python 的 bug 导致,详情参阅 https://bugs.python.org/issue36792#msg342966

      解决办法,将 odoo 相关代码改下,就是加一句

      ln = ln[0:ln.index('.')]
      

      此问题也提交给了 odoo 官方。https://github.com/odoo/odoo/issues/40061

      并入我们的 odoo13 绿色版 fixed https://github.com/guohuadeng/odoo13-x64

      替代文字

      解决这个问题,就可以愉快的进行 odoo13 调试了!

      发布在 Odoo 开发与实施交流
      G
      guohuadeng
    • odoo13正式发布的官方功能说明,覆盖46大模块272功能点
      原文更好阅读体验,不断更新。 可访问: https://www.sunpop.cn/odoo13_release_notes_all_module_features/
      
      
      odoo13正式发布已有接近两周时间,引入了更多的功能,更快的速度,更友好的的界面。
      
      相关的中文翻译及应用市场也持续跟进。成都、上海、香港即将相续迎来新版本的发布会,可以看到odoo13 热度居高不下。
      
      odoo 官方近日释出 《odoo 13 release notes》 。覆盖46大模块272功能点,让我们一起看看 odoo13 的完整全功能,体验下 13 是如何更好的满足我们的业务需要。
      
      更多文章,请参考本站 odoo13 专题 。本文是机器翻译,会持续更新为更好理解的中文。
      
      

      体验 odoo 13,请点此访问 odoo 官方伙伴-广州尚鹏提供的 odooApp13演示网站,注册试用,本试用站已安装若干我们开发的业务增强模块。

      替代文字

      会计
      易用性

      会计凭证及凭证明细中可查看详细操作审计及事件关联;从帐龄余额和合作伙伴分类帐中手动对帐合作伙伴。在移动端查看会计仪表板。

      和解

      将付款与应收款和应付账款对账。查找容易对帐的条目(搜索,统计按钮)。从销售订单中查找项目;银行对帐报告改进。冲销中每行多个税金

      期刊

      日志的默认集,以防止错误;在财务报告中选择几种帐户日记帐。

      资产

      新的资产报告;通过账户管理资产;

      比利时本地化

      导入比利时电子发票。防止在资产负债表和损益报告上出现帐户错误。

      税收

      有锁定日期的定期关闭;简化税收配置;每个税率仅征收一个税;在税收映射中可见的税收类型。

      开票

      在Odoo会计中导入大量客户发票。通过日记帐分录选择发票参考类型。

      供应商账单

      SEPA地区允许进行技术改进和QR代码供应商账单付款。

      国家环保总局

      已添加“后退预订”选项。它有助于定义应如何处理借记,单个合并借记或多个借记。

      会计引擎

      客户发票,供应商账单和日记帐分录的模型已经合并,从而使这些文档的版本更具灵活性。

      文件资料

      改进了PDF预览器的布局。

      增值税

      避免根据增值税号重复合作伙伴。

      跟进

      从后续报告中发送短信。

      税务云

      易于配置。向客户显示税额而不是计算的税率。

      活动项目
      活动类型

      新活动类型,用于请求从记录中上载文档。

      易用性

      活动视图已改进,具有更多功能和更好的活动计划可用性;活动类型中的默认用户和描述

      今天的会议

      一天的会议是将您所有活动聚集在一个屏幕中的活动。

      亚马逊连接器
      亚马逊连接器

      在Odoo中自动导入您的Amazon销售。同步交货(与FBA和FBM兼容)。

      批准书
      请求

      申请批准任何类型的物品,借用物品,购买等

      批准人

      定义谁必须批准请求:员工经理,负责人,...以及所需的许多批准

      活动项目

      如果您必须批准或拒绝新请求,请获取通知。

      通知

      员工将收到有关请求结果的通知。

      评价
      请求

      按需评估,通过员工档案要求。定义员工可以要求评估的时间范围。

      通知事项

      开展活动来管理评估;发送带有适当调查链接的自定义电子邮件。

      提醒事项

      提醒经理和/或员工,他们可以要求评估。

      大体时间

      定义最小和最大时间范围以请求或安排评估

      客户关系管理
      活动

      管道结合了消息和活动。使用机会和邮件对象的强大筛选器。

      铅矿(IAP)

      从您的渠道中,根据国家,技术,规模等产生新的潜在客户。

      潜在客户评分

      统计分析可以确定关闭线索的可能性。

      短信

      从潜在客户和机会发送短信。

      铅富集(IAP)

      Enrich根据电子邮件地址提供企业数据,从而成为领先者。

      销售团队

      简化的销售团队配置。

      讨论
      动作

      在看板和列表视图中将显示一个警告图标,警告您需要对这些记录执行操作。

      历史

      在“讨论”菜单中获取所有通知的历史记录

      档案

      直接在聊天记录或讨论中拖放文件。

      电邮

      现在已注册来自传入电子邮件的抄送。您可以轻松地将它们添加为文档的跟随者。

      通知

      新的通知系统使它们更现代,并且可以在前端使用。

      文件资料
      易用性

      在列表视图中管理文档;YouTube视频的缩略图邮件;可视化大型文档的上传进度;可视化看板中的标签

      访问权限

      按工作区管理读取访问权限(单独的读取和写入访问权限。员工可以查看自己的文档;

      拖放

      将您的文档从一个工作区拖放到另一个工作区。

      积分

      查看招聘应用程序,工资单,产品的文档。

      电子商务
      产品展示

      主产品图片的大小与多余图片的大小相同。可以将其他图像添加到产品变型中。URL的产品变体

      PayU Latam

      现在,拉丁美洲最受欢迎的付款收款方可用于在线付款:电子商务,报价,发票。它可在阿根廷,巴西,智利,哥伦比亚,墨西哥,巴拿马和秘鲁使用。

      建筑模块

      产品的搜索栏摘要已添加。

      股票

      将仓库链接到您的电子商务。

      易用性

      新的“立即购买”按钮可简化购买流程。在前端编辑产品描述;搜索体验变得简单

      优惠券和促销

      对多种产品应用折扣。轻松推广产品(序列)。

      电子学习
      测验

      在课程结束时使用快速测验对学员进行评估。

      轮廓

      检查个人资料中的等级,徽章和管理收藏夹

      资质认证

      认证过程,包括付款可能性,规则,使用调查的时间安排

      课程

      根据内容自动计算课程持续时间。

      见习生

      在联系表上知道哪些合作伙伴拥有证书或遵循您的课程。轻松联系他们

      关键绩效指标

      分析您的课程保留率,关注最多和评分最高的课程。

      易用性

      在全屏模式下共享您喜欢的内容。

      电子商务

      通过电子商务销售课程

      网站

      直接从内容创建和管理课程和课程

      论坛

      将课程链接到论坛,让您的社区回答您的问题

      电子邮件营销
      关键绩效指标

      发送的每封电子邮件的转化KPI(在号召性用语上使用UTM跟踪器):创建的潜在客户数量,创建的订单数量,产生的收入。

      易用性

      现在,您可以在群发邮件中添加一个名称,该名称可以与主题不同,以帮助您组织管道。

      雇员
      存在

      根据出勤,休假,登录,IP地址或已发送电子邮件控制员工的状态

      首选项

      在一个地方管理用户偏好和员工数据。

      易用性

      您的员工现在可以编辑其私人信息。新的搜索面板,跟踪员工的合同问题,放大图片

      技能专长

      在员工表上管理技能和技能水平。与电子学习认证集成。

      恢复

      您的员工现在可以填写简历以获取有关其经历的信息。

      入职

      定义一个入职计划,该计划将创建一系列活动来欢迎您的员工。

      关键绩效指标

      现在,您可以拥有有关合同和员工流动率的统计信息。

      合同

      标引,特定薪金扣除,直接从合同中要求签名,标引,薪水,特定薪金扣除

      时间表

      管理超过2周的日程安排,管理员工兼职

      安全

      员工资料和员工薪资已分开,以确保更好的数据安全性。

      文件资料

      管理超过2周的日程安排,管理员工兼职

      事件
      短信

      使用SMS文本消息交流有关事件的信息。

      易用性

      在事件轨道上的甘特图。

      花费
      客户发票

      选择一个销售订单将费用重新开票给您的客户,或者选择一个分析帐户来跟踪成本。

      员工报销

      薪资整合。偿还员工的工资单。

      易用性

      批量导入您的费用,以简化报告的创建并更快地获得报销。

      现场服务
      介入

      在甘特图视图上计划您的干预。

      专案

      根据项目组织干预和工作表

      工作表

      可编辑的工作表,预览和签名

      营业额

      直接从任务创建销售订单。

      时间表

      直接从任务记录时间并检查计时器

      任务

      在干预期间从任务中选择产品,然后为它们开票。

      舰队
      索赔报告

      从员工那里获得驾驶汽车的历史。

      薪水

      通过薪水实现未来驾驶员管理的自动化。

      服务台
      潜在客户

      将销售线索转换为服务台故障单。

      促销过后

      通过管理退货,贷方通知单,优惠券和支持票中的维修来改善您的售后服务。

      多服务水平协议

      将多个SLA策略应用于单个服务台团队的票证。

      时间计费

      改进了重新开票花费时间的流程。

      门票关闭

      允许客户从其门户关闭票证。

      行动计划
      门户网站

      面向最终用户和服务提供商的新IAP门户。

      潜在客户

      改进了潜在客户生成(显示)中的国家检测。

      揭示

      与多网站兼容的潜在客户。铅矿开采现在依赖于行业。

      IAP帐户

      现在,IAP帐户对所有公司都是通用的,如有必要,可以将其限制为特定的帐户。

      短信

      改进的短信发送工具。

      物联网
      Ingenico

      与Ingenico付款终端集成,用于BeNeLux的PoS。

      设备状态

      跟踪哪些设备仍连接到IoT Box。

      扫描范围

      在网络中搜索IoT Box时,扫描特定的IP范围。

      库存
      路线

      将“按订单生产”路线重命名为“按订单补货”,以提高清晰度(因为我们并不总是“制造”产品,但有时我们会购买它。

      帐户

      当“已收/已交付库存”帐户与“库存评估帐户”相同时,发出警告,以防止用户错误地配置其产品类别。

      多公司

      在库存移动行上添加字段company_id,以仅显示用户公司的产品移动。

      产品

      现在可以在转帐上看到产品的说明。可以根据转帐的类型(交货,内部或收货)来修改描述。

      采摘

      向用户分配选项。可以按选择或按组(从选择列表中)进行选择。

      交货

      向您的客户收取估计或实际费用;打印DHL,Easypost,UPS,FedEx和Bpost的退货标签;如果销售订单中的地址已更改,则发出交货警告

      批号/序列号

      通过新的注释字段添加有关序列号或批号的其他信息:在发票上显示序列号/批号;通过自动生成或从电子表格抄送进行批量分配。

      估价

      现在,股票的估值由估值层表示。它使用户可以清楚地了解股票的价值。

      规则

      将计划日期中的更改传播到下一个动作;如果有库存产品,则将从库存中提取产品。如果不是,则应用MTO,它将自动重新排序。

      库存调整

      无需创建库存调整即可轻松编辑产品的数量。

      通知

      如果无法按时完成交付,则通过下一个活动通知用户;在验证时从交货单发送自动电子邮件:发送短信。

      预测

      借助新的图形和网格视图,轻松检索您的预测库存。

      到岸成本

      现在,到岸成本可以与供应商账单关联。将着陆成本应用于以AVCO计价的产品。

      休息时间
      批准书

      对于未经批准的休假类型,请假申请将直接标记为已批准。

      批准人

      指定谁要进行第二次准假。

      易用性

      在部门上搜索将在子部门上搜索。新的仪表板可检查剩余的叶子。

      通知

      接收有关特定请假类型的通知。

      访问权限

      在员工表上,尽可能批准休假经理。

      在线聊天
      仪表板

      新的仪表板可按操作员获取统计信息。

      分配

      运营商之间的实时聊天对话的更有效分配已经得到了解决。

      午餐
      供应商

      管理供应商的可用性。

      易用性

      通过修改界面(ala文档)简化午餐的顺序

      易用性

      在聊天记录或应用中通知用户。

      邮件

      将当天订购的电子邮件直接发送给供应商。

      制造业
      材料清单

      从BoM成本与结构报告中查看BoM版本和正在进行的ECO。定义物料清单中确切或灵活的组件数量

      工作指示

      建议保留文档,以供在工作单上使用;在生产结束时生成序列号/批号;定义开始日期以计划您的工作订单;工单上的计时器

      MPS

      主生产计划程序已经过全面审查。它的可用性得到了改善。现在,您可以查看确认的销售额并将它们与您的估计进行比较。

      工作中心

      允许将工作中心替换为另一个工作中心。当两个工作中心可以完成同一工作时,这很有用。

      分包

      定义分包物料清单以跟踪您分包商处的组件并接收成品。

      工作表

      直接在Odoo中将Google幻灯片用作工作表。

      市场行销
      范本

      轻松访问广告系列模板可获得一些启发。

      Odoo社交

      Odoo Social是一个新的应用程序,它使您可以监视和发布在Twitter和Facebook等社交媒体上。

      访客追踪

      概述您的在线访客,并使用推送通知和实时聊天请求与他们互动。

      推送通知

      该模块允许您通过社交应用向网站的订阅访问者发送网络推送通知。

      营销自动化
      短信

      自动化SMS并将其集成到您的Marketing Campaigns中。

      移动
      扫瞄

      扫描条形码以在业务文档中查找产品

      时间表

      为了改善在小型设备上的用户体验,我们现在按天而不是每周显示时间表网格。

      讨论

      聊天者的关注者选项现在可以在Mobile上使用。

      文件资料

      现在,文档应用程序已完全集成到我们的移动应用程序中。

      易用性

      现在,移动设备支持左侧搜索面板。直接在视图中搜索;

      推送通知

      当有人为您分配活动时,在您的手机上接收推送通知。

      滑动

      在所有通知上向右滑动以将其标记为已读。如果向左滑动,则会在其中添加一个星星。

      工资单
      好处

      生成并检查员工的福利,以根据其带薪时间和带薪休假计算工资。从员工那里获得驾驶汽车的历史。

      合同

      多合同管理来计算工资单。

      工作录入

      甘特图管理工作时间以生成工资单。

      文件资料

      将您的HR文件集中在文档中。

      结构体

      可以按结构类型对结构进行分组并具有自己的规则。

      薪水

      从员工前端表格索取文件,例如身份证,驾驶执照。

      餐券

      报告以了解员工可以根据其工作计划获得多少餐券。

      具体工资

      员工离职。

      易用性

      拆分员工工资单和员工通讯录以确保数据和文档的机密性。

      报告中

      具有薪资统计和信息的新仪表板。

      比利时本地化

      支持比利时信贷时间,特定的CP 200工作条目类型。dmfa的XML,文档281.10和281.45,员工离职费。

      会计

      从批处理工资生成会计分录。

      历史

      保留结构更改的历史记录。

      规划
      规划

      管理员工的日程安排并预测项目。

      的角色

      通过为员工定义角色来管理轮班。

      复制

      通过复制上一个期间的计划,一键安排排班。

      再发

      让您的班次轮流出现。

      空档

      让您的员工根据自己的角色来管理开放式班次。

      班次模板

      将班次另存为模板,一键组织您的计划。

      不可用

      发送您的计划,让您的员工自己管理不可用的情况。

      门户网站

      查看您的计划并在前端视图上为自己分配空缺

      PLM
      PLM批准

      查看在ECO上发生的所有批准的历史记录。

      销售点
      雇员

      现在,您只能对多个员工使用一个会话。在PoS会话中可以同时连接多名员工

      易用性

      新的统计按钮可通过定义默认的拣配类型来访问订单的详细信息,菜单的重新排序以及在装机方面的改进。

      键盘

      使用PoS前端界面上的键盘来管理订单。

      快讯

      下一个活动,通知用户何时应关闭并重新打开会话。

      报告中

      将PoS销售额计入产品销售额。在PoS报表中管理多种货币

      印表机

      连接没有IoT Box的EPSON票证打印机。

      现金控制

      设置默认现金开始,现金结束并跟踪任何现金差额。

      会议闭幕

      在PoS结束时会创建一个会计条目。这样可以改善性能并提供更清晰的付款历史记录。

      门票提示

      在打印票证后添加提示。通过电子邮件发送票证,而不是打印票证

      付款

      通过SIX和Adyen付款终端集成来处理付款。

      采购
      报告中

      一个新的仪表盘可以分析您的购买情况。

      采购订单

      在采购订单中添加节和注释。

      变体

      从属性网格中批量添加产品变体。

      项目
      预测

      预测可用性和计划改进。包括重复性,离开集成和默认视图选择。

      项目概况

      更好地跟踪与项目相关的成本和收入。

      易用性
      演示数据

      在某些应用程序中添加了演示数据,以简化测试体验。

      设定

      加快安装过程(帐户和语言图表)。

      报告中

      现在可以从大多数数据透视图视图访问记录列表。过滤过去5年的数据;分组超过2组。

      活动项目

      新活动视图

      Snailmail(IAP)

      通过snailmail发送信件时,改进了可用性和错误管理。

      甘特

      带有拖放功能的新甘特图,可轻松调整大小并记录创建。

      访问权限

      组已重命名为更面向业务。管理员代替管理员,并按应用程序进行重组。

      时区

      未设置时区时警告用户。

      看板

      序列可以从看板视图重新排序。

      日期过滤器

      新的日期过滤器(按月,季度,年)。

      多公司

      允许用户一次与多家公司的文档进行交互。通过添加公司来共享产品或不共享产品

      地图检视

      在地图上显示记录和路线。

      自订清单

      每个用户都可以在列表视图中添加或隐藏一些列,以便仅使用所需字段来根据其活动量身定制屏幕。

      进口

      改进了导入时的错误管理。

      语言能力

      使用新的翻译模式直接从表单视图进行翻译。新的语言代码取代了地球仪,可帮助您了解所使用的语言。预览不同语言的邮件

      日历

      日历视图的用户界面经过重新设计,具有一些小的新功能,例如可以直接从事件弹出窗口中回答事件。

      文件资料

      自定义文档的样式(颜色,字体)。

      搜索面板

      现在,可从任何多记录视图中使用搜索面板。

      色带

      用于表单视图的新功能区。

      列大小调整

      调整了可编辑列表的列大小,以提高舒适度。

      签名小部件

      新的签名小部件可在任何过程中请求签名确认。

      出口

      快速导出列表,轻松导出电子表格屏幕上显示的内容

      产品

      允许拖放其他产品介质以对其进行排序。

      转介
      游戏

      为您的员工提供一个超级英雄游戏,以组建团队并通过招聘过程赢得积分。

      招募

      与招聘应用程序集成,可自动为您的员工分配积分。

      分享

      通过社交媒体或电子邮件轻松分享工作职位。

      移动

      移动友好。一键推荐朋友。

      UTM

      推荐应用基于UTM引擎将合适的员工链接到合适的申请人。

      租借
      产品

      根据其可用性管理可出租产品的交付和退货。使用基于期间的定价和延迟成本。在甘特图中可视化计划。借助Sign应用程序集成,可以使客户当场填写和签署租赁文件。

      2个日期选择器

      从统一的小部件中选择租赁日期作为开始和结束日期。

      营业额
      退款

      您可以在销售订单上看到已退款的发票行。

      开票

      更好的措辞。仅在需要时才显示预付定金的选项。从统一的小部件中选择租赁日期作为开始和结束日期。

      签名

      签署,然后在一个不间断的流程中支付报价。新的小部件可自动生成签名。

      订购日期

      现在,订单和确认日期是一个统一的智能字段。

      产品变体

      可以为每个变体添加多个图像。

      产品配置器

      统一按钮可将产品添加到销售订单中,无论是标准产品还是可自定义产品。

      新销售订单表格

      订单行显示更清晰,列标签更清晰。

      电邮

      现在针对每个渠道量身定制确认电子邮件:报价,电子商务。

      支付宝

      中国商人可以使用支付宝在线支付。

      电汇

      建议的支付通信是现在,  默认情况下,订单/发票#。

      额外费用

      现在,付款表格中会显示在线支付所要求的额外费用。

      选购产品

      更改报价模板时,将重置可选产品。

      交货

      更好的界面,用于选择承运人并为订单设置交付成本。

      网格输入

      从属性网格条目中批量添加产品变体。

      亚马逊同步

      在Odoo中自动导入您的Amazon销售。同步交货。

      价目表

      从销售价格中添加更多价格。

      标志
      没有电子邮件

      现在,您无需发送电子邮件即可直接签署文档。

      退款

      现在,签名请求会触发活动。

      易用性

      全面审查用户体验:配置文档,发送,签名。

      可追溯性

      活动日志的完全可追溯性和不可更改性。各方可以将日志以PDF格式打印。

      短信营销
      短信营销

      创建,发送和跟踪短信。

      社会营销
      社会营销

      Odoo Social是一个新的应用程序,它使您可以监视和发布在诸如Twitter和Facebook之类的社交媒体上。

      推送通知

      该模块允许您通过社交应用程序将Web推送通知发送给网站的订阅访问者

      战役

      创建完全集成的数字广告系列,其中包含电子邮件,短信,推送通知和社交帖子。从点击次数,收入,创造的潜在客户和销售等方面,概述广告系列的结果。

      饲料

      将信息流添加到仪表板以监视您的Facebook和Twitter帐户,并通过评论,顶和帖子与您的社区进行交互。(当前不适用于LinkedIn)。

      实时聊天请求

      与您的一个或多个网站访问者进行对话。他们将在跟踪页面上的下一步操作中收到您的消息。

      线上访客

      获取您网站访问者的准确列表,并通过电子邮件,短信,推送通知或实时聊天请求与他们联系。

      发送和安排帖子

      直接发送或安排要在Facebook,Twitter和LinkedIn上发送的帖子。

      调查
      访问权限

      澄清访问权限;

      证明书

      创建证书,调查时间限制。

      易用性

      从看板的角度了解认证的成功率是多少。您还可以访问其他统计信息。

      工作室
      活动

      活动计划和活动视图现在可用于自定义模型。

      易用性

      将边栏“节点选择器”中的展开节点与文档中的预览对齐。

      小部件

      整数和,签名

      领域

      新的搜索栏可轻松查找Studio中的现有字段。

      易用性

      参见看板中的不可见元素;通过删除网格视图,设置另一个视图选项并启用阶段来防止用户进行错误的自定义。

      恢复默认视图

      恢复默认视图。

      技术
      易用性

      从“ ir.attachment”中删除“ datas_fname”字段,根据预测的需要,网格视图现在支持日期时间字段。

      群发邮件活动

      删除了mass_mailing.campaign模型以仅保留utm.campaign模型。此更改意味着mass_mailing.tag和mass_mailing.stage移至utm模型。

      Create_uid启发式改进

      邮件网关运行程序用户用于通过传入电子邮件创建大多数文档。现在,我们使用电子邮件进行匹配,从而将文档创建和更新链接到用户。

      Create_uid启发式改进

      邮件网关运行程序用户用于通过传入电子邮件创建大多数文档。现在,我们使用电子邮件进行匹配,从而将文档创建和更新链接到用户。

      时间表
      开始/停止

      定时执行任务以轻松记录时间表。

      门户中的发票时间表

      现在可以在门户网站上查询与发票有关的时间表。

      网络电话
      通话队列

      在CRM中,您可以轻松创建呼叫队列。然后,这些呼叫将在您的VOIP界面上。该队列基于您的“呼叫下一个”活动,使您可以轻松地在VOIP界面中查看所有需要进行的呼叫。

      电话号码

      直接通过他的电话号码拨打任何联系人

      网站
      主题

      轻松更改徽标大小;自定义CSS和JS的空文件

      易用性

      更新到Bootstrap 4.3.1; 手机上的活动;

      锚

      版本的锚点。

      网志

      审查博客布局。全新的现代意大利设计(预告片,最新博客文章,卡片等)。

      搜索引擎优化

      如果您将标题和描述字段保留为空,则页面将使用默认标题和描述。

      性能

      推迟网站JS加载以提高性能。

      自动配置的联系表格

      新的联系表单会自动使用默认字段进行配置。

      自动配置的联系表格

      新的联系表单会自动使用默认字段进行配置。

      易用性

      新的字体选择工具。New Modal用于上传图像,控制图像的大小和质量。

      易用性

      新的字体选择工具。New Modal用于上传图像,控制图像的大小和质量。

      主题和摘要

      很少有片段和主题的修复和改进。

      URL中的ISO代码语言

      对于lambda用户而言,语言的iso代码不是很容易理解。因此,您现在可以在网站网址上指定语言。

      论坛

      您可以订购论坛并使用(旧的)新讨论模式。

      身分识别

      您可以在网站上设置特定徽标,而在公司上设置其他徽标。

      身分识别

      您可以选择一种Google字体并在您的网站上使用它。

      错误处理程序

      带有Bootstrap的Toast组件的新错误处理程序。

      通讯

      快速在您的网站上添加新闻通讯,并将其自定义为其他摘要。

      实时聊天记录

      作为访客,请通过电子邮件获取与操作员的对话记录。

      门户网站

      门户网站上现在提供了Chatter和附件。

      事件

      与会者扫描的用户界面已得到改进

      发布在 Odoo 开发与实施交流
      G
      guohuadeng
    • odoo13正式发布,欢迎参与企业版社区版中文化翻译,建立我们的odoo13中文版专业版

      原文更好阅读体验,不断更新。 可访问: https://www.sunpop.cn/odoo13_chinese_translate_transifex_profession/

      参与者(提PR)附送odoo13模块。

      ======================================
      odoo13 国庆献礼! 新发布的odoo13 在功能、性能、界面都有极大的更新,特别是企业版,在生产供应链和hr都增加了很多激动人心的功能,在可预见的将来必然会蓬勃发展。有关 odoo13 的在功能、性能、界面上各种功能增强,请参阅 我们的odoo13专题。

      广州尚鹏是 odoo 官方合作伙伴,亦可审核 Transifex 上的中文化翻译。

      为推动 odoo 中文化的发展,同时为保证自有商业客户的正常使用,建立此开源代码仓库repo进行 odoo13 中文化翻译。详情请查阅

      https://github.com/guohuadeng/odoo13-cn

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

      版本

      source: 社区版翻译

      source_ent: 企业版翻译

      翻译规范

      我们使用 odoo 对标 SAP 系统,故翻译上主要也参考 SAP。其次参考 MRPII 规范。在ref目录有相关文档。

      • SAP 术语
      • MRPII 术语
      • 行业标准术语

      如何贡献 odoo13 翻译

      odoo13 官方翻译主要通过 transifex.com ,由于 transifex 上的使用方便和审核效率问题,我们同时也建立了这个仓库,力争更快更精确的实现 odoo13 中文化。

      方法一:通过我们的 github 贡献翻译

      仓库地址:https://github.com/guohuadeng/odoo13-cn

      更新提交:使用 git PR(pull request),参考 https://www.jianshu.com/p/d921828bf623

      建议:在此 repo 上提 issue

      方法二:通过 transifex.com

      1. 注册登录 http://www.transifex.com
      2. 加入 odoo 中国团队 https://www.transifex.com/odoo/teams/
      3. 参与 odoo13 翻译
        总览: https://www.transifex.com/odoo/odoo-13/dashboard/

      模块翻译: https://www.transifex.com/odoo/odoo-13/translate/#zh_CN

      po下载与上传: https://www.transifex.com/odoo/odoo-13/language/zh_CN/

      文件夹说明
      ├─ref 参考文档

      ├─source 通过 .tx 获取的odoo的 PO 翻译文档,并更新,可直接用于 odoo13

      ├─source_ent 同上,企业版

      获取最新 .po 文件,更新后发布至 transifex

      1. 安装 tx 客户端,请先自行安装 pip3
      pip3 install transifex-client -i https://mirrors.ustc.edu.cn/pypi/web/simple
      
      1. 取最新的 po,先进入 /source 目录
      cd source
      tx pull -l zh_CN
      
      1. 查看下载的 po 文件并更改,在 ./source 目录下,即可看到相关的 odoo 翻译文件

      2. 推送翻译文件至 tx,参考 https://docs.transifex.com/transifex-github-integrations/github-tx-client

      tx push -t
      
      发布在 Odoo 开发与实施交流
      G
      guohuadeng
    • RE: 一键安装最新odoo 13,12,11社区版企业版+ postgresql10 +nginx在ubuntu上的自动安装脚本,阿里云测试通过,

      @月满西楼 报错多数是有些python库没下载,多数是墙或者python list更新原因,不影响大局。

      本地包是指你从官网下载,上传到服务器上。远程的就是直接wget。
      本地宝多数用于企业版,这个都有说明,可以看下readme。

      发布在 Odoo 开发与实施交流
      G
      guohuadeng
    • odoo开发规范,囊括模块视图后端前端规范,以odoo12为基准,

      作为全球第一的开源ERP,开源的作用就是让您根据本企业业务特性,灵活的定制,实现动态的IT系统,可随着业务变化优化您的ERP,进而优化管理运营。

      对中大型企业而言,odoo必须进行开发才可落地,所以一个良好的开发规范,将更有助于团队协助,敏捷开发上线。

      本文内容亦是我们进行odoo开发的内部规范,主要参考官方开发教程翻译,原文在此:

      英文: https://www.sunpop.cn/documentation/12.0/reference/guidelines.html
      中文: https://www.sunpop.cn/odoo_develop_guidelines_python_widget_javascript/

      odoo开发规范
      本文介绍 Odoo 编码指南。其目的是提高 Odoo 应用程序代码的质量。事实上,正确的代码提高了可读性、简化维护、有助于调试、降低复杂性并提高可靠性。这些准则应该应用于每个新模块的开发和所有新开发。

      警告

      在stable(稳定)版本中修改现有文件时,原始文件样式将严格取代任何其他样式准则。换句话说,请不要修改odoo正式发布的已有文件或代码,以应用这些准则。它避免了中断代码行的修订历史记录。差异应保持在最小。有关详细信息,请参阅odoo官方的 pull request guide指南。

      警告

      修改master(主开发)版本中的现有文件时,仅可针对 revision(正在修订时)版本中的代码或大多数文件,将这些准则应用于现有代码。换句话说,仅当现有文件结构发生重大更改时,才修改它。在这种情况下,首先执行 move commit,然后才应用与其相关的更改。

      模块结构
      目录及对应作用
      data/:演示和数据文件
      models/:模型定义
      controllers/:控制器(包含HTTP路由)
      views/:视图和模版
      static/:web资源,包括css/, js/, img/, lib/, ...
      wizard/:向导及其视图
      report/:报表
      tests/:单元测试代码
      文件命名
      业务model放置在一个文件里,如果模块只包含一个model,它的名字就与模块名一致。如:

      models/<main_model>.py
      models/<inherited_main_model>.py
      views/<main_model>_templates.xml
      views/<main_model>_views.xml
      data/<main_model>_demo.xml
      data/<main_model>_data.xml
      例如:销售模块包含sale_order和sale_order_line两个模型,并且sale_order是主模型,所以文件将被命名为models/sale_order.py和 views/sale_order_views.py。
      对于数据文件命名,按用途进行命名:demo或者data。例如:data/sale_order_demo.xml和data/sale_order_data.xml
      每个模块的控制器都放在一个文件中,命名为main.py。如果是从另一个模块继承的,则将其命名为<module_name>.py。

      与模型不同,每个控制器类应包含在一个分离的文件中。例如,采购模块在控制器/portal.py 中实现其客户门户的一部分,并在控制器/购买.py 上实现其自身的典型路由。

      对于静态文件,由于资源可以在不同的上下文中使用(前端、后端、两者),因此它们将仅包含在一个捆绑包中。因此,CSS/Less、JavaScript 和 XML 文件应生捆绑一个其类型的后缀名称。

      即:im_chat_common.css,用于"资产_公共"捆绑的 im_chat_common.js,以及用于"资产_后端"捆绑的 im_chat_backend.js。如果模块只拥有一个文件,则约定将<module_name>.ext(即:project.js)。不要在 Odoo 外部链接数据(图像、库):不要使用图像的 URL,而应将其复制到我们的代码库中。

      关于数据,按用途拆分它们:数据或演示。文件名将是主模型名称,后缀为 _data.xml 或 _demo.xml。

      关于向导,命名约定是 :

      <main_transient>.py
      <main_transient>_views.xml
      其中<main_transient>是占主导地位的瞬态模型的名称,就像模型一样。<main_transient>.py 可以包含模型"transient_model.action"和"transient_model.action.line"。

      统计报表命名:

      report/<report_name>_report.py
      report/<report_name>_report_views.py
      可打印报表:

      report/<print_report_name>_reports.py
      report/<print_report_name>_templates.xml
      完整的文件列表如下:

      addons/<my_module_name>/
      |-- init.py
      |-- manifest.py
      |-- controllers/
      | |-- init.py
      | |-- <inherited_module_name>.py
      | -- <my_module_name>.py |-- data/ | |-- <main_model>_data.xml | -- <inherited_main_model>_demo.xml
      |-- models/
      | |-- init.py
      | |-- <main_model>.py
      | -- <inherited_main_model>.py |-- report/ | |-- __init__.py | |-- <main_stat_report_model>.py | |-- <main_stat_report_model>_views.xml | |-- <main_print_report>_reports.xml | -- <main_print_report>_templates.xml
      |-- security/
      | |-- ir.model.access.csv
      | -- <main_model>_security.xml |-- static/ | |-- img/ | | |-- my_little_kitten.png | | -- troll.jpg
      | |-- lib/
      | | -- external_lib/ | -- src/
      | |-- js/
      | | |-- <my_module_name>.js
      -- <my_widget_A>.js | |-- css/ | | -- <my_module_name>.css
      | |-- scss/
      | | -- <my_module_name>.scss | -- xml/
      | |-- <my_module_name>.xml
      -- <my_widget_A>.xml |-- views/ | |-- <main_model>_templates.xml | |-- <main_model>_views.xml | |-- <inherited_main_model>_templates.xml | -- <inherited_main_model>_views.xml
      -- wizard/ |-- <main_transient_A>.py |-- <main_transient_A>_views.xml |-- <main_transient_B>.py -- <main_transient_B>views.xml
      文件名应仅包含 [a-z0-9
      ] (小写字母数字和 _)

      警告

      使用正确的文件权限 : 文件夹 755 和文件 644。

      XML文件
      格式
      当定义一个记录的xml时,需要标记:

      id属性放在model属性前
      字段(field)定义中,name属性放在第一个。然后,将值放在标签内,或者放在eval属性中。最后将其他属性(widget、options...)按重要性排序。
      尝试按模型对记录进行分组。如果操作/菜单/视图之间存在依赖关系,则此约定可能不适用。
      使用在下一章节中定义的命名约定
      标签仅用于设置不可更新的数据noupdate=1,如果整个xml文件都是不可更新数据,则noupdate=1属性可以设置在标签上,而不需要标签。

      view.name
      object_name








      Odoo支持一些自定义标签作为快捷方式:

      menuitem:作为ir.ui.menu的快捷方式
      template: 表示只需要arch视图部分的QWeb视图
      report: 用于定义报表report action
      act_window:当record用不了的时候用它
      我们更推荐上述4个标签类型,相对于 record 标签。
      xml_id命名
      权限(Security)、视图(View)和动作(Action)使用的命名规则:

      菜单(menu): <model_name>_menu
      视图(view): <model_name>view<view_type>,view_type可能的取值有:kanban, form, tree, search
      动作(action): 主动作命名为<model_name>_action,其他的动作命名为<model_name>action,其中使用小写字母简单描述动作
      组(group): <model_name>group<group_name>,group_name可能的取值包括:user, manager,...
      规则(rule): <model_name>rule<concerned_group>,concerned_group可能的取值包括: 模型用户规则user, 公共用户规则public,多公司用户规则company

      ... ... ... ... ... ... ... 视图名称(name)使用点表示法:my.model.view_type 或者 my.model.view_type.inherit

      继承XML的命名
      继承视图的命名规则为

      #. Extension 扩展模式:使用与要扩展的原始视图相同的 xml id,并使用 _inherit 后缀 :如 视图view project.project_view_form 被扩展 为 project_forecast.project_view_form_inherit.
      #. Primary 主模式:保持原有 xml id。


      ...

      primary ... Python PEP8 选项 Odoo源代码基本准守Python标准PEP8,但是忽略其中一些规则:

      E501:行太长了
      E301:预计有1个空行,找到0
      E302:预计有2个空行,找到1
      E126:延长线过度缩进以用于悬挂缩进
      E123:关闭支架与开口支架线的压痕不匹配
      E127:延伸线过度缩进以进行视觉缩进
      E128:用于视觉缩进的缩进的延续线
      E265:阻止评论应以'#'开头
      Import 导入
      import 的顺序

      导入外部库
      导入odoo
      导入odoo的模块
      在每组中的导入按字母顺序排序

      1 : imports of python lib

      import base64
      import re
      import time
      from datetime import datetime

      2 : imports of odoo

      import odoo
      from odoo import api, fields, models # alphabetically ordered
      from odoo.tools.safe_eval import safe_eval as eval
      from odoo.tools.translate import _

      3 : imports from odoo addons

      from odoo.addons.website.models.website import slug
      from odoo.addons.web.controllers.main import login_redirect
      编程习惯
      每个python文件都应该以 # -- coding: utf-8 -- 作为第一行。
      简单易读的代码
      不要使用.clone()

      bad

      new_dict = my_dict.clone()
      new_list = old_list.clone()

      good

      new_dict = dict(my_dict)
      new_list = list(old_list)
      Odoo中编程
      避免创建生成器和装饰器:仅使用Odoo API已有的
      使用filtered, mapped, sorted, … 方法来提升代码可读性和性能。
      让你的方法可以批量处理
      当添加一个函数时,确保它可以处理多条数据,典型用法是通过 api.multi 装饰器,可以在self上进行循环处理

      @api.multi
      def my_method(self)
      for record in self:
      record.do_cool_stuff()
      避免使用 api.one 装饰器,因为它可能不会像预想中一样工作。
      为了更好的性能,比如当定义一个状态按钮时,不在 api.multi 循环里用search 和 search_count 方法,要用 read_group 来实现一次请求中全部计算。

      @api.multi
      def _compute_equipment_count(self):
      """ Count the number of equipement per category """
      equipment_data = self.env['hr.equipment'].read_group([('category_id', 'in', self.ids)], ['category_id'], ['category_id'])
      mapped_data = dict([(m['category_id'][0], m['category_id_count']) for m in equipment_data])
      for category in self:
      category.equipment_count = mapped_data.get(category.id, 0)
      context上下文环境
      context是一个 frozendict 不能修改。当需要使用不同的 context 来调用一个方法时,可以通过with_context 来实现。

      records.with_context(new_context).do_stuff() # all the context is replaced
      records.with_context(**additionnal_context).do_other_stuff() # additionnal_context values override native context ones
      在 context 中传递参数可能会产生危险的副作用。由于值是自动传播的,因此可能会出现某些不可预期行为。在 context 调用具有 default_my_field 键的模型的 create() 方法将为相关模型设置 my_field 的默认值。但是,如果固化此创建,其他对象(如 sale.order.line,在sale.order 创建中)具有一个相同字段 my_field,其默认值也将设置。

      如果需要创建影响某些对象行为的关键 context,请选择一个好名称,并最终按模块的名称为其前缀,以隔离其影响。一个很好的例子是 mail 模块的密钥:mail_create_nosubscribe, mail_notrack, mail_notify_user_signature, …

      不要绕过ORM
      当ORM可以实现的时候尽量使用ORM而不要直接写sql,因为它可能会绕过orm的一些规则如权限、事务等,还会让代码变得难读且不安全。

      very very wrong

      self.env.cr.execute('SELECT id FROM auction_lots WHERE auction_id in (' + ','.join(map(str, ids))+') AND state=%s AND obj_price > 0', ('draft',))
      auction_lots_ids = [x[0] for x in self.env.cr.fetchall()]

      no injection, but still wrong

      self.env.cr.execute('SELECT id FROM auction_lots WHERE auction_id in %s '
      'AND state=%s AND obj_price > 0', (tuple(ids), 'draft',))
      auction_lots_ids = [x[0] for x in self.env.cr.fetchall()]

      better

      auction_lots_ids = self.search([('auction_id','in',ids), ('state','=','draft'), ('obj_price','>',0)])
      防止SQL注入!
      使用 SQL 代码查询时,必须注意不要引入 SQL 注入漏洞。当用户输入被错误地过滤或引用错误时,存在此漏洞,从而允许攻击者向 SQL 查询引入不需要的子句(例如绕过筛选器或执行 UPDATE 或 DELETE 命令)。

      安全的最佳方法是永远不要使用 Python 字符串串联 (+) 或字符串参数插值 (%)将变量传递到 SQL 查询字符串。

      几乎同样重要的第二个原因,应该由数据库抽象层 (psycopg2) 来决定如何格式化查询参数,而不是您的代码!例如,psycopg2 知道,当您传递一个值列表时,它需要将它们格式化为逗号分隔列表,包含在括号中!

      the following is very bad:

      - it's a SQL injection vulnerability

      - it's unreadable

      - it's not your job to format the list of ids

      self.env.cr.execute('SELECT distinct child_id FROM account_account_consol_rel ' +
      'WHERE parent_id IN ('+','.join(map(str, ids))+')')

      better

      self.env.cr.execute('SELECT DISTINCT child_id '
      'FROM account_account_consol_rel '
      'WHERE parent_id IN %s',
      (tuple(ids),))
      这些都是非常重要的,所以在重构时也要小心,最重要的是不要复制这类错误!

      下面是一些令人难忘的示例,可帮助您记住问题的内容(但不要在那里复制代码)。在继续之前,请务必阅读 pyscopg2 的在线文档,以了解正确使用它:

      The problem with query parameters (http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters)
      How to pass parameters with psycopg2 (http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries)
      Advanced parameter types (http://initd.org/psycopg/docs/usage.html#adaptation-of-python-values-to-sql-types)
      扩展的思考
      函数和方法不应包含太多的逻辑:使用大量小而简单的方法比使用少量大型和复杂的方法更可取。一条好的经验法则是,只要方法具有多个责任,就将其拆分(参考 http://en.wikipedia.org/wiki/Single_responsibility_principle)

      应避免在方法中硬编码业务逻辑,因为它可以防止子模块轻松扩展。

      do not do this

      modifying the domain or criteria implies overriding whole method

      def action(self):
      ... # long method
      partners = self.env['res.partner'].search(complex_domain)
      emails = partners.filtered(lambda r: arbitrary_criteria).mapped('email')

      better but do not do this either

      modifying the logic forces to duplicate some parts of the code

      def action(self):
      ...
      partners = self._get_partners()
      emails = partners._get_emails()

      better

      minimum override

      def action(self):
      ...
      partners = self.env['res.partner'].search(self._get_partner_domain())
      emails = partners.filtered(lambda r: r._filter_partners()).mapped('email')
      为了示例,上述代码是可扩展的,但必须考虑可读性,并且必须做出权衡。

      此外,相应地命名函数:小且正确命名的函数是可读/可维护代码和更严格的文档的起点。

      此建议还与类、文件、模块和包相关。(另请参阅 http://en.wikipedia.org/wiki/Cyclomatic_complexity)

      不要手动提交事务
      Odoo 框架负责为所有 RPC 调用提供事务上下文。原则是,在每个 RPC 调用开始时,打开一个新的数据库游标,并在调用return返回时commit,即在commit前先将结果返回至 RPC 客户端,大致如下所示:

      def execute(self, db_name, uid, obj, method, *args, **kw):
      db, pool = pooler.get_db_and_pool(db_name)
      # create transaction cursor
      cr = db.cursor()
      try:
      res = pool.execute_cr(cr, uid, obj, method, *args, **kw)
      cr.commit() # all good, we commit
      except Exception:
      cr.rollback() # error, rollback everything atomically
      raise
      finally:
      cr.close() # always close cursor opened manually
      return res
      如果在执行 RPC 调用期间发生任何错误,事务将以原方式回滚,从而保留系统的状态。

      同样,系统在执行测试代码期间还提供专用事务,因此可以回滚或不依赖于服务器启动选项。

      因此,如果您在任何地方代码调用 cr.commit() ,您很有可能会以各种方式破坏系统,因为您将导致部分提交,从而导致部分和不干净的回滚,从而导致问题:

      业务数据不一致,通常是数据丢失
      工作流取消同步,文档永久卡住
      无法干净地回滚的测试,并且将开始污染数据库并触发错误(即使事务期间未发生错误也是如此)

      所以请遵照以下非常简单的规则:

      您绝对不要自己调用 cr.commit(),除非 您已显式创建自己的数据库游标!或者你有特殊的原因必须这样做。

      如果您确实创建了自己的游标,则需要处理错误情况和适当的回滚,并在完成该游标后正确关闭游标。

      与普遍的看法相反,在以下情况下,您甚至不需要调用cr.commit() :

      在模型的 _auto_init() 方法中。模型对象:这是由加载项初始化方法,或由 ORM 事务在创建自定义模型时处理
      在报表中: commit() 也由框架处理,因此您甚至可以在报表内更新数据库
      在模型中。瞬态方法:这些方法与常规模型完全一样。模型,在事务中,并在末尾使用相应的 cr.commit()/rollback()
      其它情况(如果您有疑问,请参阅上面的一般规则!
      所以,服务器框架之外的所有 cr.commit() 调用都必须有一个明确的注释,解释它们为什么是绝对必要的,为什么它们确实是正确的,以及为什么它们不中断事务。否则,他们应该被删除!

      正确的使用翻译方法
      Odoo 使用类似于 GetText 的方法名 _( ) 来指示代码中使用的静态字符串需要在运行时使用上下文的语言进行翻译。通过在代码中通过导入访问此伪方法:

      from odoo.tools.translate import _
      在使用它时,必须遵循一些非常重要的规则,以便它正常工作,避免在翻译中填充无用的垃圾。

      基本上,此方法只应用于在代码中手动编写的静态字符串,它无法转换字段值,如产品名称等。必须使用相应字段上的翻译标志来完成此操作。

      规则非常简单:对下划线方法的调用应始终以 _("文本字符串")的形式进行,而没有其他内容:

      good: plain strings

      error = _('This record is locked!')

      good: strings with formatting patterns included

      error = _('Record %s cannot be modified!') % record

      ok too: multi-line literal strings

      error = _("""This is a bad multiline example
      about record %s!""") % record
      error = _('Record %s cannot be modified'
      'after being validated!') % record

      bad: tries to translate after string formatting

      (pay attention to brackets!)

      This does NOT work and messes up the translations!

      error = _('Record %s cannot be modified!' % record)

      bad: dynamic string, string concatenation, etc are forbidden!

      This does NOT work and messes up the translations!

      error = _("'" + que_rec['question'] + "' n")

      bad: field values are automatically translated by the framework

      This is useless and will not work the way you think:

      error = _("Product %s is out of stock!") % _(product.name)

      and the following will of course not work as already explained:

      error = _("Product %s is out of stock!" % product.name)

      bad: field values are automatically translated by the framework

      This is useless and will not work the way you think:

      error = _("Product %s is not available!") % _(product.name)

      and the following will of course not work as already explained:

      error = _("Product %s is not available!" % product.name)

      Instead you can do the following and everything will be translated,

      including the product name if its field definition has the

      translate flag properly set:

      error = _("Product %s is not available!") % product.name
      此外,请记住,翻译者必须使用传递给 _() 函数的字面值,因此请尽量使其易于理解,并将伪字符和格式保持在最低限度。翻译者必须注意,需要保留格式模式(如 %s 或 %d、newline 换行等),以明智和明显的方式使用这些格式模式非常重要:

      Bad: makes the translations hard to work with

      error = "'" + question + _("' nPlease enter an integer value ")

      Better (pay attention to position of the brackets too!)

      error = _("Answer to question %s is not valid.n"
      "Please enter an integer value.") % question
      通常,在 Odoo 中,在操作字符串时,更多用 % 而不是用 .format()(当字符串中只有一个变量替换),更多用 %(varname) 而不是指定位置(当多个变量必须替换时)。这使得社区翻译人员更容易翻译。

      符号和习惯
      模型名-使用.分隔,模块名做前缀
      定义odoo模型时,使用单数形式的名字如res.partner,sale.order 而不是 res.partnerS,saleS.orderS
      定义odoo Transient / wizard时,命名格式为<related_base_model>.,此瞬态模型是 related_base_model是基础模型(在目录 models/ 中定义)进行的关联,action是功能简称,避免使用 wizard 关键字. 例如: account.invoice.make, project.task.delegate.batch, …
      定义报表模型(或者SQL View)时,使用<related_base_model>.report.,和瞬态模型一样
      python类-使用驼峰命名
      class AccountInvoice(models.Model):
      ...
      变量命名
      模型变量使用驼峰命名方式
      普通变量用小写字母 + 下划线关联来命名
      如果变量包含记录 id 或 id 列表则将变量名称后缀为 _id 或 _ids。不要使用 partner_id 来包含一条 res.partner 的记录(id 只记录id这个数字,而非对象)
      Partner = self.env['res.partner']
      partners = Partner.browse(ids)
      partner_id = partners[0].id
      One2Many, Many2Many字段一般以ids作为后缀如:sale_order_line_ids
      Many2One 字段一般以_id为后缀如:partner_id, user_id
      方法命名
      计算字段: 计算方法一般是_compute
      <field_name>
      搜索方法: search<field_name>
      默认方法: default<field_name>
      列表值方法: selection<field_name>
      onchange方法: onchange<field_name>
      Constraint 约束方法: check<constraint_name>
      Action动作方法: 一个对象的动作方法一般以action_开头,它的装饰器是 @api.multi,如果它只使用单条计算,可在方法头添加self.ensure_one()
      模型中属性顺序
      私有属性:(_name, _description, _inherit, …)
      默认方法和 _default_get
      Field 字段声明
      Compute, inverse and search 等计算和搜索方法和字段声明顺序一致
      Selection 方法(返回 selection 字段的列表值)
      Constrains 约束方法(@api.constrains) and onchange 字段值变更方法 (@api.onchange)
      CRUD方法(ORM 覆盖与继承)
      Action方法
      最后是其他业务方法
      class Event(models.Model):
      # Private attributes
      _name = 'event.event'
      _description = 'Event'

      # Default methods
      def _default_name(self):
          ...
      
      # Fields declaration
      name = fields.Char(string='Name', default=_default_name)
      seats_reserved = fields.Integer(oldname='register_current', string='Reserved Seats',
          store=True, readonly=True, compute='_compute_seats')
      seats_available = fields.Integer(oldname='register_avail', string='Available Seats',
          store=True, readonly=True, compute='_compute_seats')
      price = fields.Integer(string='Price')
      event_type = fields.Selection(string="Type", selection='_selection_type')
      
      # compute and search fields, in the same order of fields declaration
      @api.multi
      @api.depends('seats_max', 'registration_ids.state', 'registration_ids.nb_register')
      def _compute_seats(self):
          ...
      
      @api.model
      def _selection_type(self):
          return []
      
      # Constraints and onchanges
      @api.constrains('seats_max', 'seats_available')
      def _check_seats_limit(self):
          ...
      
      @api.onchange('date_begin')
      def _onchange_date_begin(self):
          ...
      
      # CRUD methods (and name_get, name_search, ...) overrides
      def create(self, values):
          ...
      
      # Action methods
      @api.multi
      def action_validate(self):
          self.ensure_one()
          ...
      
      # Business methods
      def mail_user_confirm(self):
          ...
      

      Javascript和CSS
      Static files 静态文件目录
      Odoo 模块有一些关于如何构造各种文件的约定。在这里,我们将更详细地解释 Web 资源应该如何组织。

      首先要知道的是,Odoo 服务器将提供(静态)web服务给位于 static/ folder 文件夹中的所有文件,注意仅针对指定后缀的文件类型。一个例子是,如果文件位于 addons/web/static/src/js/some_file.js , 那么此静态文件可以如此访问 url

      your-odoo-server.com/web/static/src/js/some_file.js

      请按如下约定结构组织你的代码:

      static: 所有一般静态资源文件
      static/lib: 库文件,如: jquery 库可放在 addons/web/static/lib/jquery
      static/src: 源文件
      static/src/css
      static/src/fonts
      static/src/img
      static/src/js
      static/src/scss
      static/src/xml: 所有qweb templates 文件
      static/tests: 所有测试相关文件
      Javascript 编码规范
      use strict; 建议用于所有 javascript 文件
      使用代码格式化脚本 linter (jshint, …)
      不要使用压缩编译过的 Javascript 库
      类名使用驼峰命名
      除非你的javascript代码需要全局(即在所有页面)运行,否则必须在website模块中声明一个 if_dom_contains 。对 dom 元素的操作要使用 JQuery 代码
      odoo.website.if_dom_contains('.jquery_class_selector', function () {
      /your code here/
      });
      CSS 编码规范
      用 o_<module_name> foras forase,其中 module_name 是模块的技术名称("sale","im_chat",...)或模块的主路由(主要为 website 网站相关模块,如网站/论坛模块的"o_forum")。此规则的唯一例外是 webclient:它只使用 o_ 前缀。
      避免使用 id 标签
      使用Bootstrap 原生的 classes
      使用 underscore 小写加 _ 连接来命名 class 类
      Git 操作规范
      这个按各自喜好,习惯方便就好,关键在于把 Git 用好!

      发布在 Odoo 开发与实施交流
      G
      guohuadeng