莫方教程网

专业程序员编程教程与实战案例分享

Odoo第一个应用:HelloWorld

研究odoo系统有一段时间,今天就撸个Odoo版的Helloworld,试试手。这个项目的目的是了解Odoo开发的主要流程,尽可能不涉及业务的内容,快速实现一个简单的应用,对Odoo的应用开发有一个直观的、全局视角的了解,同时结合前台界面操作,熟悉Odoo的运行和操作流程,因此,不必在意细节的地方。

为了便于和后面的案例做好衔接,统一做如下约定,应用的名称以app开头+两位数字+应用简称,比如今天的Helloworld应用的名称定义为:app01helloworld。

启动前期搭建的Python3.8.9版本的虚拟环境:

workon envpy389

进入odoo安装的目录:

 cd yourpath\odoo

执行odoo脚手架命令,建立helloworld应用的框架:

python odoo-bin scaffold app01helloworld ./myaddons

看一下app01hellowrld应用的文件组织结构:

(envpy389) d:\Apps\odoo\myaddons>tree /F app01helloworld | find /v /i "~" | find /v /i "pyc"

其中,tree命令是windows系统自带的显示文件目录结构的命令,增加了两个管道符(|),用于过滤一些临时文件(.pyc是python的预编译文件,~结尾的文件是编辑器产生的临时文件)。关于windows系统下的tree、管道(|)和find命令的详细用法可以网上查找。

运行后该命令后,显示如下的信息:

……..
D:\APPS\ODOO\MYADDONS\APP01HELLOWORLD
│ __init__.py
│ __manifest__.py
│
├─controllers
│ │ controllers.py
│ │ __init__.py
│ │
│
├─demo
│ demo.xml
│
├─models
│ │ models.py
│ │ __init__.py
│ │
│
├─security
│ ir.model.access.csv
│
├─views
│ templates.xml
│ views.xml

上面的文件中,比较重要的几个目录和文件介绍如下。

(1)__manifest__.py

__manifest__.py文件是关于应用app01helloworld的元数据文件。这个文件定义了一个字典数据结构,其作用相当于一个线索,把应用app01hewworld需要用到的文件都串联在一起,在激活应用和后续的维护、升级过程中,用到的文件、数据和信息都是从这里找的。

编辑__manifest__.py文件,删除整行的注释,将除第一行之外的#都去掉,修改每个键对相应的值(关于__manifest__.py文件的每个键值的说明可参考合集中的文章),值的内容尽可能精炼一些。修改后的结果如下示例。

# -*- coding: utf-8 -*-
{
'name': "app01helloworld",
'summary': """Hello World""",
'description': """this is my first odoo app""",
'author': "Andy",
'website': ".....",
'category': 'Uncategorized',
'version': '16.0.1',
'depends': ['base'],
'data': [
'security/ir.model.access.csv',
'views/views.xml',
'views/templates.xml',
],
# only loaded in demonstration mode
'demo': [
'demo/demo.xml',
],
}

(2)model目录

model目录是存储应用app01helloworld定义的模型。通过脚手架构建的应用框架,已经帮助开发者生成了一个范例。编辑model目录下的models.py文件,将#符号删除,修改后的文件内容如下。

# -*- coding: utf-8 -*-
from odoo import models, fields, api
class app01helloworld(models.Model):
		_name = 'app01helloworld.app01helloworld'
		_description = 'app01helloworld.app01helloworld'

    name = fields.Char()
    value = fields.Integer()
    value2 = fields.Float(compute="_value_pc", store=True)
    description = fields.Text()
    
		@api.depends('value')
    def _value_pc(self):
        for record in self:
       			 record.value2 = float(record.value) / 100

说明:

  • _name属性对应的值默认是"应用名.模型名(这里就是类名)”,odoo系统根据该值,生成对应为应用名_模型名的数据库表名。这个值很关键,后续关于权限、模型引用等都需要和改值对应,确保一致、准确无误。
  • 默认生成的模型字段name、value、value2和description,暂时不用修改。后续涉及到具体的业务,可以再来维护。

(3)views目录

views目录存放的是与应用相关的视图、菜单、行为动作的定义。参照下面的示例,编辑该文件。主要是将注释符删除。为了便于理解,新添加了一些中文的注释。

view.xml文件内容

<odoo>
<data>
<!-- explicit list view definition 定义列表视图 -->
<record model="ir.ui.view" id="app01helloworld.list">
<field name="name">app01helloworld list</field>
<field name="model">app01helloworld.app01helloworld</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="value"/>
<field name="value2"/>
</tree>
</field>
</record>
<!-- actions opening views on models 定义在模型上打开视图动作-->
<record model="ir.actions.act_window" id="app01helloworld.action_window">
<field name="name">app01helloworld window</field>
<field name="res_model">app01helloworld.app01helloworld</field>
<field name="view_mode">tree,form</field>
</record>
<!-- server action to the one above 定义服务器端的对应上面视图的动作-->
<record model="ir.actions.server" id="app01helloworld.action_server">
<field name="name">app01helloworld server</field>
<field name="model_id" ref="model_app01helloworld_app01helloworld"/>
<field name="state">code</field>
<field name="code">
action = {
"type": "ir.actions.act_window",
"view_mode": "tree,form",
"res_model": model._name,
}
</field>
</record>
<!-- Top menu item 定义一个顶级菜单,是应用的总入口-->
<menuitem name="helloworld应用" id="app01helloworld.menu_root"/>
<!-- menu categories 定义两个菜单,名称分别为helloworld应用1和helloworld应用2-->
<menuitem name="helloworld应用1"
id="app01helloworld.menu_1"
parent="app01helloworld.menu_root"/>
<menuitem name="helloworld应用2"
id="app01helloworld.menu_2"
parent="app01helloworld.menu_root"/>
<!-- actions 定义点击菜单项的操作动作-->
<menuitem name="List"
id="app01helloworld.menu_1_list"
parent="app01helloworld.menu_1"
action="app01helloworld.action_window"/>
<menuitem name="Server to list"
id="app01helloworld"
parent="app01helloworld.menu_2"
action="app01helloworld.action_server"/>
</data>
</odoo>
template.xml文件内容(基本上把注释删除即可)
<odoo>
<data>
<template id="listing">
<ul>
<li t-foreach="objects" t-as="object">
<a t-attf-href="#{ root }/objects/#{ object.id }">
<t t-esc="object.display_name"/>
</a>
</li>
</ul>
</template>
<template id="object">
<h1><t t-esc="object.display_name"/></h1>
<dl>
<t t-foreach="object._fields" t-as="field">
<dt><t t-esc="field"/></dt>
<dd><t t-esc="object[field]"/></dd>
</t>
</dl>
</template>
</data>
</odoo>

(4)security

security目录存放的是跟应用相关的权限、安全规则等的设置。这部分内容跟前端能看到什么菜单、能做什么操作有很大的关系,如果设置不正确,技术能够激活应用,可能在前端也看不到菜单项,不知道如何操作。当前就以熊的默认权限设置,后续在根据业务的需求,细分权限。

ir.model.access.csv文件内容参考如下(基本不用修改)

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_app01helloworld_app01helloworld,app01helloworld.app01helloworld,model_app01helloworld_app01helloworld,base.group_user,1,1,1,1

注意,上面的默认设置,将模型
app01helloworld.app01helloworld的操作权限(增删改查)都赋予base.group

_user用户组,因此,前台的操作员需要定义在改组下,否则应用安装好后,前台的操作人员是找到到应用的菜单入口。

以上相关文件修改好后,启动odoo server ,注意要将应用的目录myaddons,设置在启动配置的文件中。在开发者模式下,依次点击“应用”--“更新应用列表--然后在搜索栏输入”app01“(删除条件”应用“),

出现下图(首次进入该界面,“已安装”文字显示的是“激活”,点击可激活该应用),后续修改了相关文件内容,,可以点击…符,出现“升级”即可更新应用。

检查前后台的的信息,如果没有错误提示信息,从前台web界面就可以看到应用的入口app01helloworld,依次点击,即可看到相应的操作界面。

到此,第一个Odoo已经完成,你呢?加油!跟上,明天继续~~~~~

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言

    滇ICP备2024046894号-1