(02)odoo自定义模块
* 官方建议模块骨架
--------------------------
addons/<my_module_name>/
│─ __init__.py
│- __openerp__.py
│- controllers
│ │- __init__.py
│ │- main.py
│- data
│ │- <main_model>_data.xml
│ │- <inherited_main_model>_demo.xml
│
│- models
│ │- __init__.py
│ │- <main_model>.py
│ │- <inherited_main_model>.py
│
│- security
│ │- ir.model.access.csv
│ │- <main_model>_security.xml
│
│- static
│ │- img
│ │- lib
│ │- src
│ │ │- js
│ │ │- css
│ │ │- less
│ │ │- xml
│- views
│ │- <main_model>_templates.xml
│ │- <main_model>_views.xml
文件夹权限755 文件权限644
__openerp__.py 相关属性:
# name 模块名字
# summary 简短介绍
# description 详细描述
# author 作者
# website 模块网站
# category 模块分类
# version 模块版本号
# license 模块版本信息 默认是 AGPL-3
# depends 模块依赖
# data 模块必须加载的数据文件
# demo 示例数据
# installabel 默认为True 可安装
# auto_install 默认是False 如果设为True 就根据依赖模块,依赖装了,这个模块就安装
# application 默认是 False 如果设为True 就成为应用模块
安装自定义模块
服务启动配置文件 addons-path 加入自己的定义容器目录 如 myaddons
addons-path=addons,myaddons
更新模块服务列表,然后找到去安装
模块文件夹管理
# data 放 demo 和 data xml
# models 放模型定义
# controllers http 路径控制
# views 放网页视图和模板
# static 放网页的资源,里面还有css, js ,img, lib 等
#
--------------------------
todo_app
│ - security
│ | - ir.model.access.csv
│ | - todo_access_rules.xml
│ - static
│ - __init__.py
│ - __openerp__.py
│ - todo_model.py
│ - todo_view.xml
* __init__.py 内容如下(把模型导入到应用)
from . import todo_model
* __opererp__.py 内容如下(erp本身的配置)
--------------
{
'name':'To-Do Application',
'description': 'Manage your personal Tasks with this module.',
'author': 'Toby Chen',
'depends': ['mail'],
'application': True,
'category':'todo_app',
'data': [
'todo_view.xml',
'security/ir.model.access.csv',
'security/todo_access_rules.xml',
],
}
--------------
* todo_model.py 内容如下(模型)
--------------
# -*- coding: utf-8 -*-
from openerp import models,fields,api
class TodoTask(models.Model):
_name='todo.task'
name = fields.Char('Description', required=True)
is_done = fields.Boolean('Done?')
active = fields.Boolean('Active?', default=True)
@api.one
def do_toggle_done(self):
self.is_done = not self.is_done
return True
@api.multi
def do_clear_done(self):
done_recs = self.search([('is_done','=','True')])
done_recs.write({'active':False})
return True
--------------
* todo_view.xml内容如下(视图)
--------------
<?xml version="1.0" encoding="utf-8" ?>
<openerp>
<data>
<act_window id="action_todo_task"
name="To-do Task"
res_model="todo.task"
view_mode="tree,form" />
<menuitem id="menu_todo_task"
name="To-Do Task"
parent="mail.mail_feeds"
sequence="20"
action="action_todo_task" />
<record id="view_form_todo_task" model="ir.ui.view">
<field name="name">To-do Task Form</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<form string="To-do Task">
<header>
<button name="do_toggle_done" type="object"
string="Toggle Done" class="oe_highlight"/>
<button name="do_clear_done" type="object"
string="Clear All Done"/>
</header>
<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>
</field>
</record>
<record id="view_tree_todo_task" model="ir.ui.view">
<field name="name">To-do Task Tree</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<tree colors="gray:is_done==True">
<field name="name"/>
<field name="is_done"/>
</tree>
</field>
</record>
<record id="view_filter_todo_task" model="ir.ui.view">
<field name="name">To-do Task Filter</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<filter string="Not Done"
domain="[('is_done','=',False)]"/>
<filter string="Done"
domain="[('is_done','!=',False)]"/>
</search>
</field>
</record>
</data>
</openerp>
--------------
* ir.model.access.csv 内容如下()
-------------------
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_todo_task_group_user,todo.task.user,model_todo_task,base.group_user,1,1,1,1
-------------------
* todo_access_rules.xml
-----------------
<?xml version="1.0" encoding="UTF-8" ?>
<openerp>
<data noupdate="1">
<record id="todo_task_user_rule" model="ir.rule">
<field name="name">ToDo Tasks only for owner</field>
<field name="model_id" ref="model_todo_task"/>
<field name="domain_force">[('create_uid','=',user.id)]
</field>
<field name="groups" eval="[(4,ref('base.group_user'))]"/>
</record>
</data>
</openerp>
-----------------
* 可以到系统的本地模块中找到 去安装
* 开服务时要以升级模块
./odoo.py -d v8dev -u todo_app 用模块的目录
* 升级完,最好重启一下odoo的服务,不容易报错
====================================
再来一小段
模型
class Fruit(models.Model):
_name = 'mymodule.fruits'
name = fields.Char()
加一个演示数据 demo.xml
<openerp>
<data>
<record id=”apple” model=”mymodule.fruits”>
<field name=”name”>apple</field>
</record>
<record id=”banana” model=”mymodule.fruits”>
<field name=”name”>banana</field>
</record>
<record id=”pear” model=”mymodule.fruits”>
<field name=”name”>pear</field>
</record>
</data>
</openerp>
看一下控制器
from openerp import http
class Mymodule(http.Controller)
@http.route('/mymodule/mymodule',auth='public')
def index(self,**kw)
fruits = http.request.env('mymodule.fruits')
return http.request.render("mymodule.index",{'fruits':fruits.search([])})
视图
<openerp>
<data>
<template id='index'>
<title>MyModule</title>
<t t-foreach="fruits" t-as="fruit">
<p><t t-esc="fruit.id" /><t t-esc="fruit.name" /></p>
</t>
</template>
</data>
</openerp>
上面的页面展示只有数据,不好看,可以用 website builder模块美化
__openerp__.py 加上
'depends':['website']
控制器加上
@http.route('/mymodule/mymodule', auth='public' website=True)
视图文件修改
<openerp>
<data>
<template id=”index”>
<t t-call=”website.layout”>
<t t-set=”title”>MyModule</t>
<div class=”oe_structure”>
<div class=”container”>
<t t-foreach=”fruits” t-as=”fruit”>
<p><t t-esc=”fruit.id”/><t t-esc=”fruit.name”></t></p>
</t>
</div>
</div>
</t>
</template>
</data>
</openerp>
采用了 t-call 调用标准模板 用 t-set 设置属性值 加了oe_structrue 和 container 类
====================================
(02)odoo自定义模块的更多相关文章
- odoo自定义模块项目结构,odoo自定义模块点安装不成功解决办法
如图所示:在odoo源码的根目录中创建自己的项目文件(project) 在odoo.conf配置文件中的addons_path路径中加入自己项目的文件夹路径,推荐使用绝对路径 addons_path ...
- node (02 CommonJs 和 Nodejs 中自定义模块)顺便讲讲module.exports和exports的区别 dependencies 与 devDependencies 之间的区别
CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷.它的终极目标就是:提供一个类似 Python,Ruby 和 Java 语言的标准库,而不只是停留在小脚本程序的阶 ...
- python开发学习-day05(正则深入、冒泡排序算法、自定义模块、常用标准模块)
s12-20160130-day05 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- 【python】用setup安装自定义模块和包
python解释器查找module进行加载的时候,查找的目录是存放在sys.path变量中的,sys.path变量中包含文件的当前目录.如果你想使用一个存放在其他目录的脚本,或者是其他系统的脚本,你可 ...
- angular(3)服务 --注入---自定义模块--单页面应用
ng内部,一旦发生值改变操作,如$scope.m=x,就会自动轮询$digest队列,触发指定的$watch,调用其回调函数,然后修改dom树. 干货:https://github.com/xufei ...
- python基础知识8——模块1——自定义模块和第三方开源模块
模块的认识 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需 ...
- Func系列3:自定义模块
简介 Func自带的模块已经非常丰富,但在日常系统运维当中,尤其是面对大规模的服务器集群.不同类别的业务平台,次是Func自带的模块或许已经不能满足我们的需求,所以有必要通过自定义模块来填补这块的不足 ...
- Python3导入自定义模块的3种方式
前话 最近跟着廖雪峰的教程学到 模块 这一节.关于如何自定义一个模块,如果大家不懂的话还请先看下面这篇博文 ↓ http://www.liaoxuefeng.com/wiki/001431608955 ...
- Python开发【第一篇】Python基础之自定义模块和内置模块
为什么要有模块,将代码归类.模块,用一砣代码实现了某个功能的代码集合. Python中叫模块,其他语言叫类库. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代 ...
随机推荐
- UE4简单AI
首先做个小小的声明把,由于俺之前也没接触过AI ,所以有一些专业的词汇可能翻译存在各种问题,如果你发现的话,还是希望能够提出来哦,我们一起进步. 记住配合视频食用更佳哦~ 视频连接:http://ww ...
- .Net需要掌握的知识
一.C#开发 1.C#基础 变量定义 如何变量的初始化 变量的作用域 常量 字符串处理 使用正则表达式 什么是CTS类型?数据类型如何分类以及各个数据类型范围 类型的转化分类 显式转换何隐式转化如何区 ...
- JSONObject.fromObject
JSONObject.fromObjectjava.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRun ...
- poj 2398 (叉积+二分)
http://poj.org/problem?id=2398 Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissio ...
- 一张png图片 上面有多个图标,如何用CSS准确的知道其中某个图片的坐标
一张png图片 上面有多个图标,如何用CSS准确的知道其中某个图片的坐标 ,如下图 可以使用 background background:url(images/xx.png) 40px 10px n ...
- php 在函数定义变量的时候,变量前加了 @ 符号是什么意思
今天在看到一段代码,如下 <?php $test=@'kdksf?cc'; 加上@ 是 就可以不用\来表示转义字符了
- read 计时命令
使用read命令存在潜在危险,脚本很可能会停下来一直等待脚本用户输入数据,如果无论是否输入数据脚本的必须继续执行,那么可以使用-t选项指定一个计时器.-t选项指定read命令等待输入的秒数,当计数器计 ...
- jquery.validate插件在booststarp中的运用
现在在网络上已经可以找到很多基于bootstarp的表单认证,但是验证的都不全面的,下载后,我们还要理解作者的思路然后进行修改添加,这种修改方式往往适合学习,时间很多的时候.但是我们很多时候是没有时间 ...
- 基于Spark ALS构建商品推荐引擎
基于Spark ALS构建商品推荐引擎 一般来讲,推荐引擎试图对用户与某类物品之间的联系建模,其想法是预测人们可能喜好的物品并通过探索物品之间的联系来辅助这个过程,让用户能更快速.更准确的获得所需 ...
- Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace
Oracle正则表达式函数:regexp_like.regexp_substr.regexp_instr.regexp_replace --去掉所有特殊字符,只剩字母 SELECT REGEXP ...