vuvivian's blog

越努力,越幸运.

  1. 1. Odoo遵循 MVC-like 架构设计
  2. 2. Odoo模块权限管理
  3. 3. 创建模型层
    1. 3.0.1. 应用程序的主要功能有:用于描述的简单文本字段、用于将其标记为完成的复选框、最后需要添加一个按钮来清除已完成任务的旧的待办事项列表。
  • 4. 加入自动化测试
    1. 4.0.1. Odoo支持使用两种方式来描述测试: 使用 YAML 数据文件或使用 Python 代码、基于 Unittest2 库。 YAML 测试是一种遗留下来的旧老版本, 不建议使用。 我们会更乐意使用 Python 测试并将添加基本的测试实例到我门的模块。
    2. 4.0.2. 测试代码文件必须用test_开头 , 并且从tests/init.py文件导入。 但 测试的 目录(或 Python 的子模块)不应从模块的顶部的init.py导入, 因为仅在测试的执行的时候会自动被发现并装载。
    3. 4.0.3. 运行我们的测试。 当我们在安装模,可以添加 –test-enable选项: $ ./odoo-bin -d todo -i todo_app –test-enable
  • 5. 创建视图层
    1. 5.0.0.1. 用户界面接口,包括菜单和动作,存储在数据库表中。
    2. 5.0.0.2. 创建Form视图
    3. 5.0.0.3. 添加动作按钮
    4. 5.0.0.4. 创建Tree视图
    5. 5.0.0.5. 创建Search视图
  • 6. 业务逻辑层
  • Odoo遵循 MVC-like 架构设计

    • M模型层,定义app的数据结构,描述业务对象,模型是从 Odoo 模板类派生的 Python 类实现的。 它们直接转换为数据库对象,Odoo在安装或升级模块时会自动处理。负责此机制的是对象关系模型(ORM)。
    • V视图层,描述用户界面,是使用XML定义的,它被Web客户端框架用来转换成数据感知的HTML视图,当模块安装或升级时,xml数据文件中的这些用户接口定义就会被加载到数据库中。所有的视图都存储在数据库中,在 ir.ui.view模式下.
    • C 控制器层,支持应用的业务逻辑

    在启动服务器实例时,附加选项–dev=all。

    Odoo模块权限管理

    一般odoo管理权限会放在security文件夹里、一个csv和一个xml重要的两个文件
    1. security.xml:id可以看着来写,ref-=“中的内容是继承第一个id”,仔细观察下就会发现规律。
    2. ir.model.access.csv:文件名与要加载的数据的模块名相对应,并且该文件的第一行包含列名称。以下是我们的 CSV 文件中提供的列:
    * id是记录的外部标识符 (也称为 XML ID)。在我们的模块中它应该是唯一。
    * name是一个描述标题。它只是内容展示,在模块中最好也保持其唯一性。官方模块通常使用模型名称和组的圆点分隔的字符串。遵循此约定,我们使用 todo.task.user
    * model_id 是该模型的外部标识符。ORM给模型自动生成的 O的 XML Id︰ 如 todo.task,该标识符是model_todo_task
    * group_id标识授予权限的访问组。最重要的一点是提供定义它的模块名前缀。比如员工组,它的标识符为base.group_user。
    * perm字段标记授予的读, 写, 创建,或删除权限。
    3. 不能忘记将引用添加到文件manifest.py的data属性中。 security/ir.model.access.csv’,
    4. https://blog.csdn.net/qq_43504054/article/details/98958080


    创建模型层

    应用程序的主要功能有:用于描述的简单文本字段、用于将其标记为完成的复选框、最后需要添加一个按钮来清除已完成任务的旧的待办事项列表。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # -*- coding: utf-8 -*-
    from odoo import models, fields

    # 声明新模型。它是从models.Model派生的类。
    class TodoTask(models.Model):
    _name = 'todo.task' # _name属性,定义将在整个Odoo中引用此模型的标识符。注意,实际的Python类名,在这个例子中,TodoTask对其他Odoo模块是无意义的。 _name值将用作标识符。
    _description = '待办事项' # _description模型属性。它不是强制性的,但它为模型记录提供了一个用户友好的名称,可用于用户友好的消息。
    # 定义模型的字段
    name = fields.Char('Description', required=True) #name和active是特殊的字段名。默认情况下,当从其他模型引用它时,Odoo将使用name字段作为记录的标题
    is_done = fields.Boolean('Done?')
    active = fields.Boolean('Active?', default=True)

    可以使用技术菜单查看新创建的模型。在顶部菜单设置中,转到技术|数据库结构|模型,在列表中搜索todo.task模型,并单击它以查看其定义:


    加入自动化测试

    Odoo支持使用两种方式来描述测试: 使用 YAML 数据文件或使用 Python 代码、基于 Unittest2 库。 YAML 测试是一种遗留下来的旧老版本, 不建议使用。 我们会更乐意使用 Python 测试并将添加基本的测试实例到我门的模块。
    测试代码文件必须用test_开头 , 并且从tests/init.py文件导入。 但 测试的 目录(或 Python 的子模块)不应从模块的顶部的init.py导入, 因为仅在测试的执行的时候会自动被发现并装载。
    运行我们的测试。 当我们在安装模,可以添加 –test-enable选项: $ ./odoo-bin -d todo -i todo_app –test-enable

    创建视图层

    用户界面接口,包括菜单和动作,存储在数据库表中。
    1. 添加一个菜单选项来打开To-do Task模型

    2. 添加id属性也称为XML ID,它用于唯一标识模块内的每个数据元素,并且可以由其他元素使用来引用它。

    3. 添加到manifest.py文件的data属性中。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      <?xml version="1.0"?> 
      <odoo>
      <!-- <act_window>元素定义了一个客户端窗口动作,该动作将以列表和表单视图的顺序打开todo.task模型。 -->
      <act_window id="action_todo_task"
      name="To-do Task"
      res_model="todo.task"
      view_mode="tree,form" />
      <!-- <menuitem>定义了一个顶级菜单项,调用前面定义的action_todo_task动作。 -->
      <menuitem id="menu_todo_task"
      name="Todos"
      action="action_todo_task" />
      </odoo>
      创建Form视图
    4. 要向模块添加视图,我们在XML文件中声明一个描述视图的元素,该模块在安装模块时将被加载到数据库中。

    5. todo_view.xml

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      <?xml version="1.0"?> 
      <odoo>
      <record id="view_form_todo_task" model="ir.ui.view">
      <field name="name">To-do Task Form</field>
      <field name="model">todo.task</field>
      <field name="arch" type="xml">
      <form string="To-do Task">
      <group>
      <field name="name"/>
      <field name="is_done"/>
      <field name="active" readonly="1"/>
      </group>
      </form>
      </field>
      </record>
      </odoo>
    6. form视图下的标签

      • header
      • sheet
      • group
      添加动作按钮

      Form视图可以添加按钮以完成特定动作。这些按钮可以打开一个新的包含Form表单的窗口或运行定义在模块中的Python函数。

    • string:展示在按钮上的文本

    • type:动作的类型(执行的操作)

    • name:定义的动作(操作的标识符)

    • class:一个可选的属性,用于展示Css样式,同HTML规则一样

      创建Tree视图
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
       <record id="view_tree_todo_task" model="ir.ui.view"> 
      <field name="name">To-do Task Tree</field>
      <field name="model">todo.task</field>
      <field name="arch" type="xml">
      <tree decoration-muted="is_done==True">
      <field name="name"/>
      <field name="is_done"/>
      </tree>
      </field>
      </record>
      创建Search视图
    • 元素定义了在搜索框中输入时也能搜索的字段。

    • 元素添加了预定义的过滤条件(过滤条件可以通过用户点击来切换),是使用特定语法来定义的。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      	<record id="view_filter_todo_task" model="ir.ui.view"> 
      <field name="name">To-do Task Filter</field>
      <field name="model">todo.task</field>
      <field name="arch" type="xml">
      <search>
      <field name="name"/>
      </search>
      </field>
      </record>

    业务逻辑层

    Toggle Done按钮的操作将非常简单:只需切换Is Done? 标记。对于记录上的逻辑,使用@api.multi装饰器。 这里,self将表示一个记录集,然后我们应该遍历每个记录。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def do_toggle_done(self): 
    for task in self:
    task.is_done = not task.is_done
    return True

    @api.model
    def do_clear_done(self):
    dones = self.search([('is_done', '=', True)])
    dones.write({'active': False})
    return True

    AttributeError: module ‘odoo.api’ has no attribute ‘multi’
    After searching in github found that ‘multi’ is removed from Odoo 13.0 as it will be default.
    https://github.com/odoo/odoo/commit/4b38cc6590abcb58a0ca102a06063eb3db7ac1f4#diff-2c418cb78b7c562a79e7032645a537d2

    本文最后更新于 天前,文中所描述的信息可能已发生改变