开发模块

简介

这里有OpenRPM项目中额通讯组织信息。其中包括了使用不同工具的描述,不同参与者的角色,以及对改进管理的不同过程。

整个组织都是通过launchpad: http://launchpad.net 上的项目来管理的。OpenERP在OpenERP的项目的组织方式是像这样的:

项目名称(Project name)

URL

描述(Description)

openobject

https://launchpad.net/openobject

主超项目(super-project,群组),主要管理bug、特征以及常见问题及回答(FAQ)

openobject-bi

https://launchpad.net/openobject-bin

business intelligence project

openobject-server

https://launchpad.net/openobject-server

the openobject server

openobject-client

https://launchpad.net/openobject-client

the openobject application client (gtk)

openobject-client-web

https://launchpad.net/openobject-client-web

the openobject web client (previously called eTiny)

openobject-addons

https://launchpad.net/openobject-addons

the project for all modules about openobject

openerp

https://launchpad.net/openerp

packaging around openobject (a selection of modules to build applications)

获取源码

请参考Bazaar章节中 怎么获取最新的代码

如果你不知道Bazaar版本控制系统,请阅读 Bazaar文档 (documentation on Bazaar )

编码指南

Development Guidelines

模块

模块中的文件组织

模块的结构应该如下:

  1. /module_name/
  2. /module_name/__init__.py
  3. /module_name/__terp__.py
  4. /module_name/module.py
  5. /module_name/module_view.xml
  6. /module_name/module_wizard.xml
  7. /module_name/module_report.xml
  8. /module_name/module_data.xml
  9. /module_name/module_demo.xml
  10. /module_name/module_security.xml
  11. /module_name/wizard/
  12. /module_name/wizard/__init__.py
  13. /module_name/wizard/wizard_name.py
  14. /module_name/wizard/wizard_name_view.xml
  15. /module_name/wizard/wizard_name_workflow.xml
  16. /module_name/report/
  17. /module_name/report/__init__.py
  18. /module_name/report/report_name.sxw
  19. /module_name/report/report_name.rml
  20. /module_name/report/report_name.py
Naming Objects and fields
权限

每个你的模块定义的对象中必须至少定义一个安全规则,使其可以被访问。

Development

编码指南

遵从Python PEP 8: http://www.python.org/dev/peps/pep-0008/

报表

一般风格
  • 在每个地方使用Helvetica字体

  • 留白(单位 毫米)

    • 顶部 top: 14

    • 下部 bottom: 16

    • 左侧 left: 介于12到13之间,以便于打孔时避免打孔到文本区域

    • 右侧 right: 介于12 和 13之间

  1. 注解
  2. 在页首和页面本体之间的分割线可以与左两边的留白有一些重叠:左侧最多9毫米,右侧最多12毫米。
  • 标题中使用 Helvetica-Bold 字体,大小为 14.5

  • 把上下文信息context放到每篇报告:例如,对于会计平衡:上下文是财务年度和期间

  • 对同一个单元格,如果名称中包含有多个单词,单词的首个字母使用字母,例如:Date Ordered (订购日期)

  • 内容和单元格的名称应该有相同的识别号

  • 对于报表,我们能够定义两种数组

    • 一般信息数组,如参考、日期、…,使用:

      • 单元格名称使用 Bold-Helvetica 字体,大小 size=8

      • 目录用 *Helvetica*字体,大小 size=”8”

    • 详细信息数组,使用:

      • 单元格名称,用 Helvetica-Bold 字体,大小为 size 9

      • 目录用 Helvetica 字体,大小 size 8

Headers and footers for internal reports:

  • 内部报表 = 所有财务报表和其他内部使用的报表(不是发送给客户的)

  • 表头的高度应该稍小一些

  • 内部报告(报表),去掉公司页首和页脚(在内部报告(报表)中使用简化的页首页脚,只包括公司名称、报表标题、打印日期和页数页面

  • 表头 header:

    • 公司名: 在每一页的(表头)中间

    • 报表名称:居中打印在表头之后

    • 打印日期:不是在报表的中间,而是在表头的左侧

    • 页码:打印在在每一页的右侧。页码应该包括当前页码和总页数。例如:3/15

  • 页尾

    • 为避免浪费纸张,我们已经取消了页脚

table line separator:

  • 表格的每行之间使用浅灰色的线条分隔开来是比较好的方法

  • 只在包含一般信息的数组的列之间的使用浅色的分隔线条

table breaking

  • 表头至少包含两个数据行(不要在页面的底部单独使用表头)

  • 当一个较大的表格被分隔,表头应该在每页重复

how to differentiate parents and children ?

  • 当存在多于一个曾阶时。使用这些风格:
  • 第一阶和第二阶使用: 大小 fontSize=”8.0” 字体 fontName=”Helvetica-Bold”

  • 第三阶,使用: 字体 fontName=”Helvetica” 大小 fontSize=”8.0” 并每阶增加缩进 13 (pixels)

  • 当元素是父元素时, 在小计下方划线

模块

命名惯例

模块名称都用小写字母,每个单词之间使用下划线分隔。应该使用最相关的单词,最好包含其依赖的模块的名称。

示例:

  • account_invoice_layout

信息需求

每个模块必须至少包含:

  • 名称

  • 描述

模块描述

关联性

每个模块必须包含:

  • 在其他模块中被依赖的模块的列表: [‘account’,’sale’]

    • 只列出最高级别的依赖,不需要设为[‘account’,’base’,’product’,’sale’]
  • A version requirement string where base is the OpenERP version as a Python expression

    • account>=1.0 && base=4.4

模块内容

每个模块必须包含模块定义的每个对象的演示数据

如果你在模块中实现了工作流,则需要创建演示数据,并且能购用这些数据通过工作流中定义的各个分支。你可以使用模块记录器来帮你建立这些演示数据。

User Interface Guidelines

菜单

Organising menus

Here is a good example:

  • Invoices (list)

    • Customer Invoices (list)

      • Draft Customer Invoices (list)

      • Open Customer Invoices (list)

      • New Customer Invoice (form)

    • Supplier Invoices

Add a New … menu only if the user requires it, otherwise, open all menus as lists. The New … menu open as a form instead of a list. For example, don’t put New … in a menu in the configuration part.

If you use folders that are clickable, their child must be of the same object type. (we suppose that inheritances are the same objects)

List are plurals:

  • Customer Invoice, should be Customer Invoices

If you want to create menu that filters on the user (All and My) put them at the same level:

  • Tasks

  • My Tasks

And not:

  • Tasks

    • My Tasks

Avoid Abbreviations in menus if possible. Example:

  • BoM Lines -> Bill of Materials Lines
Reporting Menu

The dashboard menu must be under the report section of each main menu

  • Good: Sales Management / Reporting / Dashboards / Sales Manager

  • Bad: Dashboard / Sales / Sales Manager

If you want to manage the This Month/ALL months menu, put them at the lowest level:

  • Reporting/Timesheet by User/All Month

  • Reporting/Timesheet by User/This Month

Icons in the menu
  • The icon of the menu, must be set according to the final action of the wizard, example:

    • wizard that prints a report, should use a report icon and not a wizard

    • wizard that opens a list at the end, should use a list icon and not a wizard

菜单的顺序

The configuration menu must be at the top of the list, use a sequence=0

菜单 报表(Reporting) 放在菜单列表的下部,使用序列号 sequence=50。

常见错误
  • 编辑类别(Edit Categories) -> 类别(Categories)

  • 类别列表(List of Categories) -> 类别(Categories)

Views

Objects with States
  • The state field, if any, must be at the bottom left corner of the view

  • Buttons to make the state change at the right of this state field

搜索条件

搜索准则:搜索所有列表视图所有可用列

Action Names

Wizards

术语

默认语言

每个开发项目的默认的语言必须是 英语(美国)。

除了连接字符,菜单和字段第一个字母使用大写字母:

  • 会计科目表

字段命名惯例

  • Avoid generic terms in fields and use if possible explicit terms, some example:

    • Name -> Sale Order Name

    • Parent -> Bill of Material Parent

    • Rate -> Currency Rate Conversion

    • Amount -> Quantity Sold

Here are some rules to respect:

  • many2one字段应使用正则表达式: ‘.*_id’

  • one2many字段应使用正则表达式: ‘.*_ids’

  • one2many关系表应使用正则表达式: ‘.*_rel’

  • many2many 字段应使用正则表达式: ‘.*_ids’

  • 使用下划线分隔单词

  • 避免使用大写

  • 如果字段有几个单词组成时,使用最重要的单词开头

    • This is good: sale_price, partner_address_id

    • This is bad: is_sellable

Object Naming Conventions

  • All objects must start by the name of the module they are defined in.

  • 如果对象由多个单词组成,使用点分隔单词

Some terms

  • 所有资源树被称为 XXX’s Structure(XXX结构) ,除非已经定义了专有名词

    • 好的定义: 位置结构(Location’ Structure), 会计科目(表)(Chart of Accounts), 分类结构(Categories’ Structure)

    • 不好的: 种类树视图, 物料清单树视图

Module Recorder

Review quality

  • You can check your module quality using “base_module_quality” module available on stable addons