Odoo 使用客户机/服务器体系结构,其中客户端的 Web 浏览器通过 RPC 的方式访问 odoo 服务器。业务逻辑和扩展运行在服务器端,当然也支持将一些客户端特性(例如,新的数据表示诸如交互式地图)添加到客户端。为了启动服务器,简单在命令行调用odoo.py,在某些情况下需要加入文件全路径 。服务器思可以通过在终端按两次 ctrl-c 或者kill掉相应的服务器进程终止。
服务器和客户端扩展被打包为在数据库中的任选加载模块。Odoo模块可以添加全新的业务逻辑到Odoo系统,或者改变和扩展现有的业务逻辑:一个模块可以创建你的国家的会计规则到Odoo的通用会计系统,而下一个模块可能实现了一个车队的实时可视化管理。在Odoo一切都以模块开头和结尾。
每个模块内都是模块目录中的一个目录。模块目录使用--addons路径选项指定。技巧:大多数命令行选项也可以使用配置文件设置 一个 Odoo 模块是由它的 Manifest 文件声明。这是强制性的,它包含了一个 Python 字典,声明模块的各种元数据:该模块的名称和说明,他正常工作所依赖的 Odoo 模块列表,引用的数据文件,...Manifest 文件的一般结构为:
{ 'name': "MyModule", 'version': '1.0', 'depends': ['base'], 'author': "Author Name", 'category': 'Category', 'description': """ Description text """, # data files always loaded at installation 'data': [ 'mymodule_view.xml', ], # data files containing optionally loaded demonstration data 'demo': [ 'demo_data.xml', ],}
模块也是一个名为 __init__.py 的 python package, 它用 import 引入这个模块的各种 python 文件。举个例子,如果这个模块只有一个文件 mymodule.py, __init_.py 文件内容可能只有这一句:
import mymodule
幸运的是,有一个机制帮助你创建一个模块。odoo.py 命令有一个子命令 scaffold 用来创建一个空模块:odoo.py scaffold
这个命令为你的模块创建了一个子目录,并且自动的创建了模块的各种文件。很多文件只有注释或者是XML。这些文件的使用会在这个教程中详细解释。作业:创建一个模块
使用上面的命令创建一个空模块 Open Academy, 并且安装到 odoo 中。1)调用命令 odoo.py scaffold openacademy addons2)调整你模块的 manifest 文件。3)不要动其它文件。Use the command line above to create an empty module Open Academy, and install it in Odoo.
openacademy/__init__.py
openacademy/controllers.py
Oopenacademy/demo.xml
penacademy/models.py
from openerp import models, fields, api
openacademy/templates.xml
Odoo的一个关键组成部分是 ORM 层。这层避免了手工编写的大部分SQL,并提供可扩展性和安全性服务[2]。业务对象被声明为扩展模式,它们集成到自动化系统的持久性Python类。模型可以通过在其定义中进行配置设置多个属性。最重要的属性是_name是必需的,它定义了模块在Odoo系统中的名称。这里是一个模块的最小完整定义:from openerp import modelsclass MinimalModel(models.Model): _name = 'test.model'
字段Fields定义了model 可以保存什么、存在哪里。Fields定义成 model 类的属性:
from openerp import models, fieldsclass LessMinimalModel(models.Model): _name = 'test.model2' name = fields.Char()
name = field.Char(required=True)
一些属性可以被所有字段使用,下面是最常见的几个:string (unicode, default: field’s name)字段在UI上的标签 (用户可见).required (bool, default: False)如果为True, 字段不能为空,当创建一个记录时它必须有一个值或者有默认值。help (unicode, default: '')长的形式,在用户界面上提供帮助提示index (bool, default: False)请求 Odoo 在数据库上对那个列创建用户索引。Requests that Odoo create a database index id="simple-fields">
字段可以分为两大类:simple fields 是atomic 值直接存储在模块的表中。和realtional fileds 关联本模块或者其他模块的记录。simple fields a例子是 Boolean, Date, Char等.
Odoo 创建了一些在所有的模块(model)中都有的字段。这些字段由系统管理不能被写入。如果需要的时候可以读取:
默认情况下, Odoo 要求所有的字段的都有一个 name fileds 以便执行各种显示和查询动作。为这些目的使用的字段可以通过设置 rec name 覆盖。
作业 定义一个model定义一个新数据模块Course 在open academy 中.一个课程有名称title和描述。课程必须有名称title。编辑 openacademy/models.py 使它包含一个课程类。
from openerp import models, fields, apiclass Course(models.Model): _name = 'openacademy.course' name = fields.Char(string="Title", required=True) description = fields.Text()
Odoo 很大程度上是一个数据驱动系统。尽管模块的行为通过 python code 进行了个性化,但是模块(module)的部分数据在加载的时候已经被设置。
技巧
一些模块的存在仅仅是为了向 Odoo保存数据。模块的数据通过数据文件声明:带elements 的XML 文件. 每一个element创建或者更新一条数据库记录.
数据文件必须通过 manefest 文件声明以便被夹加载,他们可以定义在'data'列表 (总是加载) or 或者在 'demo' 列表 (只有在演示模式才能被加载。).作业:定义一个演示数据(Define demonstration data)创建一个带几条演示数据填充的 courses 模块,编辑openacademy/demo.xml文件使其包含一些数据.
model="openacademy.course" id="course0"> name="name">Course 0 name="description">Course 0's description 也可以是几行的 model="openacademy.course" id="course1"> name="name">Course 1
model="ir.actions.act_window" id="course_list_action"> name="name">Courses name="res_model">openacademy.course name="view_type">form name="view_mode">tree,form name="help" type="html"> class="oe_view_nocontent_create">Create the first course
parent="main_openacademy_menu"/> action="course_list_action"/>
来源:苏州远鼎官网