odoo12—开发手册>>P02

本文详细介绍了Odoo中如何创建自定义模块,从命令行生成模块骨架到模型、视图、菜单和权限的配置。在模型部分,讲解了字段类型和示例数据的设置。接着,阐述了视图的创建,包括tree和form视图。此外,还涉及了action_window、菜单和权限的配置,包括模型权限、角色设置以及规则定义。最后提到了软件内模型权限的设置方法。
摘要由CSDN通过智能技术生成

第二章基础模块

创建新模块 及其模块介绍

在前面说到,会在项目中创建myaddons来存放我们自己的模块,且在odoo.conf文件内有介绍,odoo自带有海量模块,使用的文件在addons和odoo/addons内,由此总结:odoo内有三部分,odoo自带模块,我们的模块,还有一个就是odoo的第三方商店内的模块,此模块可自行选择购买。

创建第一个模块

在odoo-bin同级文件下执行命令:

python odoo-bin scaffold test1 myaddons

或是在了解模块目录的前提下自行创建文件夹和文件

模块介绍

如图:
在这里插入图片描述
以odoo自带模块为例:
Odoo 自带模块,包括常用模块和额外的模块,由 Odoo 公司提供支持,并默认复制到了安装文件夹下的“addons”中。
建议新建数据库后首先安装“会计”模块,我们以安装“会计”应用模块为例。
在“应用”页面的搜索栏中输入“会计”。
在这里插入图片描述

点击此模块图标可打开这个模块的详细信息窗体。窗体将显示模块的一些有用信息,如最新版本、功能说明等。
“会计和财务”模块窗体
在模块窗体的“技术数据”选项卡中,显示是否包含演示数据、是否已安装、依赖模块的名称及状态等信息。当安装一个模块时,Odoo 会自动选择并安装这个模块的依赖模块。
在这里插入图片描述

文件类型介绍

在这里插入图片描述
1、controllers文件夹为存放接口文件,内为.py文件,可为对外接口或是对内接口,在使用模块时_init_.py文件需要对接口文件进行引用
2、demo文件夹可用于存放此模块的示例数据,示例数据编写格式为键值对形式,且是xml格式,具体可依照demo.xml文件内的写法
3、models文件夹为模块核心所在,也是最基础所在,用于存放此模块业务需求的模型(对应的是postgresql内的表),具体写法可依照系统给出的样例,也可继续阅读下面的章节。
并且在models中也有_init_.py文件,同理写需要对此文件夹内的.py文件进行引用
4、security文件夹用于存放配置模型权限文件,为.csv文件,此文件需要在_manifest_.py文件中引用,在加载模块时必须引用;此文件夹还存放模块角色配置文件,为.xml文件,具体格式继续阅读下面的章节
5、views文件夹用于存放模型视图文件,为.xml文件,具体格式继续阅读下面的章节
6、模块根目录的_init_.py文件,为整体模块对py文件的引入加载和使用
7、manifest.py文件为模块配置文件,格式为键值对形式,对模块名、描述、版本和文件引用的一系列设置

新建模型的讲解

进入models文件夹,打开系统models.py文件
首先引入odoo自带模块(依赖):

from odoo import models, fields, api

建立一个类class,此为面向对象写法,类名为test1,括号内为模型的类型为常规模型:

class test1(models.Model):

设置模型名称:

	_name = 'test1.test1'	

设置模型字段:Char、Integer、Float、Text、Date、Many2one(多对一)、One2many(一对多)、Many2many(多对多)、Selection(下拉选择)为常用字段类型

	name = fields.Char()
	value = fields.Integer()
	value2 = fields.Float(compute="_value_pc", store=True)
	description = fields.Text()
	test1 = fields.Date(string='创建时间', readonly=False, )
	test2 = fields.Many2one('hr.employee', string='申请人', readonly=True, )
	test3 = fields.Many2many('hr.employee', 'oa_oa_approver_hr_employee_rel', string='当前审批人', required=True)
	state = fields.Selection([
	    ('nosubmit', '草稿'),
	    ('noapprove', '待审批'),
	    ('approving', '审批中'),
	    ('ok', '完成'), ('goback', '被驳回'), ('editing', '编辑中'), ('termination', '终止')], string='状态')
	test4 = fields.One2many('oa.flow.line.content', 'line_lvcid', string='流程行')

就此一个模型创建完成

创建新tree视图

<record model="ir.ui.view" id="test1.list">
  <field name="name">test1 list</field>
  <field name="model">test1.test1</field>
  <field name="arch" type="xml">
    <tree>
      <field name="name"/>
      <field name="value"/>
      <field name="value2"/>
    </tree>
  </field>
</record>

标签“record、field”同上,
test1.test1
设置视图用到的模型
在内添加tree视图,tree标签内添加模型字段名称即可
整体tree视图id自定,尽量不重复

创建新form视图

如form(表单视图)不创建,系统会使用默认的form排版

<record id="test1.form" model="ir.ui.view">
    <field name='name'>test1 form</field>
    <field name='model'>test1.test1</field>
    <field name='arch' type='xml'>
        <form string='批量代批'>
            <sheet>
                <group>
                    <group>
                        <field name="substitution_user"/>
                    </group>
                </group>
            </sheet>
            <footer>
                
            </footer>
        </form>
    </field>
</record>

标签同上,tree切换成form,表单内有表头、表身、底部区分,表头一般为顶部按钮和状态组件,表身为表单内容,底部一般使用较少。表身内可使用group标签嵌套,为列、行嵌套,可根据具体需求调整。

创建新视图窗口—action_window

<record model="ir.actions.act_window" id="test1.action_window">
  <field name="name">test1 window</field>
  <field name="res_model">test1.test1</field>
  <field name="view_mode">tree,form</field>
</record>

标签“record、field”,model(将此视图窗口记录存入ir.actions.act_window模型内),id为自定义,field标签意为存入一系列的键值对,键为name,值为test1 window,同理,res_model(此条记录用到的模型),值为test1.test1(tip:此模型为models.py文件内创建的test1.test1),view_mode(视图模型),值为tree,form(列表视图和表单视图)

Tip视图模型:tree,form,kanban,graph,calendar,pivot,activity

创建新菜单

菜单文件存在于视图(views)文件夹,打开系统views.xml,可参照自带内容进行学习
在odoo内模块的进入也属于菜单(模块的顶级菜单):

<menuitem id="menu_root"
          name="Test1"
          web_icon="test1,static/description/test1.png"
          active="True"
          sequence="26" groups="flowmanager.group_flowmanager_user"/>

标签为“menuitem”,配置菜单id,名称name,顶级菜单显示的图片web_icon,也是首页模块的图片,顶级菜单启用active:True,在模块安装界面此模块的排列顺序sequence,配置菜单访问权限groups。

模块内一级菜单:

<menuitem name="Menu 1" id="test1.menu_1" parent="test1.menu_root"/>
<menuitem name="Menu 2" id="test1.menu_2" parent="test1.menu_root"/>

同理,标签,name,id同上,增加parent父级菜单,值为父级菜单id。
同理,二级菜单也是如此,主要是配置父级菜单和在菜单数量多的情况下设置菜单的顺序

有视图的菜单:
以上菜单除顶级菜单有进入模块的动作外,另外两个一级菜单是没有动作的,也就是说点击后不会产生界面变化

<menuitem name="List" id="test1.menu_1_list" parent="test1.menu_1"
          action="test1.action_window"/>

菜单增加action,决定菜单点击跳转的视图窗口,值为视图窗口的id。

有动作的菜单:

<menuitem name="Server to list" id="test1" parent="test1.menu_2"
          action="test1.action_server"/>

将action的值变为服务动作的id后,此菜单即位动作按钮。

权限的设置

1、对模型的权限设置:模型创建完成,必定要为角色设置访问权限,security文件夹为存放模型访问权限配置文件。若自己的模块有自定义角色,可先创建自定义角色,在为此角色配置访问模型的权限,既可以文件配置,当然也可以在软件上设置

模块角色添加:

<record model="ir.module.category" id="flowmanager">
    <field name="name">流程管理</field>
</record>
<!--@name:用户组名,这个或以翻译的-->
<!--@comment:用户组的注释-->
<!--@category_id 用户组所属的模块名-->
<!--@implied_ids 基于哪个用户组,这个层级关系 <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>是最基础的-->
<!--用户名,最初是基于这个,后面一层一层递增,像上面 base.group_hr_user 定义时就是基于最基础-->
<!--@users 预设用户属于这个用户组-->
<record model="res.groups" id="group_flowmanager_user">
    <field name="name">用户</field>
    <field name="category_id" ref="flowmanager"/>
</record>
<record model="res.groups" id="group_flowmanager_manager">
    <field name="name">管理员</field>
    <field name="implied_ids" eval="[(4, ref('flowmanager.group_flowmanager_user'))]"/>
    <field name="category_id" ref="flowmanager"/>
</record>
<record model="res.groups" id="group_flowmanager_js">
    <field name="name">技术</field>
    <field name="implied_ids" eval="[(4, ref('flowmanager.group_flowmanager_user'))]"/>
    <field name="category_id" ref="flowmanager"/>
</record>

菜单权限:

<menuitem id="menu_root"
          name="OA管理"
          web_icon="flowmanager,static/description/oa.png"
          active="True"
          sequence="26" groups="flowmanager.group_flowmanager_user"/>

groups 可添加多个角色,同理视图、按钮、字段都可以以此方法进行设置
模型的增删改查权限:

access_oa_entrust_manager,oa.entrust.manager,model_oa_entrust,group_flowmanager_manager,1,1,1,1
access_oa_entrust_user,oa.entrust.user,model_oa_entrust,group_flowmanager_user,1,1,1,1
access_oa_entrust_rz,oa.entrust.rz,model_oa_entrust,group_flowmanager_js,1,1,1,1

以逗号分隔,第一段:这条数据的id,一般以access打头,后接模型(将“.”换成“”)再接角色名称;第二段:这条数据的名称,模型+角色名称;第三段:模型在ir_model表中的表现形式,odoo内部的转换形式为model+模型(将“.”换成“_”);第四、五六、七段:读,写,增,删权限
模型筛选的权限:

<!--@ name 规则名称-->
<!--@ model_id 依赖的模块-->
<!--@ global 是否是全局-->
<!--@ domain_force 过滤条件-->
<!--@ groups 属于哪个组-->
<record model="ir.rule" id="rule_oa">
    <field name="name">流程单</field>
    <field name="model_id" ref="model_oa"/>
    <field name="global" eval="True"/>
    <field name="domain_force">
        [('message_partner_ids.user_ids.id','parent_of',user.id)]
    </field>
    <field name="groups" eval="[(4,ref('group_flowmanager_user'))]"/>
</record>

同理增加groups键值对即可,后面的值一般以odoo写法添加

2、对模型的权限设置-软件设置:模型的增删改查皆是可控制的
打开开发者模式,进入设置模块,选择“用户&公司”菜单下群组,此处可设置模块角色对模型的一系列设置如:菜单权限、模型对应的视图、模型的增删改查权限、模型的筛选规则权限、或是还可以设置当前模块角色继承其他模块角色
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值