使用Odoo进行数字化开发的必要性和作用在于提高企业效率、整合管理、数据驱动决策、优化客户关系,并实现灵活定制。通过自动化和优化业务流程,企业可以提高工作效率。集成管理使得不同部门协作更加高效,避免信息孤岛。通过分析报表和数据可视化,企业可以做出更准确的决策、优化经营策略。强大的CRM功能帮助企业建立良好的客户关系,提升客户满意度。而开源的特性使得企业可以根据需求进行灵活定制,获得适应性强的数字化解决方案。这些作用能够提升企业竞争力,适应数字化时代的挑战。
文章目录
以下只是一个具体应用的所有流程,具体用到的技术会在后面的章节中详细讲解,这一章中,你需要明白一个模块从0到1的所有过程,以及每个过程的具体作用。
1、开启开发者模式
开发者模式是一个特殊的模式,它提供了更多的功能和选项,以便开发人员可以更方便地进行自定义和扩展。开发者模式允许您访问Odoo的技术设置和工具。
1.1 开发者模式下可以进行哪些操作
-
调试:您可以在开发者模式下查看和分析错误消息、日志和异常情况,以帮助诊断和解决问题。
-
访问技术设置:您可以访问一些高级配置选项,例如启用调试模式、启用开发者模式的访问权限以及其他技术设置。
-
自定义视图:您可以通过开发者模式修改现有视图或创建新的视图,以满足特定需求。这包括更改字段显示、添加按钮和标签等。
-
创建和修改模型:您可以使用开发者模式创建和修改数据库模型(也称为对象)。这允许您定义新的数据结构、添加字段和关系等。
-
编写和调试代码:您可以使用开发者模式编写和调试Python代码。这包括创建和修改控制器、过滤器、触发器和其他自定义模块。
1.2 如何启用开发者模式
普通方式开启:
-
登录到Odoo系统。
-
在左上角的讨论旁边,点击图标并选择"设置"。
-
在窗口中,下拉找到Developer Tools。
-
选择激活开发者模式,看到右上角有一个小虫子的标志,确认开发者模式已被激活。
-
现在,您可以通过转到设置菜单并选择"技术"来访问开发者模式下的功能和选项。
快速开启:
在地址中加入参数debug=1即可开启开发者模式
2、服务启动和命令行启动
2.1 服务启动
- 服务启动是将Odoo作为一个后台服务在操作系统级别运行的方式。这意味着Odoo会以系统服务的形式在后台持续运行,并可以在系统启动时自动启动。
- 优点:稳定性高,系统启动时自动启动,不需要手动干预。
- 缺点:配置和管理略显复杂,可能需要系统管理员权限。
该种方式的配置文件目录:/etc/odoo.conf
2.2 命令行启动
- 命令行启动是通过在终端中手动输入启动命令来启动Odoo服务器的方式。这种方式更加灵活,适用于开发和调试过程中的临时启动。
- 优点:灵活,方便进行调试和临时启动,对个别用户而言的可控性强。
- 缺点:需要手动干预,不会在系统启动时自动启动。
该种方式的配置文件目录:/path/to/odoo.conf
3、创建插件模块并且在配置文件中加入模块路径
(1) 插件模块也就是包含实现odoo具体功能的文件。并且必须含有一个声明或描述文件__manifest__.py
(2)自定义插件模块就放在自己的目录中,独立于Odoo代码之外。
如果你的odoo环境在一个目录下,比如 root/work16/odoo/
你的应用路径应该在 root/work16/下创建一个目录
我的目录为 root/work16/book
需要在文件加入一条
addons_path = ~/work16/library
如果你是服务启动:
那么你应该在/etc/odoo.conf文件中添加目录路径root/work16/book
如果你是命令行启动:
那么你应该在/root/work16/odoo.conf文件中添加目录路径root/work16/book
4、使用scaffold命令快速创建模块骨架
步骤:
-
打开终端或命令提示符,并导航到你希望创建模块的目录。
-
运行以下命令来创建模块的骨架
odoo scaffold <module_name> <path_to_target_dir>
<module_name>
:替换为你想要创建的模块的名称,例如"my_module"。<path_to_target_dir>
:替换为你希望在其中创建模块的目标目录的路径。
例如上面说的 root/work16/library
odoo scaffold library_app ~/work16/library
5、模块目录结构等准备工作
5.1 目录结构
5.2 目录说明
- 有效的模块必须包含一个__manifest__.py描述文件和一个可导入模块的__init_.py 文件。
- scaffold命令所生成的顶层__init__.py 文件初始内容
# -*- coding: utf-8 -*-
from . import controllers
from . import models
-
scaffold命令所生成的顶层__manifest__.py 文件初始内容
# -*- coding: utf-8 -*-
{
'name':"Schoo Store",
'summary': "in school store",
'author': "Li Zewen",
'license':'AGPL-3',
'website': "",
'version': '16.0.1.0.0',
'depends': ['base'],
'data': [ ],
}
5.3 __manifest__.py 文件说明
5.3.1 包含一个python字典,其中常用属性如下
- name:模块标题
- summary:对模块进行单行综述 (简短的描述,显示在模型的下方)
- description:对模块的详细描述(需要点击进入到模块中才能看到)
- author:版权作者名字
- license:授权模块进行分发的证书
- website:了解模块更多信息的URL
- version:模块的版本号
- depends:插件模块的依赖列表,安装模块时会触发对这些模块的安装
- application:一个布尔标记,代表模块是否在应用列表中以应用显示
- installable:表示模块是否可安装
- auto_install:胶水模块,胶水模块的安装在安装所有依赖时进行一次触发
5.3.2 设置模块分类
Project应用属于Service/Project
模块进行分类表示相关的功能区,这些分类用于插件模块的分组,以及安全组,分类可进行分组这里表示该模块输入服务类
在 __manifest__.py中加入一条代码:
"category":"Services/Library"
分配给模块分类的XMLID由base.module_category_加上分类名自动生成。
例如,Services/Library所生成的XMLID为base.module_category_services_library。
5.3.3 为模块选取证书
添加默认证书即可
在 __manifest__.py中加入一条代码:
'license':'AGPL-3'
5.3.4 为模块添加描述信息
使用 description 为模块添加更详细的描述信息,如果是多行语句请使用""" """
'description': "Long description of module's purpose"
5.3.5 为模块添加图标
需要在 static/description/icon.png 文件进行使用。icon.png就是你的图标文件
如果没有这些文件请自行添加即可
6、安装与更新模块
6.1 安装模块
点击应用,点击左侧服务,选择我们创建的模块 library_app,点击激活即可
6.2 更新模块
有关于模型的操作,比如新增了字段等
需要重启服务并且升级模块
只是设计简单视图更改,或者普通的代码
只需要刷新页面即可
升级模块也是来到应用下的服务里,找到相应的模块
先点击上方的更新应用列表,然后再点击升级按钮
7、关于访问控制权限
在Odoo中,配置访问控制权限是非常重要的,它可以帮助你管理用户对系统中不同功能和数据的访问权限。让我详细解释一下在Odoo中如何配置访问控制权限:
-
用户与用户组管理:
- 首先,你需要在Odoo系统中创建和管理用户以及用户组。用户组可以用来集中管理一组用户的权限。你可以根据用户的职责、部门或其他标准,将用户分配到不同的用户组中。
-
定义权限模型:
- 在Odoo中,每个模块都定义了自己的权限模型,包括对象(Object)和字段(Field)。对象代表数据库中的数据表,字段代表数据表中的列。
- 通过定义权限模型,你可以明确地指定哪些用户组或用户可以访问、编辑或删除特定对象或字段的数据。
-
配置用户组权限:
- 一旦定义了权限模型,你可以通过配置用户组的权限来控制他们对系统功能和数据的访问权限。在Odoo的后台管理界面中,通常有专门的权限配置页面来进行这项设置。
- 你可以为每个用户组分配特定的权限,例如读取(read)、写入(write)、创建(create)和删除(delete)等。此外,还可以定义其他特定的权限,如创建仪表板、导出数据等。
-
细粒度的权限控制:
- Odoo还支持细粒度的权限控制,你可以针对具体的记录进行权限配置。例如,你可以指定只有特定用户组或用户才能访问或编辑某条销售订单记录。
-
自定义权限规则:
- 如果系统默认的权限规则无法满足你的需求,你还可以创建自定义的权限规则。通过使用Odoo的安全规则语言(Record Rules),你可以编写灵活的条件逻辑来定义特定记录的访问权限。
8、新应用的两个必要步骤
8.1 给应用添加顶级菜单项
在views下创建library_menu.xml文件添加如下代码
<odoo>
<menuitem id="menu_school" name="School" />
</odoo>
涉及到的参数解释:
menuitem
是一个元素,用于定义一个菜单项。id="menu_library"
是菜单项的唯一标识符。您可以根据需要设置一个唯一的ID值,以便在其他地方引用这个菜单项。name="Library"
是菜单项的名称,即显示在菜单中的文本。
需要在 __manifest__.py中的data字段中加入一段代码,将我们的菜单文件引入
'data': [
'views/school_menu.xml',
]
8.2 创建用户权限组
用户通过所处不同组来获取不同的权限
通常情况下,odoo模块有两个组
- 普通用户组:具有一般权限的用户组,通常用于对一般用户进行权限管理
- 管理员组:用于管理系统中的配置和用户权限
具体实现步骤
- 打开Odoo模块的
security
文件夹,并创建一个新的XML文件,例如my_module_security.xml
-
在新的XML文件中,使用以下语法定义一个新的权限
<odoo>
<record id="my_module.group_foo" model="res.groups">
<field name="name">Group Foo</field>
</record>
</odoo>
其中:
my_module.group_foo
是权限组的唯一标识符。请确保它是唯一的,并且以模块名称作为前缀。
res.groups
是Odoo模型的名称,代表权限组。
<field name="name">Group Foo</field>
定义了权限组的名称。您可以根据需要更改其名称
- 在该记录中添加其他字段以定义权限组的详细信息。例如,您可以添加
users
字段来指定该权限组的默认用户。
<odoo>
<record id="my_module.group_foo" model="res.groups">
<field name="name">Group Foo</field>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
</odoo>
- 在权限组中添加模块分类,继承内部用户权限(普通用户组)
<odoo>
<record id="my_module.group_foo" model="res.groups">
<field name="name">Group Foo</field>
<field name='category_id' ref='base.module_category_services_library' />
<field name='implied_ids' eval="[(4,ref('base.group_user'))]" />
</record>
</odoo>
参数解释:
name:组名
category_id:关联应用,使用ref属性来通过XML ID连接模板的分类
分配给模块分类的XML ID由base.module_category_{这里填分类}_{这里填你取的分类名字},分类应用于安全组
imlied_ids:一对多字段,包含一个组列表来涵盖组内用户,通俗来说把一个用户组(base.group_user)添加到当前的用户组中,作为当前用户组的隐含用户组
- 管理员用户组(授予所有权限并且保留其他权限)
<record id='school_group_manager' model='res.groups'>
<field name='name'>Manager</field>
<field name='category_id' ref='base.module_category_services_library' />
<field name='implied_ids' eval="[(4,ref('cec_group_user'))]" />
<field name='users'
eval="[(4,ref('base.user_root')),
(4,ref('base.user_admin'))]" />
</record>
参数解释:
user: 跟上面imlied_ids一样,也是将权限授权给root以及admin
- 在模块的
__manifest__.py
文件中,将新的XML文件添加到data
列表中
{
'name': 'My Module',
'version': '1.0',
'depends': ['base'],
'data': [
'security/my_module_security.xml',
...
],
...
}
9、模型层-新建模型
9.1 引入odoo模型文件
在根目录下的__init__.py文件中添加一行代码将模型文件引入
from . import models
在models/下创建store.py模型文件,并且在其下的__init__.py文件中添加一行代码将模型文件引入
form . import store
9.2 编写模型
模型(Model)是指数据库中的表。它定义了一个特定对象的结构和行为,可以理解为一个数据实体的抽象表示。模型包含了对象的字段、方法、关联关系等信息。
- 模型(Field Name,字段为model):输入模型的名称。视图中必须以x_开头
- 模型说明(Field Label,模型说明):对该模型的说明。
- 字段(Fields):你需要指定每个字段的名称、标签、类型、是否必填等属性。
# 导入了Odoo模块中的fields和models模块,这两个模块包含了定义字段和模型的相关类和方法
from odoo import fields,models
# 定义了一个名为Book的类,并继承自models.Model类。这意味着Book类是一个Odoo模型类
class Book(models.Model):
# 定义了模型的名称,每个模型都有一个唯一的名称用于标识
_name ='school.store'
# 定义了模型的描述,描述通常用于在用户界面中显示模型的友好名称
_description = '学校商店'
# String fields:
# 以下是字段的定义
name = fields.Char('Title',required =True)
store_number = fields.Char('bh')
10、给模型配置访问权限
我们的模型没有权限规则,所以没有人能使用,我们已经为应用添加了权限组,现在需要授权他们访问应用模型
在security/下的ir.model.access.csv中添加权限
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_store_user,StoreUser,model_school_store,school_group_user,1,1,1,0
access_store_manager,StoreManager,model_school_store,school_group_manager,1,1,1,1
关键字说明:
id:XML ID ,需要在模块中唯一
name:描述性标题,可提供信息,推荐使用唯一的名称
model_id:授权模型的外部标识符,模型有ORM自动生成的XML ID
group_id:授权权限组,在xml文件中创建的权限组的名称
perm_....:读写等权限,
同样需要在声明文件中添加该文件
在根目录之下的__manifest__.py的data中加入:
'data': [
'security/ir.model.access.csv',
]
行级权限规则:
定义过滤器来限定权限组可访问的记录
name:独特的标题,最好是唯一
model_id:对应用规则的模型的引用
groups:对应用规则的权限组的引用,groups字段是多对多关联,使用对多字段需要的特定语法
domain_force:用于访问权限的域过滤器
编辑的目录为:security/library_security.xml
记录规则位于<data noupdata="1">元素中
11、后台视图层
用于管理和配置系统的用户界面。它提供了一组预定义的视图类型和组件,以便用户可以创建、修改和管理数据模型、表单、列表、报表等各种功能。
我们在上面的步骤中创建了一个模型,但是我们并没有一个界面用来访问它,访问它首先需要有个菜单
11.1 创建菜单项
11.1.1 添加动作
我们需要先定义一个动作,用来打开访问模型的视图
<record id="action_school_store" model="ir.actions.act_window">
<field name="name">School Store</field>
<field name="res_model">school.store</field>
<field name="view_mode">tree,form</field>
</record>
参数说明:
<record>:用来定义一个客户端窗口动作 (视图)
id:该动作的唯一标识符
model: 定义了该动作所属的模型,即ir.actions.act_window
模型。这个模型用于定义Odoo中的窗口动作。
name:对这个动作的描述,以便在系统中进行标识和区分
res_model:指定了与窗口动作相关联的模型,即school.store
模型
view_mode:指定了窗口动作的视图模式,即以树形视图(tree)和表单视图(form)
11.1.2 添加菜单
上面我们定义好了一个动作,而菜单通常与一个动作相关联,当用户点击菜单时,与该菜单关联的动作将被执行。
<menuitem id="menu_school_store"
name="Store"
parent ="menu_school"
action="action_school_store" />
参数说明:
<menuitem>:定义动作
id:该菜单的唯一标识符
name:菜单名字,在你的界面会显示
parent:顶级菜单名字,我们这里父类是应用添加顶级菜单项
action:指定点击菜单后执行的动作id
11.2 创建视图
视图(View)是用户与数据交互的主要界面。它们用于呈现和编辑数据,并提供对数据的各种操作,如创建、修改、删除和搜索等。
我们这里采用列表视图 + 表单视图用来进行对数据的展示
列表视图是你直接点击菜单就能看到的视图
<record model="ir.ui.view" id="view_tree_store">
<field name="name">Store List</field>
<field name="model">school.store</field>
<field name="arch" type="xml">
<tree>
<field name="name" />
</tree>
</field>
</record>
参数说明:
<field name>标签:用来写展示字段的名字
<field name="name">Store List</field>中的name:该视图的描述
<field name="model">school.store</field>中的model:数据来源的模型
<field name="arch" type="xml">中的arch:将arch设置为xml
<tree>:用于定义树视图(Tree View)的XML标签
效果为:
创建表单视图
表格视图以表单形式显示记录,并允许用户查看和编辑单个记录
<record model="ir.ui.view" id="view_form_store">
<field name="name">Store Form</field>
<field name="model">school.store</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name='name' />
</group>
</sheet>
</form>
</field>
</record>
参数说明:
<form>:用于定义表单视图
<sheet>:身体部位
<group>:将字段分组显示,一组也就是一列
效果为:
12、业务逻辑层
处理业务规则、流程和数据操作的部分。这一层包括了模型(Model)、业务逻辑方法(Business Logic Methods)以及工作流程(Workflows),它们共同构成了处理数据和业务流程的核心。
-
模型(Model):
- 在Odoo中,模型定义了数据结构和行为,并负责管理数据的创建、读取、更新和删除(CRUD操作)。
- 模型通常与数据库表相对应,每个模型表示一个实体,如产品、客户、销售订单等。
- 模型还定义了字段、约束、计算字段和关联关系等,以及与数据相关的方法和触发器。
-
业务逻辑方法(Business Logic Methods):
- 业务逻辑方法是模型中用于执行特定业务逻辑的方法,例如计算字段值、执行业务规则、进行数据验证等。
- 这些方法可以在数据保存、修改或其他特定事件发生时被触发,从而确保业务规则得到执行。
-
工作流程(Workflows):
- 工作流程定义了数据在系统中的流转路径,包括状态转换、触发条件和动作。
- 通过工作流程,可以定义和管理业务流程,例如审批流程、订单处理流程等。
13、网站用户的UI界面
具体步骤为:
- 添加端点控制器
- 添加QWeb模板
- 通过地址访问界面
以上内容只是一个简单应用的具体流程(精简版),每一章节的内容将在后面的博文中具体解释,以及在后续章节中有更加高阶的用法。后面的也出一些在实际开发中经常用到的一些技术和常见的错误及解决方案。