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 中的简介为:
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 是和模块简介相关的: description 和 description_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!
Pingback: 链接推荐 —— 2013年6月 | 肉山博客 (Wenshan's Blog)