一:入门准备

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命名。

 

odoo10 入门的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  3. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  4. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  5. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  6. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  7. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  8. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  9. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

随机推荐

  1. 推荐几个Windows工具软件: Stickies - 桌面贴

    主页: http://www.zhornsoftware.co.uk/stickies/index.html Stickies work like Post-it notes for your PC. ...

  2. precision scale

    precision意为“精密度.精确”(精度),表示该字段的有效数字位数了. scale意为“刻度.数值范围”(),表示该字段的小数位数. 举个简单的例子 123.45:precision = 5 , ...

  3. Java知多少(20)变量的作用域

    在Java中,变量的作用域分为四个级别:类级.对象实例级.方法级.块级. 类级变量又称全局级变量或静态变量,需要使用static关键字修饰,你可以与 C/C++ 中的 static 变量对比学习.类级 ...

  4. 文件加密 解密 pdftk openssl gpg vim

    openssl加密和解密 . openssl des -salt -in file -out file.des openssl des -d -salt -in file.des -out file ...

  5. 仿迅雷播放器教程 -- 基于ffmpeg的C++播放器 (1)

    2011年12月份的时候发了这篇博客 http://blog.csdn.net/qq316293804/article/details/7107049 ,博文最后说会开源一个播放器,没想到快两年了,才 ...

  6. 设计模式-行为型模式,python访问者模式

    访问者模式 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式. ...

  7. [JS] ECMAScript 6 - Array : compare with c#

    扩展运算符(spread) 先复习下 rest 参数. (1) argument模式,但不够好. // https://blog.csdn.net/weixin_39723544/article/de ...

  8. Android Json 解析

    转自:http://www.cnblogs.com/mybkn/archive/2012/05/18/2508325.html JSON(JavaScript Object Notation) 是一种 ...

  9. 美团店铺评价语言处理以及分类(tfidf,SVM,决策树,随机森林,Knn,ensemble)

    第一篇 数据清洗与分析部分 第二篇 可视化部分, 第三篇 朴素贝叶斯文本分类 支持向量机分类 支持向量机 网格搜索 临近法 决策树 随机森林 bagging方法 import pandas as pd ...

  10. day_5.19 py总结②