参考
使用脚手架创建新模块
进入odoo-bin所在目录(根目录)执行
python odoo-bin scaffold [book] [myaddons]
在
根目录/myaddons下创建一个新的模块book
创建model
1.在根目录/__init__.py引入models
from . import models
模块/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
- 记得在
模块/models/__init__.py引入新创建的library_book.py文件
创建视图
- 在
模块名/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>
- 在
根目录/__manifest__.py中引入新创建的视图文件library_book.xml
创建用户组和添加权限
- 创建用户组
在添加新的数据模型时,你需要定义谁可以创建、读取、更新和删除记录。在创建一个全新的应用时,这可能还包含新的用户组的定义。因此,如果用户没有访问权限的话,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是通过引用的方式添加的,其中
- 数字4表示引用
- ref('base.user_admin')是admin这个用户的外部ID
- 添加访问权限
我们已经有了图书管理员用户组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
- 别忘了编辑
__manifest__.py,引入这两个xml文件,注意顺序
_rec_name和name_get()方法修改记录名
_rec_name字段作为该条记录的表示,默认值是name
我们可以修改为short_name
_rec_name = 'short_name'
此时记录名为short_name
这个记录名称还可以这样改:通过重写name_get方法