Odoo结构

  • 数据层、逻辑层、展示层
  • 数据层:是最底端一层,负责数据持久化存储,Odoo借助PostgreSQL来实现。
  • 逻辑层:负责与数据层的所有交互,并由Odoo服务完成。通常,底端数据库不应通过这一层获取,只有这样才能保证权限控制和数据一致性。在Odoo的核心代码中包含供这一接口使用的ORM(对象关系映射Object-relational Mapping)引擎。ORM提供插件模块与数据交互的API。
  • 展示层:用于展示数据并与用户交互,通过客户端实现用户体验。客户端与ORM API交互来读、写、验证或执行其他操作;通过RPC调用ORM API方法。这些操作发往Odoo服务器端操作,然后结果发送回客户端做进一步处理。

注:Odoo自带全面功能的web客户端

视图列表

  • 视图类型分类
  • 表单视图(Form)
  • 树状列表视图(Tree)[列表视图(List)]
  • 搜索视图(Search):指右上角搜索框中的过滤选项
  • 看板视图(Kanban)
  • 继承视图:每个base视图都可以有多个扩展,称为继承视图。每个继承视图可以对base视图添加修改,如对已有表单添加字段。(继承视图自身也可以被其它视图继承,这时最外层继承在内层继承执行后作用于base视图)

创建第一个Odoo应用

  • 创建新的插件模块
  • 一个插件模块是包含实现一些Odoo功能的文件,可以添加新的功能或修改已有的功能。插件目录必须含有一个声明或描述文件_manifest_.py,以及其它模块文件。
  • 创建新模块,需求:
  • 确保操作的目录是Odoo的addons路径(添加自定义模块应放在Odoo同级创建目录)
  • odoo/addons ----- 自带官方应用插件路径
  • odoo/odoo/addons ------ 目录中提供核心功能的base模块
  • 创建模块目录,并包含声明文件
  • 通过命令行,添加一个空的__init__.py文件来初始化模块:
mkdir -p ~/odoo-dev/custom-addons/library_app
  touch ~/odoo-dev/custom-addons/library_app/__init__.py
  • 添加声明文件,几个重要的属性
{
    # 插件模块标题字符串
    'name': 'Library Management',
    # 功能描述长文件,通常为RST格式
    'description': 'Manage library book catalogue and lending.',
    # 作者姓名,本处为一个字符串,可以是逗号分隔的一系列姓名
    'author': 'Alan Hou',
    # 一个依赖插件模块列表,在模块安装时会先安装这些插件
    'depends': ['base'],
    # 一个布尔型标记,代表模块是否在应用列表中以APP展现
    'application': True,
}
  • 和Odoo相关的其他属性名,建议使用
  • summary:显示为模块副标题的字符串
  • version:默认为1.0,应遵守版本号规则。建议在模块版本号前加上Odoo版本号,如12.0.1.0
  • license:默认为LGPL-3
  • website:了解模块更多信息的URL,可以帮助人们查看更多文档或提供文件bug和建议跟踪
  • category:带有模块功能性分类字符串,缺省为Uncategorized。
  • sequence:运行模块的顺序,排列运行的顺序
  • 可选择为模块添加一个图标
  • 要添加图标,需要在模块中添加static/description/icon.png文件。
  • 如打算对外发布,为模块选择一个证书
  • Odoo常用的协议是LGPL第三版和AGPL。
  • LGPL授权更广,它允许在无需分享相应源码的情况下对代码进行做出商业修改;AGPL则是一个更严格的开源证书,它要求派生代码及服务托管者分享源码。
  • 添加模型字段时需进行升级。修改Python代码时需要重启服务
  • 修改XML或CSV文件时,需进行升级。在不确定时,同事重启服务并升级模块
  • 添加自动化测试
  • 测试代码文件名应以test-开头,并通过tests/__ init__.py引用。但测试目录(Python子模块)不应在模块的外层__init__.py中引入,因为仅测试执行时才会自动查找和加载它。
  • 测试应放在tests/子目录中,在tests/__ init__.py中添加代码
    from . import test_book
  • 在tests/test_book.py文件中添加实际的测试代码(创建一本新书并检测active字段的值是否正确)
from odoo.tests.common import TransactionCase

class TestBook(TransactionCase):
    def setUp(self, *args, **kwargs):
        result = super().setUp(*args, **kwargs)
        self.Book = self.env['library.book']
        self.book_ode = self.Book.create({
            'name': 'Odoo Development Essentials',
            'isbn': '879-1-78439-279-6'})
        return result
    def test_create(self):
        "Test Books are active by default"
        self.assertEqual(self.book_ode.active, True)
  • 使用-test-enable参数在安装或升级模块时进行测试
    ~/odoo-dev/odoo/odoo-bin -d dev12 -u library_app --test-enable
  • Odoo服务会在升级的模块中查找tests/子目录并运行。

模型层

  • 创建数据模型
  • 明确Python所需引用的模型目录,在__ init__.py文件中添加:from . import models
  • 要引用创建的Python代码文件,在models/__ init__.py文件中添加:from . import library_book.py(library_book是模型的名字)
  • 在models/library_book.py中加入内容
from odoo import fileds, models

class Book(models.Model):
    # 模型的标识符
    _name = 'library.book'
    _description = 'Book'
    name = fields.Char('Title', required=True)
    isbn = fields.Char('ISBN')
    active = fields.Boolean('Active?', default=True)
    date_published = fields.Date()
    image = fields.Binary('Cover')
    publisher_id = fields.Many2one('res.partner', string='Publisher')
    author_ids = fields.Many2many('res.partner', string='Authors')
  • 设置访问权限
  • 行级权限规则

视图层

  • 添加菜单项
  • 创建表单视图XML文件
  • 业务文件表单视图
  • 添加操作按钮
  • 使用组来组织表单
  • 完整表单视图
  • 添加列表视图和搜索视图

业务逻辑层

  • 添加业务逻辑(通过在模型Python类中编写方法来实现)
  • 网页和控制器
  • QWeb模板是一个视图类型,其中的template元素用于声明QWeb模板