(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中叫模块,其他语言叫类库. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代 ...
随机推荐
- AVL学习笔记
AVL,平衡二叉查找树.删除,插入,查找的复杂度都是O(logn).它是一棵二叉树.对于每个节点来说,它的左孩子的键值都小于它,右孩子的键值都大于它.对于任意一个节点,它的左右孩子的高度差不大于1.树 ...
- UE4编程之C++创建一个FPS工程(二)角色网格、动画、HUD、子弹类
转自:http://blog.csdn.net/u011707076/article/details/44243103 紧接上回,本篇文章将和大家一同整理总结UE4关于角色网格.动画.子弹类和HUD的 ...
- linux下vim命令详解
高级一些的编辑器,都会包含宏功能,vim当然不能缺少了,在vim中使用宏是非常方便的::qx 开始记录宏,并将结果存入寄存器xq 退出记录模式@x 播放记录在x寄存器中的宏命令 ...
- Servlet&jsp基础:第五部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 多线程处理sql server2008出现Transaction (Process ID) was deadlocked on lock resources with another process and has been chose问题
多线程处理sql server2008某个表中的数据时,在Update记录的时候出现了[Transaction (Process ID 146) was deadlocked on lock reso ...
- oracle的基本查询~下
SQL> --别名SQL> select ename 姓名, job as "工作" ,sal "薪水" from emp; 姓名 ...
- Win7_关闭休眠文件hiberfil.sys
1. C盘根目录下 hiberfil.sys 占用好几G空间,直接删 删不掉,也不推荐直接删. 2. 2.1.命令窗口中输入 powercfg -h off,即可关闭休眠功能,同时 Hiberfil. ...
- 代码中特殊的注释技术——TODO、FIXME和XXX的用处
本文内容概要: 代码中特殊的注释技术--TODO.FIXME和XXX的用处. 前言:今天在阅读Qt Creator的源代码时,发现一些注释中有FIXME英文单词,用英文词典居然查不到其意义!实际上, ...
- css技术和实例
今天,我为大家收集精选了30个使用纯CSS完成的强大实践的优秀CSS技术和实例,您将在这里发现很多与众不同的技术,比如:图片集.阴影效果.可扩展按钮.菜单等-这些实例都是使用纯CSS和HTML实现的. ...
- hdu 5340 Three Palindromes
前几晚 BC 的第二题,官方给出的题解是: 然后我结合昨天刚看的 Manacher 算法试着写了下,发现 pre.suf 数组挺难构造的,调试了好久,然后就对中间进行枚举了,复杂度应该是 O(n2) ...