odoo10 入门

一:入门准备

1:--xmlrpc-port=<端口> 命令选项充许我们将服务器实例的侦听端口从默认8069改为指定端口。这样可以在同一服务器上同时运行多个实例。

2:使用db-filter参数实现通过域名指定访问哪个数据库(用于数据库切换或指定)

3:--log-level选项允许我们设置日志级别。 默认情况下,日志输出被定向到标准输出(您的控制台屏幕),但它可以使用--logfile = <filepath>选项定向到日志文件。

4:使用linux进行开发时,与本机中另一个系统进行文件共享:Samba服务让我们能够在Linux下实现与Windows兼容的文件共享服务。用Windows Explorer来打开网络驱动,我们将能够访问和编辑本机上另一个系统中的内容。

二:第一个应用程序

1:application与modules的区别:application一般是针对大功能的模块,如提供会计功能等一个领域的功能。而一般的模块modules则是指基于大功能模块进行扩展、修改得到的。

在manifest中定义模块是否是应用程序。它在模块的技术使用上,没有任何的影响。它只是在应用程序清单中使模块名高亮显示。

2:继承:

一般情况下,通过直接更改源代码修改现有模块的功能是一个很糟糕的方法。对于 Odoo 提供的官方模块,尤其如此。

如果这样做,你不能明确的区分原始模块代码和修改,并且这使它难以升级,因为升级会覆盖所做的修改。

相反,我们应该创建一个额外的模块,去实现我们需要改变或者增加的功能。Odoo 的主要优势之一是继承机制,允许自定义模块扩展现有模块,无论是官方的还是社区的。

继承可以是任意一个层次︰ 数据模型、业务逻辑和用户界面层

model

# -*- coding: utf-8 -*- //告诉Python解释器,使用UTF8编码
from odoo import models, fields, api, _ //从odoo导入models、fields对象

#  fields 是odoo自定义的字段集

#  models在odoo中每个实例对象都要继承models.Model这个类

#  api 是使用新API必须的装饰器

#  _ 是翻译函数
class TodoTask(models.Model): //继承models.Model类定义数据模型
_name = 'todo.task' //上面的类名对odoo是不起作用的,我们通过_name成员作为这个数据模型在odoo中的唯一标识
_description = 'To-do Task'

#以下是字段定义:
//name与active是特殊字段:name字段作为记录的标题。active字段用于是否激活记录。
name = fields.Char('Description', required=True)
active = fields.Boolean('Active?', default=True)

//以下是保留字段:odoo自动生成
id (Id) 数据表主键
create_date (Datetime) 创建时间
create_uid (Many2one) 创建人id
write_date (Datetime) 最近修改时间
write_uid (Many2one) 最近修改人id

//以下是自定义的字段
is_done = fields.Boolean('Done?')
......

导入数据模型:在models目录和顶层目录下导入即可:使用以下语句格式

from . import py  文件名

4:测试:Odoo支持使用两种方式来描述测试: 使用 YAML 数据文件或使用 Python 代码、基于 Unittest2 库。 YAML 测试是一种遗留下来的旧老版本, 不建议使用。 我们会更乐意使用 Python 测试并将添加基本的测试实例到我的模块。

测试代码文件必须用test_开头 , 并且从tests/__init__.py文件导入。 但 测试的 目录(或 Python 的子模块)不应从模块的顶部的__init__.py导入, 因为仅在测试的执行的时候会自动被发现并装载。

5:视图层

主要有四个视图:

菜单视图:把 数据模型——菜单——视图(tree、form) 连接起来

表单视图:创建、编辑数据模型所用视图。

列表视图:展示数据模型(显示数据)时使用。

搜索视图:制定odoo右上角对于当前数据模型的可搜索字段以及可用过滤器。

1)菜单

在定义了数据模型之后,我们要操作该模型。就需要把模型——菜单——视图 连接起来。这可以通过act_window+menuitem来实现。

<act_window>元素定义了一个客户端窗口动作,该动作将以列表和表单视图的顺序打开todo.task模型。 <menuitem>定义了一个顶级菜单项,调用前面定义的action_todo_task动作。

两个元素都包含了id属性。 此id属性也称为XML ID,它用于唯一标识模块内的每个数据元素,并且可以由其他元素使用来引用它

<!-- 视图动作 -->
<act_window id="action_qingjia_qingjiadan" //该标签的id
name="请假单" //视图名
res_model="qingjia.qingjiadan" //视图要操作哪个数据模型:模块.数据模型
view_mode="tree,form" /> //依次用什么视图来打开这个数据模型

<!-- 顶级菜单 -->
<menuitem name="请假" id="menu_qingjia"/> //顶级菜单:出现在导航栏上

<!-- 二级菜单 --> //二级菜单:点击顶级菜单跳转到请假模块后,出现在左侧边栏。
<menuitem name="请假单" id="menu_qingjia_qingjiadan" parent="menu_qingjia" action="action_qingjia_qingjiadan"/> //指定菜单的响应动作:依次用什么视图来操作数据模型

最后,把视图文件所在路径注册到manifest的data中:

 'data': [
        'views/views.xml',  //注意:路径要全。
    ],

2)表单视图

 所有的视图都存储在数据库中。我们在XML文件中声明一个描述视图的<record>元素,该模块在安装模块时将被加载到数据库中。

<record id="view_form_模块名" model="ir.ui.view">
<field name="name">表单名</field>
<field name="model">数据模型(模块.模型)</field>
<field name="arch" type="xml"> //重点:视图类型定义
<form>
<group> //表单中一列
<field name="name"/> //字段为数据模型中的字段内容
<field name="is_done"/>
<field name="active"/>
</group>
</form>
</field>
</record>

业务凭证窗体视图(仿纸页风格)

此表单包含两个元素:<header>包含操作按钮,<sheet>包含数据字段。

Form视图可以添加按钮以完成特定动作。这些按钮可以打开一个新的包含Form表单的窗口或运行定义在模块中的Python函数。

它们可以定义在Form视图内的任意位置,但是对于文档形式的窗体,建议把它们放在<header>标签中。

       <form>
          <header> //操作按钮所在区域
            <button name="按钮响应事件(定义在数据模型中)" type="动作的类型(执行的操作)" string="按钮显示文本" class="按钮样式" />
          </header>
          <sheet> //数据字段操作区域
            <group name="group_top" string="请假单"> 
              <field name="name"/> //数据模型中的字段们
              <field name="days"/>
              <field name="startdate"/>
              <field name="reason"/>
            </group>
          </sheet>
        </form>

group标签(相当于div)

<group>标签允许组织Form表单里的内容。在<group>中放置<group>,可以创建一个两列的列表。Group标签使用时,建议定义它的name属性,这样可以更方便的让其它模块扩展它或者用于标识该列内容的显示位置

使用group方便地安排内容的分布显示:

<sheet>
<group name="group_top">
<group name="group_left">//左边列
<field name="name"/>
</group>
<group name="group_right">//右边列
<field name="is_done"/>
<field name="active" readonly="1"/>
</group>
</group>
</sheet>

所以一个完整的form视图如下:

   <form>
       <header>//操作按钮区域
           <button name="数据模型中定义的按钮事件" type="操作类型" string="按钮显示文本" class="按钮样式" />
       </header>
       <sheet>//数据字段区域
           <group name="group_top">//使用group进行布局
               <group name="group_left">
                   <field name="name"/>
               </group>
               <group name="group_right">
                   <field name="is_done"/>
                   <field name="active" readonly="1" />
               </group>
           </group>
       </sheet>
   </form>

Tab 分页效果:notebook标签

<form>
        ......
        <notebook>
            <page string="页名">
                <field name="显示内容" nolabel="页号"/>
            </page>
        </notebook>
</form>

3)列表视图

查看模型时,将使用<tree>视图。 树视图能够显示按层级结构组织的行,但大多数时候,它们用于显示简单列表。

<record id="view_tree_数据模型名" model="ir.ui.view"> 
 <field name="name">列表名</field> 
 <field name="model">模块.数据模型</field> 
 <field name="arch" type="xml"> //指明视图类型
   <tree colors="可以指明下面字段值为何值时,对应行使用什么背景颜色(这是通过bootstrap来实现的)"> 
     <field name="字段.."/> 
     <field name="字段.."/> 
   </tree> 
 </field> 
</record>

4)搜索视图

在列表的右上角,Odoo显示一个搜索框。 它搜索的字段和可用的过滤器是由<search>视图定义的。

<record id="view_filter_数据模型名" model="ir.ui.view"> 
 <field name="name">过滤器名</field> 
 <field name="model">模块.数据模型</field> 
 <field name="arch" type="xml"> //视图类型 
   <search>  //搜索视图定义
     <field name="可搜索字段"/>  //可搜索字段定义
     <filter string="过滤条件名"  domain="[('字段','操作符',值)]"/>  //过滤条件定义
   </search> 
 </field> 
</record>

6:安全控制

访问控制安全:

新建security目录,在其中新建ir.model.access.csv文件。

在odoo中数据模型的访问控制都是在ir.model.access.csv文件中定义的。格式如下:

第一行:定义列标

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
id:记录的外部标识符 (也称为 XML ID)。在我们的模块中它应该是唯一。
 name:描述标题。官方模块通常使用模型名称和组的圆点分隔的字符串。如: todo.task.user
 model_id :模型的外部标识符。todo.task对应该标识符是model_todo_task
 group_id:标识授予权限的访问组。最重要的一点是供定义它的模块名前缀。比如员工组,它的标识符为base.group_user。 
 perm_XX:字段标记授予 读, 写, 创建,删除 权限。

之后下面各行一一对应第一行定义的内容去书写权限控制,如:

复制代码
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_product_product_account_user,product.product.account.user,product.model_product_product,group_account_user,1,0,0,0
access_product_product_account_manager,product.product.account.manager,product.model_product_product,group_account_manager,1,1,1,1
access_product_template_account_manager,product.template.account.manager,product.model_product_template,group_account_manager,1,1,1,1

最后,我们把模块的权限控制文件添加到manifest文件的data中加载:

'data':['security/ir.model.access.csv',]

Row-level访问规则

除了访问控制安全,odoo还有一项记录规则安全控制。

记录规则的定义模型是ir.rule。

记录规则控制,我们需要提供一个独特的名称,还需要操作符和规则过滤器组成的模型以达到访问限制。在Odoo中,规则过滤器通常是多个元组组成的列表。

规则适用于某些特定的访问组。如果它没有访问组,这种特殊情况,被认为是全局 ( global字段将自动设置为 True)。全局规则是不同的,因为他们实施了限制,不会被非全局规则重写。

首先,我们在security目录下新建 模块名_security.xml 文件。

然后,在其中添加以下内容:

<?xml version="1.0" encoding="utf-8"?>
<odoo>    
        <record id="模块名_对象_rule" model="ir.rule"> //为某对象添加记录规则
            <field name="name">规则名</field>
            <field name="model_id" ref="model_模块名"/>
            <field name="domain_force">[('字段名','操作符',值)]</field> //表达式
            <field name="groups" eval="[(值,ref('组id'))]"/>
        </record>    
</odoo>

最后,在manifest中添加该文件到data属性下生效。

7:模块增加图标

模块的static目录是专门用于存放静态文件内容如:图片、css等的。其中,description目录是存放关于模块的一些描述性的文件的,其中,模块的图标也放在下面,以icon命名。

 
原文地址:https://www.cnblogs.com/zcy1103/p/8202632.html