* 官方建议模块骨架
    --------------------------
    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. 【转载】标准输入输出重定向(Visual C++)

    原文:标准输入输出重定向(Visual C++) 引言 本人偶得在 Visual C++ 中进行输入输出重定向的办法,比通常的做法“freopen”更加的灵活和方便,特在此共享.目前,代码正在不断地摸 ...

  2. TeeChart中 Line的Clear方法

    需要注意的是,如果设置了Line.Smoothed=true; 那么调用Clear是无效的,虽然清除了曲线上的点. 但是界面上的曲线,并没有消失. 所以,在每一次Line.Clear();之前,必须确 ...

  3. VBA中自定义类和事件的(伪)注册

    想了解一下VBA中自定义类和事件,以及注册事件处理程序的方法. 折腾了大半天,觉得这样的方式实在称不上“注册”,所以加一个“伪”字.纯粹是瞎试,原理也还没有摸透.先留着,有时间再接着摸. 做以下尝试: ...

  4. TI公司Tina-ti和FilterProDesktop下载地址

    http://www.ti.com/tool/tina-ti http://focus.ti.com/en/download/aap/DesignEnv/FilterPro-DT/FilterProD ...

  5. CUBRID学习笔记 33 net事务 cubrid教程示例

    conn.BeginTransaction(); string sql = "create table t(idx integer)"; using (CUBRIDCommand ...

  6. STORM_0007_Multi-Lang protocol of Storm/多语言协议的翻译

    原始地址: http://storm.apache.org/releases/1.0.1/Multilang-protocol.html 这个协议试用0.7.1之后的版本   通过ShellBolt和 ...

  7. hdu 5023 A Corrupt Mayor's Performance Art 线段树

    A Corrupt Mayor's Performance Art Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100 ...

  8. Oracle VM VirtualBox 虚拟机与主机共享文件

    安装增强功能(参考文档) VirtualBox自带了一个增强工具Sun VirtualBox Guest Additions,这是实现虚拟机与真实主机共享的关键.启动虚拟机后,点击控制菜单“设备”→“ ...

  9. Ant build ${renderscript.opt.level}问题解决方案

    问题如下: BUILD FAILEDD:\adt-bundle-windows-x86_64-20131030\sdk\tools\ant\build.xml:653: The following e ...

  10. Class create, device create, device create file (转)

    来自:http://www.hovercool.com/en/Class_create,_device_create,_device_create_file 开始写Linux设备驱动程序的时候,很多时 ...