Odoo学习笔记

1,073 阅读4分钟

参考

Odoo 12开发者指南第四章 创建Odoo插件模块

Odoo 12开发者指南第五章 应用模型

使用脚手架创建新模块

进入odoo-bin所在目录(根目录)执行

python odoo-bin scaffold [book] [myaddons]

根目录/myaddons下创建一个新的模块book

创建model

1.在根目录/__init__.py引入models

from . import models

2. 在模块/models/下新建一个library_book.py文件

from odoo import models, fields, api


class LibraryBook(models.Model):
    # 它提供了一个唯一内部标识符来在Odoo实例中进行使用。
    # ORM会根据这个属性来生成数据表。我们使用了_name = ‘library.book’。
    # 基于这一属性,该ORM框架会创建一个名为library_book的新数据表
    _name = 'library.book'
    # 为定义的模型添加了一个用户友好的标题。
    # 这并非强制的,但可以为一些插件所用。
    # 例如,它可在创建记录时用于mail插件模块中追踪功能的通知文本
    _description = 'Library Book'
    # 记录进行排序(按时间最近排序,然后按标题排序)
    _order = 'date_release desc, name'
    # _rec_name字段作为该条记录的表示,默认只是name,我们可以修改
    _rec_name = 'short_name'
    name = fields.Char('Title', required=True)
    short_name = fields.Char('Short Title', required=True)
    date_release = fields.Date('Release Date')
    author_ids = fields.Many2many('res.partner', string='Authors')

    # name_get()的默认实现使用_rec_name属性来查找放置数据的字段,
    # 使用它生成显示名称。如果你想要自己实现显示名称,
    # 可以重载name_get()中的逻辑来生成一个自定义显示名称。
    # 该方法应返回一个包含两个元素的元组列表:记录ID和记录的Unicode字符串表示。
    def name_get(self):
        result = []
        for record in self:
            rec_name = "%s (%s)" % (record.name, record.date_release)
            result.append((record.id, rec_name))  # 返回元组(记录的ID,对外显示的字符串)
        return result


  1. 记得在模块/models/__init__.py引入新创建的library_book.py文件

创建视图

  1. 模块名/views/下新建library_book.xml文件

创建根菜单--》子菜单---》Action---》列表---》From表单---》搜索视图

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <!--    搜索视图-->
    <record id="library_book_view_search" model="ir.ui.view">
        <field name="name">Library Book Search</field>
        <field name="model">library.book</field>
        <field name="arch" type="xml">
            <search>
                <!-- 配置搜索框里可搜索的字段-->
                <field name="name"/>
                <field name="author_ids"/>
                <!-- 自定义过滤器 搜索没有作者的书-->
                <filter string="无作者"
                        name="without_author"
                        domain="[('author_ids', '=', False)]"/>
            </search>
        </field>
    </record>
    <!-- List列表 -->
    <record id="library_book_view_tree" model="ir.ui.view">
        <field name="name">Libray Book List</field>
        <field name="model">library.book</field>
        <field name="arch" type="xml">
            <tree>
                <field name="name"/>
                <field name="date_release"/>
                <field name="author_ids" widget="many2many_tags"/>
            </tree>
        </field>
    </record>
    <!-- Form表单   -->
    <record id="library_book_view_form" model="ir.ui.view">
        <field name="name">Library Book Form</field>
        <field name="model">library.book</field>
        <field name="arch" type="xml">
            <form>
                <group>
                    <group>
                        <field name="name"/>
                        <field name="author_ids" widget="many2many_tags"/>
                    </group>
                    <group>
                        <field name="short_name"/>
                        <field name="date_release"/>
                    </group>
                </group>
            </form>
        </field>
    </record>
    <!--    book子菜单对应的 Action动作-->
    <record id='library_book_action'
            model='ir.actions.act_window'>
        <field name="name">Library Books</field>
        <field name="res_model">library.book</field>
        <field name="view_type">form</field>
        <field name="view_mode">tree,form</field>
    </record>

    <!--    根菜单-->
    <menuitem name="My Library" id="libray_base_menu"/>
    <!--    book子菜单-->
    <menuitem name="Books" id="library_book_menu"
              parent="libray_base_menu" action="library_book_action"/>


</odoo>
  1. 根目录/__manifest__.py中引入新创建的视图文件library_book.xml

创建用户组和添加权限

  1. 创建用户组

在添加新的数据模型时,你需要定义谁可以创建、读取、更新和删除记录。在创建一个全新的应用时,这可能还包含新的用户组的定义。因此,如果用户没有访问权限的话,Odoo则不会该显示菜单和视图。

所以我们先创建一个图书管理员的用户组

根目录/security/下创建groups.xml

<?xml version="1.0" encoding="utf-8" ?>
<odoo>
    <record id="group_librarian" model="res.groups">
        <field name="name">Librarians</field>
        <field name="users" eval="[(4, ref('base.user_admin'))]" />
    </record>
</odoo>

我们通过admin用户的引用ID base.user_admin为其授予了Librarians的权限,这样admin用户将拥有library.book模型的权限。

换句话说,我们新建了一个用户组,并且在这个项目组下添加了一个admin的用户,这个admin是通过引用的方式添加的,其中

  1. 数字4表示引用
  2. ref('base.user_admin')是admin这个用户的外部ID
  1. 添加访问权限

我们已经有了图书管理员用户组Librarians,通过编辑security/ir.model.access.csv,让Librarians用户组拥有这个应用的增删改查权限,让所有用户组拥有读的权限

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
acl_book,library.book_default,model_library_book,,1,0,0,0
acl_book_librarian,library.book_librarian,model_library_book,group_librarian,1,1,1,1
  1. 别忘了编辑__manifest__.py,引入这两个xml文件,注意顺序

_rec_name和name_get()方法修改记录名

_rec_name字段作为该条记录的表示,默认值是name

我们可以修改为short_name
_rec_name = 'short_name' 此时记录名为short_name

这个记录名称还可以这样改:通过重写name_get方法