第二章基础模块

创建新模块 及其模块介绍

在前面说到,会在项目中创建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、对模型的权限设置-软件设置:模型的增删改查皆是可控制的
打开开发者模式,进入设置模块,选择“用户&公司”菜单下群组,此处可设置模块角色对模型的一系列设置如:菜单权限、模型对应的视图、模型的增删改查权限、模型的筛选规则权限、或是还可以设置当前模块角色继承其他模块角色


odoo12—开发手册>>P02相关推荐

  1. android 设置setmultichoiceitems设置初始化勾选_阿里巴巴Java开发手册建议创建HashMap时设置初始化容量,但是多少合适呢?...

    集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 关于HashMap,很多人都对他有一些基本的了解,比如他和hashtab ...

  2. java string 占位符_驳《阿里「Java开发手册」中的1个bug》?

    前两天写了一篇关于<阿里Java开发手册中的 1 个bug>的文章,评论区有点炸锅了,基本分为两派,支持老王的和质疑老王的. 首先来说,无论是那一方,我都真诚的感谢你们.特别是「二师兄」, ...

  3. 《HTML5开发手册》——2.4 初学者“菜谱”:使用address元素提供通信信息

    本节书摘来自异步社区<HTML5开发手册>一书中的第2章,第2.4节,作者: [美]Chuck Hudson , [英]Tom Leadbetter 更多章节内容可以访问云栖社区" ...

  4. 关于接口使用抛异常还是返回错误码,下列哪些说法符合《阿里巴巴Java开发手册》

    关于接口使用抛异常还是返回错误码,下列哪些说法符合<阿里巴巴Java开发手册>:答案在文末 A. 向公司外部提供的http/api接口,推荐使用"错误码"方式返回异常或 ...

  5. 关于数据库中NULL的描述,下列哪些说法符合《阿里巴巴Java开发手册》

    关于数据库中NULL的描述,下列哪些说法符合<阿里巴巴Java开发手册>:答案在文末 A. NULL=NULL的返回结果为true. B. NULL与任何值的比较结果都为NULL. C. ...

  6. 下列哪些说法符合《阿里巴巴Java开发手册》

    下列哪些说法符合<阿里巴巴Java开发手册>:答案在文末 A. 对于"明确停止使用的代码和配置",如方法.变量.类.配置文件.动态配置属性等要坚决从程序中清理出去,避免 ...

  7. 关于并发处理,下列哪些说法符合《阿里巴巴Java开发手册》

    关于并发处理,下列哪些说法符合<阿里巴巴Java开发手册>:答案在文末 A. 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程. B. 同步处理时,能锁部分代码区块的情况下不要锁 ...

  8. 太强了!阿里技术团队重磅开放 《Java 开发手册》(附下载地址)!

    <阿里巴巴 Java 开发手册>的愿景是码出高效,码出质量.它结合作者的开发经验和架构历程,提炼阿里巴巴集团技术团队的集体编程经验和软件设计智慧,浓缩成为立体的编程规范和最佳实践. 从严格 ...

  9. 《iOS 6高级开发手册(第4版)》——1.11节秘诀:获取和使用设备姿势

    本节书摘来自异步社区<iOS 6高级开发手册(第4版)>一书中的第1章,第1.11节秘诀:获取和使用设备姿势,作者 [美]Erica Sadun,更多章节内容可以访问云栖社区"异 ...

最新文章

  1. html 查询表单,如何让我的HTML表单查询适用于所有表单元素?
  2. 深度学习:让电脑像人一样看世界
  3. HighNewTech:重磅!来自深度学习的三位大牛Yoshua、Hinton、LeCun荣获2018年图灵奖
  4. 【技巧总结】Penetration Test Engineer[2]-Information gathering
  5. 春天重试,因为冬天来了
  6. python 编辑距离_最小编辑距离python
  7. chrome浏览器导出书签 如何导入收藏夹
  8. Android ViewPager 重复数据问题的解决方法
  9. [tensorflow]tensorflow2.1.0使用内置方法进行培训和评估
  10. linux下通过phpize为php在不重新编译php情况下安装模块memcache
  11. ARMam3354linux系统开发,ARM板移植Linux系统启动(四)配置Kernel
  12. shell脚本大全-个人收藏
  13. 如何将虚拟机上的文件复制到主机上
  14. Android 杂记 - 存货盘点用的客户端
  15. 一个程序员血淋淋的教训,心态没了,世界坍塌了
  16. 桩基施工市场现状研究分析报告-
  17. 目录没有.kaggle文件夹的解决方法
  18. AOSP ~ Logcat Chatty 行过期
  19. mysql在手游中的作用_手游业务MySQL数据库虚拟化漫谈 | By 肖力
  20. abaqus对实体单元进行复合材料每层厚度定义

热门文章

  1. EOS原力孤矢:站在EOS肩膀上,看齐BTC
  2. VirtualBox配置时出现:硬件加速配置页中已启用硬件虚拟化,但主机并不支持。需要禁用硬件虚拟化才能启动虚拟机。
  3. Wise-IoU: Bounding Box Regression Loss with Dynamic Focusing Mechanism
  4. sql语句批量修改字段
  5. IView-UI组件篇之主题,语言,导航,路由
  6. 中文文本分类-朴素贝叶斯
  7. yolox用demo检测时报错TypeError: ‘module‘ object is not subscriptable
  8. Azkaban的安装教程
  9. Wget用法,以及如何覆盖下载
  10. jredis和letucce_关于redis提供给java的 jredis和jedis的使用