Odoo

    ### 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文件来初始化模块:
                        ```Linux
                        mkdir -p ~/odoo-dev/custom-addons/library_app
                        touch ~/odoo-dev/custom-addons/library_app/__init__.py
                - 添加声明文件,几个重要的属性
                    ```Python
                {
                    # 插件模块标题字符串
                    '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。
            - 可选择为模块添加一个图标

                - 要添加图标,需要在模块中添加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字段的值是否正确)
    ```Python
    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中加入内容
        ```python
        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模板

  转载请注明: 微笑看你 Odoo

 上一篇
EXCEL EXCEL
​#### 数据透视表有去重的作用 计数: count:计有数字的单元格 counta:计单元格的个数 表格判断:if(条件,true,false),三个判断的时候,用两个if函数 四舍五入:round(float,number) f
2020-11-19
下一篇 
Odoo Odoo
#### 定义: - Qweb被用作OpenERP的web客户端模板引擎。它是一种基于XML的模板语言。 - 特征: - 完全在客户端浏览器中完成渲染 - 一个模板文件中可以包含多个模
2019-05-10
  目录