OpenERP:在模块简介中插入图片

OpenERP:在模块简介中插入图片

1 插入图片

每个 OpenERP 模块的文件夹下,都有一个 __openerp__.py 文件,它用一个 dict 来表示模块的各种信息,其中 description 的值即为模块的简介。在 description 对应的字符串中,可以通过
.. image:: /module-name/path/to/your/image_file_name 来插入图片。

例如,模块 wenshan-test 的文件夹下有 static/src/img/roshan.jpg ,而 wenshan-test/__openerp__.py 的内容如下(注意第15行):

 1:  # -*- encoding: utf-8 -*-
 2:  {
 3:      "name": "Wenshan Test",
 4:      "version": "1.0",
 5:      "depends": [
 6:      ],
 7:      "author": "任文山",
 8:      "category": "任",
 9:      "description": """
10:  Wenshan Test
11:  ============
12:  
13:  * Hello World
14:  
15:  .. image:: /wenshan-test/static/src/img/roshan.jpg
16:  
17:  * Python Sucks
18:  
19:      """,
20:      "update_xml": [
21:      ],
22:      "demo": [],
23:      "test": [],
24:      "installable": True,
25:      "active": False,
26:  }

那么,它在 OpenERP 中的简介为:
./img/OpenERP-insert-pic-to-module-description.png

2 代码分析

这一节是记录我解决这个问题的大致过程,对 OpenERP 源代码感兴趣的可以看看。由于 OpenERP 缺少文档,很多时候需要阅读源代码来解决问题(也有时候是有文档,但一时没查到)。

2.1 module 模块

OpenERP 管理模块的模块名为 ir.module.module ,它的目录在 openobject-server/openerp/addons/base/module 下。

openobject-server/openerp/addons/base/module/module_view.xml 中找到这个模块的 form 视图,发现模块简介(即 Description)是调用了 description_html 这个字段(第11行):

 1:  <!-- Modules -->
 2:  <record id="module_form" model="ir.ui.view">
 3:    <field name="name">ir.module.module.form</field>
 4:    <field name="model">ir.module.module</field>
 5:    <field name="arch" type="xml">
 6:      <form create="0" edit="0" string="Module" version="7.0">
 7:        <sheet>
 8:          ...
 9:          <notebook>
10:            <page string="Description">
11:              <field name="description_html"/>
12:            </page>
13:            ...
14:          </notebook>
15:        </sheet>
16:      </form>
17:    </field>
18:  </record>

然后打开 openobject-server/openerp/addons/base/module/module.py ,找到 ir.module.module 的定义,其中有两个 field 是和模块简介相关的: descriptiondescription_html

1:  _columns = {
2:      ...
3:      'description': fields.text("Description", readonly=True, translate=True),
4:      'description_html': fields.function(_get_desc, string='Description HTML', type='html', method=True, readonly=True),
5:      ...
6:  }

description 就是 __openerp__.py 文件中的 ‘description’,而 description_html 则是一个 functional field,它调用 _get_desc() 方法来解析 description field,从而生成 HTML 字符串,这个字符串最后被浏览器渲染,变成我们看到的模块简介。

跳到 _get_desc() 的定义(在 Emacs 中是按 M-. ):

1:  def _get_desc(self, cr, uid, ids, field_name=None, arg=None, context=None):
2:      res = dict.fromkeys(ids, '')
3:      for module in self.browse(cr, uid, ids, context=context):
4:          overrides = dict(embed_stylesheet=False, doctitle_xform=False, output_encoding='unicode')
5:          output = publish_string(source=module.description, settings_overrides=overrides, writer=MyWriter())
6:          res[module.id] = output
7:      return res

重点是第5行,它以 description 字段为输入,输出一个 HTML 字符串。 publish_string 是在文件开头从 docutils 中导入进来的一个函数:

from docutils.core import publish_string

然后稍微 Google 一下,发现 docutils 用的是 reStructuredText 格式,再搜索 reStructuredText 的文档,很容易就找到在其中插入图片的方法

结论是,可以在模块简介里使用 reStructuredText 的语法。

Happy Hacking!


Date: 2013-06-30

Author: 任文山 (Ren Wenshan)

Org version 7.9.3d with Emacs version 24

Validate XHTML 1.0

One thought on “OpenERP:在模块简介中插入图片

  1. Pingback: 链接推荐 —— 2013年6月 | 肉山博客 (Wenshan's Blog)

Leave a Reply