【转载】odoo技术开发白皮书 第一部分 第二章 Hello Odoo

Odoo模块开发入门

转载:http://book.odoomommy.com/chapter1/README2.html

第二章 Hello Odoo

本系列教程将告诉大家如何做一个书店,所以我们将给这个模块命名为book_store。模块的命名一定要体现出模块的用途,且不要跟已有的模块名重名,所以在模块前加上公司名是一个不错的选择。

脚手架

下面的命令可以帮助我们创建一个标准模块所需要的全部文件:

odoo scaffold book_store .

这个命令是odoo提供的脚手架,scaffold是命令,后面跟模块名和模块路径,执行完命令的结果如下:

然后我们再根据我们的实际情况对其中的某些文件进行修改就可以了。

odoo模块结构

  • controllers: 主要是一些HTTP请求相关的业务逻辑。
  • models: 模型文件夹,业务的模型都放在这里。
  • security: 权限相关的文件。
  • views: 视图文件夹,关于界面布局的逻辑在这里。
  • static: 静态文件夹,前端使用的qweb文件和js、css文件和图片等静态文件放到这个文件夹内。
  • __init__:熟悉python的都懂,不说了
  • __manifest__: 9.0之前叫_openerp_.py,Odoo模块必须的文件,包含必要的模块信息。

接下来我们修改一下模块的信息,修改_manifest_.py文件,如以下:

# -*- coding: utf-8 -*-
{
    'name': "book_store",

    'summary': """
        demo module for tutorial.""",

    'description': """
        This module is writing for who wants learn odoo developments.
    """,

    'author': "KevinKong",
    'website': "http://www.odoomommy.com",

    # Categories can be used to filter modules in modules listing
    # Check https://github.com/odoo/odoo/blob/12.0/odoo/addons/base/data/ir_module_category_data.xml
    # for the full list
    'category': 'tutorial',
    'version': '15.1',

    # any module necessary for this one to work correctly
    'depends': ['base'],

    # always loaded
    'data': [
        'security/ir.model.access.csv',
        'views/views.xml',
        # 'views/templates.xml',
    ],
    # only loaded in demonstration mode
    'demo': [
        'demo/demo.xml',
    ],
    "application": True
}

常见的manifest中的键值信息有:

  • name:模块名称,在模块列表中显示的名称,仅作名称使用,没有限制条件。
  • summary: 模块的摘要信息,通常比较简短。
  • description: 模块的详细信息,用于说明模块如何使用,说明文档等内容,可以放置图文信息以帮助用户更好地使用模块。
  • author:作者信息
  • website:模块的主页
  • category: 模块的分类,没有限制,可以自己新加分类,建议根据模块的用途进行分类。
  • version:版本信息, 推荐在版本中包含odoo的版本信息,例如15.1
  • data:数组,需要加载的静态文件路径,通常放的是视图文件、权限文件csv和qweb模板文件的路径。
  • demo:演示数据
  • application: 布尔值,标示本模块是否为一个应用。
  • qweb: qweb文件路径
  • installable: 布尔值,标示本模块是否可以被安装。
  • external_dependencies: 模块的外部依赖,通常用来填写Python的依赖包。({'python':['openpyxl','simplejson']})

加载模块

写完这个,我们可以验证一下Odoo是否能够正确加载我们的模块。

模块的路径需要写到配置文件中,如果是笔者这种安装方式,配置文件在/etc/odoo/odoo.conf

启动odoo后,打开debug模式(URL/web?debug=1),在应用-更新本地模块中点击更新:

module

然后再搜索book_store:

bk

这样就说明odoo正确的加载了我们的模块。

第一个模块

定义模型

odoo开发的第一步就是要先建立自己的数据模型,也就是我们常说的models,模型对应的是数据库中的数据表,但是模型的概念比表更多,很多属性并不存储在数据库中。现在,我们先建一个基础的图书信息,假设目前我们的图书只采集了如下几个属性:

  • 名称
  • 作者
  • 日期
  • 定价

名称是字符串,因此使用Char类型,作者这里先设置为Char类型,后期会更改为Many2one类型,日期是Datetime,定价就是Float。因此,我们的模型可以写成下面这样:

class Book(models.Model):
    _name = 'book_store.book'

    name = fields.Char('名称', help='书名')
    author = fields.Char('作者', help='作者')
    date = fields.Date("出版日期", help="日期")
    price = fields.Float("定价", help="定价")

odoo所有的持久化模型都要继承自models.Model类,当然也存在于另外一种非持久化的类,这个等到后面再详细介绍。这里,我们先简单记住,所有的要在数据库中建立表结构的对象,都要继承自models.Model类。

定义视图文件

odoo能够快速开发应用的一个很重要的原因就是它封装了很多常见的操作,像创建、编辑、搜索和删除等,默认情况下,我们不用重写这些逻辑就可以使用,甚至不用写视图文件。但是为了说明起见,我们这里还是要编写一些视图文件。

编辑views文件夹下的view.xml文件,添加如下代码:

<odoo>
  <data>
    <!-- explicit list view definition -->

    <record model="ir.ui.view" id="book_store.list">
      <field name="name">图书列表</field>
      <field name="model">book_store.book</field>
      <field name="arch" type="xml">
        <tree>
          <field name="name"/>
          <field name="author"/>
          <field name="date"/>
          <field name="price"/>
        </tree>
      </field>
    </record>

    <record id="book_store.book_form" model="ir.ui.view">
      <field name="name">图书</field>
      <field name="model">book_store.book</field>
      <field name="arch" type="xml">
        <form string="图书详情">
          <sheet>
            <h1>
              <field name="name"/>
            </h1>
            <group>
              <field name="author"/>
              <field name="date"/>
              <field name="price"/>
            </group>
          </sheet>
        </form>
      </field>
    </record>
    <!-- actions opening views on models -->
    <record model="ir.actions.act_window" id="book_store.action_window">
      <field name="name">图书</field>
      <field name="res_model">book_store.book</field>
      <field name="view_mode">tree,form</field>
    </record>

    <!-- Top menu item -->

    <menuitem name="西西弗斯书店" id="book_store.menu_root"/>

    <!-- menu categories -->

    <menuitem name="书店" id="book_store.menu_book" action="book_store.action_window" parent="book_store.menu_root"/>

    <menuitem name="图书" id="book_store.menu_book" action="book_store.action_window" parent="book_store.menu_root"/>


  </data>
</odoo>

加载更改后的模块

XML文件写完以后,在应用-模块中点击升级模块对模块进行升级。

当修改了py文件时,需要重启odoo进程,而修改了xml等静态文件则需要升级模块。

升级完成后,进入odoo发现没有我们写完的menu。这是因为,我们只创建了model却没有给任何一个组赋予访问这个模型的权限,因此我们无权查看这个模块的界面。

添加模型的访问权限

默认情况下,我们不拥有对新创建的对象的访问权限,因此我们需要在安装模块时,给指定的用户添加访问权限。odoo提供的方式之一,就是按照一定的格式编写一个csv文件,声明在manifest文件中。这样当升级模块时,odoo就能够读取csv文件中的权限设置,并写入到数据库中。

给book模型添加权限,编辑security文件夹中的ir.model.access.csv文件,csv文件从左右到依次是,id,名称,模型id,组ID,读权限,写权限,创建权限、删除权限。

其中模型是model_加上模型名组成的,其中的点号要换成下划线。

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_book_store_book,book_store.book,model_book_store_book_store,base.group_user,1,1,1,1
  • id: 该权限记录的唯一标示
  • name: 访问权限的名字
  • model_id:id: 模型名称,格式为 模块名.模型名
  • group_id:id: 设置的用户组,格式为 模块名.组xml_id
  • perm_read: 对应访问权限
  • perm_write: 对应编辑权限
  • perm_create: 对应创建权限
  • perm_unlink: 对应删除权限

后四列,当为1时表示拥有这个权限,0代表没有权限。

设置完权限,我们重新升级模块,就可以看见我们自定义的菜单出来了:

app

点击菜单我们可以创建图书:

book

查看图书列表:

list

开发者调试模式

正常情况下,代码文件发生改变需要重启odoo进程或升级模块,对开发者来说,频发的Ctrl+C和upgrade有时候比较费事,Odoo提供了一种免重启的模式,当代码文件发生变化时自动重载并更新视图文件,大大简化了开发的步骤。

启动这个模式的命令是在启动odoo的命令后添加一个–dev参数:

odoo -c /etc/odoo/odoo.conf --dev=all

注意:可能会碰到下面的错误:

'inotify' module not installed. Code autoreload feature is disabled

这是因为缺少依赖库inotify, 使用pip命令安装即可:

pip install inotify

总结

本章,我们学习了一个模块的基本组成结构,并尝试编写了我们的第一个模块。下一步,我们将认识odoo中模型的基本字段类型和基本的视图类型。

1 ERP 简介 1 1.1 Odoo 历史 1 1.2 ERPⅡ 或商业智能化 2 1.2.1 什么是商业智能 4 2 Odoo 框架简介 7 2.1 python 模块分析 8 2.2 python2 还是 python3 8 3 Odoo 的安装和配置 9 3.1 PostgreSQL 数据库 10 3.2 Ubuntu14.04 下可能缺失的软件包 11 3.3 网页显示 node.js 方面 11 3.4 其他问题 12 3.5 通过命令行运行时的配置 12 3.5.1 –xmlrpc-port=8888 12 3.5.2 –addons-path=addons 12 3.5.3 数据库的一些配置 13 3.5.4 –save 13 3.6 将安装环境封装起来 13 3.7 文档编译 14 4 初入 Odoo 17 4.1 管理数据库 17 4.2 登录界面 18 4.3 Administrator 首选项 19 4.4 导入一个翻译 20 4.5 新的 Demo 用户 20 4.6 模块管理 21 4.7 修改公司信息 21 4.8 打开技术特性支持之后 22 4.9 进销存和财务系统的抽象讨论 22 4.9.1 以采购部门为例 23 4.10 安装和配置模块 24 5 创建自己的模块 27 5.1 快速生成模块骨架 27 5.1.1 python 模块的 init 文件 28 5.1.2 作为 Odoo 模块的说明文件 29 5.2 安装自定义模块 32 5.2.1 模块文件夹管理 32 5.3 一个简单的演示模块 33 5.3.1 controllers 33 5.3.2 views 33 5.3.3 models 35 5.3.4 security 37 5.3.5 美化网页 38 5.4 加分项: 通过 pgadmin3 来查看数据库 39 5.4.1 安装 39 5.4.2 连接服务器 39 5.4.3 图形化查询 40 6 Odoo 开发基础: 请假模块第一谈 43 6.1 纯理论讨论 43 6.2 定义模型 45 6.3 加入菜单 46 6.3.1 act_window 的属性 48 6.3.2 menuitem 的属性 48 6.4 视图优化 48 6.4.1 修改 tree 视图 49 6.4.2 修改 form 视图 49 6.5 完整的 views.xml 51 6.6 给模块加个图标 53 7 Odoo 开发基础: 工作计划模块第一谈 55 7.1 数据访问权限管理 61 7.1.1 access rule 62 7.1.2 record rule 62 8 扩展现有模块-继承机制 65 8.1 给模块增加 field 65 8.2 修改已有的 field 66 8.3 重载原模型的方法 66 8.3.1 什么是 Recordset 67 8.3.2 Odoo 里面的 domain 语法 68 8.3.3 recordset 的 search 方法 69 8.4 视图 xml 文件的继承式修改 70 8.4.1 视图元素添加 71 8.4.2 原视图元素属性修改 71 8.5 多态继承 72 8.6 修改其他数据文件 73 8.6.1 删除记录 73 8.6.2 更新数据 73 8.7 委托继承 74 9 理解模型内的数据文件 75 9.1 理解外部 id 75 9.2 使用外部 id 77 9.3 导出或导入数据文件 77 9.4 快捷输入标签 78 9.5 用 field 标签设置值 78 9.5.1 eval 语法 78 9.5.2 ref 属性 79 9.5.3 One2many 和 Many2many 的 eval 赋值 79 10 Odoo 开发基础: 请假模块第二谈 81 10.1 本例涉及到的数据库表格简介 89 10.2 工作流概念入门 89 10.2.1 定义工作流对象 90 10.2.2 创建节点 91 10.2.3 创建连接 91 11 Odoo 模型层详解 93 11.1 _name 93 11.2 各个表头属性 93 11.3 name 字段 94 11.4 具体模型的数据 94 11.5 模型间的关系 95 11.6 工作流 95 12 Odoo 视图层详解 97 13 附录 99 13.1 Odoo 里老的 API 99 13.2 PostgreSQL 数据库命令行操作 99 13.2.1 命令行数据库备份 99 13.3 反向代理 (reverse proxy) 99 13.3.1 安装 ngnix 软件 100 13.3.2 强制 https 连接 102 13.3.3 nginx 优化 102 13.3.4 轮询机制 102 13.4 跟踪项目源码初始化进程 102 13.4.1 base 模块 104 13.4.2 web 模块 105 13.4.3 web_kanban 模块 105 13.5 配置会计科目 105 13.5.1 配置会计科目类型 105 13.5.2 配置会计科目 106 13.6 分录 106 13.7 新建业务伙伴 106 13.7.1 新建业务伙伴标签 106 13.7.2 新建客户 106 13.8 创建新的产品 107 13.9 设置会计年度 107 13.10向供应商下单 107 13.11会计学入门 107 13.11.1财务报表 108 13.11.2原始凭证 108 13.11.3账户 108 13.11.4分类帐 109 13.11.5会计科目表 109 13.11.6报告期间 110 13.12参考资料 110
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值