ODOO OpenERP 8.0 开发基础教程连载一
转自:http://www.chinamaker.net/html/2014/study_1027/176.html
2014-10-27 14:30:31 phpcms 6505
ODOO OpenERP 8.0 开发基础教程连载一
作者:苏州远鼎信息技术有限公司(转载请保留此信息)

1.启动停止 Odoo server

     Odoo 使用客户机/服务器体系结构,其中客户端的 Web 浏览器通过 RPC 的方式访问 odoo 服务器。

业务逻辑和扩展运行在服务器端,当然也支持将一些客户端特性(例如,新的数据表示诸如交互式地图)添加到客户端。为了启动服务器,简单在命令行调用odoo.py,在某些情况下需要加入文件全路径 。
服务器思可以通过在终端按两次 ctrl-c 或者kill掉相应的服务器进程终止。

2.构建Odoo模块

服务器和客户端扩展被打包为在数据库中的任选加载模块。

Odoo模块可以添加全新的业务逻辑到Odoo系统,或者改变和扩展现有的业务逻辑:一个模块可以创建你的国家的会计规则到Odoo的通用会计系统,而下一个模块可能实现了一个车队的实时可视化管理。

在Odoo一切都以模块开头和结尾。

2.1 一个模块的组成

一个Odoo模块可以包含多个元素:
业务对象(Business Objects)

声明为Python类,这些资源会根据他们的配置被 Odoo 自动的持久化。

数据文件(Data Files)

XML或CSV文件中声明元数据(视图或工作流),配置数据(模块参数),演示数据等。

网络控制器(Web controllers)

处理来自Web浏览器的请求

静态网页数据(Static web data)

使用Web界面或网页的图像,CSS或JavaScript文件

2.2 模块结构
每个模块内都是模块目录中的一个目录。模块目录使用--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 addons
2)调整你模块的 manifest 文件。
3)不要动其它文件。
Use the command line above to create an empty module Open Academy, and install it in Odoo.

Invoke the command odoo.py scaffold openacademy addons.
Adapt the manifest file to your module.
Don’t bother about the other files
以下是生成的文件清单。随后我们详细解释。
openacademy/__openerp__.py
openacademy/__init__.py
openacademy/controllers.py
Oopenacademy/demo.xml
penacademy/models.py
from openerp import models, fields, api
openacademy/security/ir.model.access.csv
openacademy/templates.xml
2.3 对象 - 关系映射(ORM)
Odoo的一个关键组成部分是 ORM 层。这层避免了手工编写的大部分SQL,并提供可扩展性和安全性服务[2]。

业务对象被声明为扩展模式,它们集成到自动化系统的持久性Python类。

模型可以通过在其定义中进行配置设置多个属性。最重要的属性是_name是必需的,它定义了模块在Odoo系统中的名称。
这里是一个模块的最小完整定义:
from openerp import models
class MinimalModel(models.Model):

_name = 'test.model'

2.5 模块的字段(Fields)
字段Fields定义了model 可以保存什么、存在哪里。
Fields定义成 model 类的属性:

from openerp import models, fields

class LessMinimalModel(models.Model):

_name = 'test.model2'
name = fields.Char()

常见属性

象模块一样,字段 fields 也是可以通过把配置属性作为参数进行配置:
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 on the column

简单字段(Simple fields)

字段可以分为两大类:
simple fields 是atomic 值直接存储在模块的表中。
和realtional fileds 关联本模块或者其他模块的记录。
simple fields a例子是 Boolean, Date, Char等.

保留字段(Reserved fields)

Odoo 创建了一些在所有的模块(model)中都有的字段。这些字段由系统管理不能被写入。如果需要的时候可以读取:

id (Id)
the unique identifier for a record in its model
create_date (Datetime)
creation date of the record
create_uid (Many2one)
user who created the record
write_date (Datetime)
last modification date of the record
write_uid (Many2one)
user who last modified the record
特殊字段(Special fields)

默认情况下, Odoo 要求所有的字段的都有一个 name fileds 以便执行各种显示和查询动作。为这些目的使用的字段可以通过设置 rec name 覆盖。

作业 定义一个model
定义一个新数据模块Course 在open academy 中.
一个课程有名称title和描述。课程必须有名称title。
编辑 openacademy/models.py 使它包含一个课程类。

openacademy/models.py
from openerp import models, fields, api

class Course(models.Model):

_name = 'openacademy.course'

name = fields.Char(string="Title", required=True)
description = fields.Text()

数据文件(Data files)
Odoo 很大程度上是一个数据驱动系统。
尽管模块的行为通过 python code 进行了个性化,但是模块(module)的部分数据在加载的时候已经被设置。

技巧

一些模块的存在仅仅是为了向 Odoo保存数据。
模块的数据通过数据文件声明:带elements 的XML 文件. 每一个element
创建或者更新一条数据库记录.
model="{model name}" id="{record identifier}"> name="{a field name}">{a value}

model is the name of the Odoo model for the record
id is an external identifier, it allows referring to the record (without having to know its in-database identifier)
elements have a name which is the name of the field in the model (e.g. description). Their body is the field’s value.
数据文件必须通过 manefest 文件声明以便被夹加载,他们可以定义在'data'列表 (总是加载) or 或者在 'demo' 列表 (只有在演示模式才能被加载。).

作业:定义一个演示数据(Define demonstration data)
创建一个带几条演示数据填充的 courses 模块,编辑openacademy/demo.xml文件使其包含一些数据.

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="openacademy.course" id="course2">
         name="name">Course 2
         name="description">Course 2's description

动作和菜单(Actions and Menus)
动作和菜单是数据库保存的标准记录,通常是通过数据文件声明。动作可以通过3种方式触发:

点击菜单 (linked to specific actions)
点击试图上的按钮 (if these are connected to actions)
对象的上下文动作
因为菜单声明有点复杂。有个捷径把菜单和相应的动作连接起来。

model="ir.actions.act_window" id="action_list_ideas">

 name="name">Ideas
 name="res_model">idea.idea
 name="view_mode">tree,form

id="menu_ideas" parent="menu_root" name="Ideas" sequence="10"

      action="action_list_ideas"/>

危险

动作必须在相应的xml文件中的菜单之前声明。
数据文件是按顺序执行的,在菜单创建时动作在数据库中的ID必须存在。

练习 定义一个菜单项。

定义一个新菜单项,访问在menu 项下的课程和sessions。用户可以:
1)显示课程列表
2)创建修改课程

Create openacademy/views/openacademy.xml with an action and the menus triggering the action。
Add it to the data list of openacademy/__openerp__.py

openacademy/__openerp__.py

'data': [
    # 'security/ir.model.access.csv',
    'templates.xml',
    'views/openacademy.xml',
],
# only loaded in demonstration mode
'demo': [

openacademy/views/openacademy.xml

<?xml version="1.0" encoding="UTF-8"?>

<data>
    <!-- window action -->
    <!--
        The following tag is an action definition for a "window action",
        that is an action opening a view or a set of views
    -->
    <record model="ir.actions.act_window" id="course_list_action">
        <field name="name">Courses</field>
        <field name="res_model">openacademy.course</field>
        <field name="view_type">form</field>
        <field name="view_mode">tree,form</field>
        <field name="help" type="html">
            <p class="oe_view_nocontent_create">Create the first course
            </p>
        </field>
    </record>

    <!-- top level menu: no paret -->
    <menuitem id="main_openacademy_menu" name="Open Academy"/>
    <!-- A first level in the left side menu is needed
         before using action= attribute -->
    <menuitem id="openacademy_menu" name="Open Academy"
              parent="main_openacademy_menu"/>
    <!-- the following menuitem should appear *after*
         its parent openacademy_menu and *after* its
         action course_list_action -->
    <menuitem id="courses_menu" name="Courses" parent="openacademy_menu"
              action="course_list_action"/>
    <!-- Full id location:
         action="openacademy.course_list_action"
         It is not required when it is the same module -->
</data>

相关标签 TAG : Odoo OpenERP 基础 教程