* 官方建议模块骨架
    --------------------------
    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自定义模块的更多相关文章

  1. odoo自定义模块项目结构,odoo自定义模块点安装不成功解决办法

    如图所示:在odoo源码的根目录中创建自己的项目文件(project) 在odoo.conf配置文件中的addons_path路径中加入自己项目的文件夹路径,推荐使用绝对路径 addons_path ...

  2. node (02 CommonJs 和 Nodejs 中自定义模块)顺便讲讲module.exports和exports的区别 dependencies 与 devDependencies 之间的区别

    CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷.它的终极目标就是:提供一个类似 Python,Ruby 和 Java 语言的标准库,而不只是停留在小脚本程序的阶 ...

  3. python开发学习-day05(正则深入、冒泡排序算法、自定义模块、常用标准模块)

    s12-20160130-day05 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  4. 【python】用setup安装自定义模块和包

    python解释器查找module进行加载的时候,查找的目录是存放在sys.path变量中的,sys.path变量中包含文件的当前目录.如果你想使用一个存放在其他目录的脚本,或者是其他系统的脚本,你可 ...

  5. angular(3)服务 --注入---自定义模块--单页面应用

    ng内部,一旦发生值改变操作,如$scope.m=x,就会自动轮询$digest队列,触发指定的$watch,调用其回调函数,然后修改dom树. 干货:https://github.com/xufei ...

  6. python基础知识8——模块1——自定义模块和第三方开源模块

    模块的认识 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需 ...

  7. Func系列3:自定义模块

    简介 Func自带的模块已经非常丰富,但在日常系统运维当中,尤其是面对大规模的服务器集群.不同类别的业务平台,次是Func自带的模块或许已经不能满足我们的需求,所以有必要通过自定义模块来填补这块的不足 ...

  8. Python3导入自定义模块的3种方式

    前话 最近跟着廖雪峰的教程学到 模块 这一节.关于如何自定义一个模块,如果大家不懂的话还请先看下面这篇博文 ↓ http://www.liaoxuefeng.com/wiki/001431608955 ...

  9. Python开发【第一篇】Python基础之自定义模块和内置模块

    为什么要有模块,将代码归类.模块,用一砣代码实现了某个功能的代码集合. Python中叫模块,其他语言叫类库. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代 ...

随机推荐

  1. 【leetcode❤python】 219. Contains Duplicate II

    #-*- coding: UTF-8 -*-#遍历所有元素,将元素值当做键.元素下标当做值#存放在一个字典中.遍历的时候,#如果发现重复元素,则比较其下标的差值是否小于k,#如果小于则可直接返回Tru ...

  2. 【leetcode❤python】107. Binary Tree Level Order Traversal II

    #-*- coding: UTF-8 -*- # Definition for a binary tree node.# class TreeNode(object):#     def __init ...

  3. BZOJ 3489 A simple rmq problem(可持久化线段树)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3489 题意:一个数列.每次询问一个区间内出现一次的最大的数字是多少. 思路:设la ...

  4. mysql中bigint、int、mediumint、smallint 和 tinyint的取值范围

    mysql数据库设计,其中,对于数据性能优化,字段类型考虑很重要,搜集了些资料,整理分享出来,这篇为有关mysql整型bigint.int.mediumint.smallint 和 tinyint的语 ...

  5. albert1017 Linux下压缩某个文件夹(文件夹打包)

    albert1017 Linux下压缩某个文件夹(文件夹打包) tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录例子:把 ...

  6. 程序间数据共享与传递:EXPORT/IMPORT、SAP/ABAP Memory

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. CUBRID学习笔记 21 查看主键外键索引

    命令 show create table game; game是表名 在web管理中,请在sql标签中查,不要在query中执行. show create table game; === <Re ...

  8. hdu 3018 Ant Trip 欧拉回路+并查集

    Ant Trip Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem ...

  9. 【FFT-快速傅立叶变换】

    HDU-1402 A * B Problem Plus 题意:给定两个整数,整数的长度最多能达到50000位,输出两个整数的乘积. 分析:题意非常的明了,一个惊世骇俗的想法是使用两个数组将整数保留起来 ...

  10. java乱码问题(转)

    参考: http://blog.csdn.net/beijiguangyong/article/details/7414247 http://www.zhihu.com/question/202126 ...