### 模塊結構
每個模塊都是一個目錄內的一個*模塊目錄*。指定的模塊目錄使用 [`--addons-path`](https://www.odoo.com/documentation/9.0/reference/cmdline.html#cmdoption-odoo.py--addons-path) 選項.
Tip
大多數命令行選項也可以使用 [配置文件](https://www.odoo.com/documentation/9.0/reference/cmdline.html#reference-cmdline-config)
一個聲明的Odoo模塊 [manifest](https://www.odoo.com/documentation/9.0/reference/module.html#reference-module-manifest). 查看這個 [manifest documentation](https://www.odoo.com/documentation/9.0/reference/module.html#reference-module-manifest) 關于它的信息.
模塊也是一個[Python package](http://docs.python.org/2/tutorial/modules.html#packages)在`__init__.py`文件, 包含在模塊的各種Python文件導入指令.
例如,如果該模塊有一個單一的 `mymodule.py` 文件 `__init__.py` 可能包含:
~~~ Python
from . import mymodule
~~~
Odoo提供了一種機制來幫助建立一個新的模塊, [odoo.py](https://www.odoo.com/documentation/9.0/reference/cmdline.html#reference-cmdline-server) 有一個命令 [scaffold](https://www.odoo.com/documentation/9.0/reference/cmdline.html#reference-cmdline-scaffold) 創建一個空模塊:
~~~ cmd
$ odoo.py scaffold <module name> <where to put it>
~~~
該命令創建一個模塊的子目錄,并自動創建一個模塊一堆標準文件。他們中的大多數只包含注釋代碼或XML。大多數這些文件的使用將在本教程中解釋。
>練習
模塊創建
使用命令行上創建一個空的模塊開院,并安裝在Odoo。
1. 調用命令 ` odoo.py支架openacademy插件`.
2. 將清單文件調整到模塊.
3. 不要打擾其他文件.
*openacademy/__openerp__.py*
~~~ Python
# -*- coding: utf-8 -*-
{
'name': "Open Academy",
'summary': """Manage trainings""",
'description': """
Open Academy module for managing trainings:
- training courses
- training sessions
- attendees registration
""",
'author': "My Company",
'website': "http://www.yourcompany.com",
# 類別可用于模塊列表中的篩選器模塊
# 檢查 https://github.com/odoo/odoo/blob/master/openerp/addons/base/module/module_data.xml
# 為完整列表
'category': 'Test',
'version': '0.1',
# 這一個需要正確工作的模塊
'depends': ['base'],
# 總是加載
'data': [
# 'security/ir.model.access.csv',
'templates.xml',
],
# 只有在示范模式中加載
'demo': [
'demo.xml',
],
}
~~~
*openacademy/__init__.py*
~~~ Python
# -*- coding: utf-8 -*-
from . import controllers
from . import models
~~~
*openacademy/controllers.py*
~~~ Python
# -*- coding: utf-8 -*-
from openerp import http
# class Openacademy(http.Controller):
# @http.route('/openacademy/openacademy/', auth='public')
# def index(self, **kw):
# return "Hello, world"
# @http.route('/openacademy/openacademy/objects/', auth='public')
# def list(self, **kw):
# return http.request.render('openacademy.listing', {
# 'root': '/openacademy/openacademy',
# 'objects': http.request.env['openacademy.openacademy'].search([]),
# })
# @http.route('/openacademy/openacademy/objects/<model("openacademy.openacademy"):obj>/', auth='public')
# def object(self, obj, **kw):
# return http.request.render('openacademy.object', {
# 'object': obj
# })
~~~
*openacademy/demo.xml*
~~~xml
<openerp>
<data>
<!-- -->
<!-- <record id="object0" model="openacademy.openacademy"> -->
<!-- <field name="name">Object 0</field> -->
<!-- </record> -->
<!-- -->
<!-- <record id="object1" model="openacademy.openacademy"> -->
<!-- <field name="name">Object 1</field> -->
<!-- </record> -->
<!-- -->
<!-- <record id="object2" model="openacademy.openacademy"> -->
<!-- <field name="name">Object 2</field> -->
<!-- </record> -->
<!-- -->
<!-- <record id="object3" model="openacademy.openacademy"> -->
<!-- <field name="name">Object 3</field> -->
<!-- </record> -->
<!-- -->
<!-- <record id="object4" model="openacademy.openacademy"> -->
<!-- <field name="name">Object 4</field> -->
<!-- </record> -->
<!-- -->
</data>
</openerp>
~~~
*openacademy/models.py*
~~~Python
# -*- coding: utf-8 -*-
from openerp import models, fields, api
# class openacademy(models.Model):
# _name = 'openacademy.openacademy'
# name = fields.Char()
~~~
*openacademy/security/ir.model.access.csv*
~~~csv
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_openacademy_openacademy,openacademy.openacademy,model_openacademy_openacademy,,1,0,0,0
~~~
*openacademy/templates.xml*
~~~xml
<openerp>
<data>
<!-- <template id="listing"> -->
<!-- <ul> -->
<!-- <li t-foreach="objects" t-as="object"> -->
<!-- <a t-attf-href="{{ root }}/objects/{{ object.id }}"> -->
<!-- <t t-esc="object.display_name"/> -->
<!-- </a> -->
<!-- </li> -->
<!-- </ul> -->
<!-- </template> -->
<!-- <template id="object"> -->
<!-- <h1><t t-esc="object.display_name"/></h1> -->
<!-- <dl> -->
<!-- <t t-foreach="object._fields" t-as="field"> -->
<!-- <dt><t t-esc="field"/></dt> -->
<!-- <dd><t t-esc="object[field]"/></dd> -->
<!-- </t> -->
<!-- </dl> -->
<!-- </template> -->
</data>
</openerp>
~~~