from:https://doc.openerp.com/trunk/mail/mail_openchatter_howto/

A small my_task model will be used as example to explain how to use the OpenChatter feature. Being simple, it has only the following fields :

  • a name

  • a task responsible

  • a related project

class my_task(osv.osv):
_name = "my.task"
_description = "My Task"
_columns = {
'name': fields.char('Name', required=True, size=64),
'user_id':fields.many2one('res.users', string='Responsible',
ondelete='cascade', required=True, select=1),
'project_id':fields.many2one('project.project', string='Related project',
ondelete='cascade', required=True, select=1),
}

Two-lines feature integration

Make your module inheriting from the mail.thread class.

class my_task(osv.osv):
_name = "my.task"
_description = "My Task"
# inherit from mail.thread allows the use of OpenChatter
_inherit = ['mail.thread']

Use the thread viewer widget inside your form view by using the mail_thread widget on the message_ids field inherited from mail.thread.

<record model="ir.ui.view" id="my_task_form_view">
<field name="name">My Task</field>
<field name="model">my.task</field>
<field name="priority">1</field>
<field name="arch" type="xml">
<form>
[...]
<field name="message_ids" colspan="4" widget="mail_thread" nolabel="1"/>
</form>
</field>
</record>

Send notifications

When sending a notification is required in your workflow or business logic, use the message_post method. This method is a shortcut to the message_append method that takes all mail.message fields as arguments. This latter method calls message_create that

  • creates the message

  • parses the body to find users you want to push the message to (finding and parsing @login in the message body)

  • pushes a notification to users following the document and requested users of the latetr step

You should therefore not worry about subscriptions or anything else than sending the notification. Here is a small example of sending a notification when the do_something method is called :

def do_something(self, cr, uid, ids, context=None):
[...]
self.do_something_send_note(cr, uid, ids, context=context)
[...]
return res def do_something_send_note(self, cr, uid, ids, context=None):
self.message_post(cr, uid, ids, _('My subject'),
_("has received a <b>notification</b> and is happy for it."), context=context)

Notifications guidelines

Here are a few guidelines that you should keep in mind during the addition of system notifications :

  • avoid unnecessary content; if a message has no interest, do not implement it

  • use short sentences

  • do not include the document name, as it is managed by the thread widget

  • use a simple and clean style

    • html tags are supported: use <b> or <em> mainly

    • put main word(s) in bold

    • avoid fancy styles that will break the OpenERP look and feel

  • create a separate method for sending your notification

    • use a method name like original_method_name_send_note, that allow to easily spot notification methods in the code

Subscription management

There are a few default subscription tricks that you should know before playing with subscription:

  • users that click on 'follow' follow the document. An entry in mail.subscription is created.

  • users that click on 'unfollow' are no longer followers to the document. The related entry in mail.subscription is created.

  • users that create or update a document automatically follow it. An entry in mail.subscription is created.

If you want to override this default behavior, you should avoid doing it manualle. You should instead override the message_get_subscribers method from mail.thread. The default implementation looks in the mail.suscription table for entries matching user_id=uid, res_model=self._name, res_id=current_record_id. You can add subscribers by overriding the message_get_subscribers and adding user ids to the returned list. This means that they will be considered as followers even if they do not have an entry in the mail.subscription table.

As an exemple, let us say that you want to automatically add the my_task responsible along with the project manager to the list of followers. The method could look like:

def message_get_subscribers(self, cr, uid, ids, context=None):
# get the followers from the mail.subscription table
sub_ids = self.message_get_subscribers_ids(cr, uid, ids, context=context);
# add the employee and its manager if specified to the subscribed users
for obj in self.browse(cr, uid, ids, context=context):
if obj.user_id:
sub_ids.append(obj.user_id)
if obj.project_id and obj.project_id.user_id:
sub_ids.append(obj.project_id.user_id)
return self.pool.get('res.users').read(cr, uid, sub_ids, context=context)

This method has the advantage of being able to implement a particular behavior with as few code addition as possible. Moreover, when changing the task responsible of the project manager, the subscribers are always correct. This allows to avoid to implement complex corner cases that could obfuscate the code.

The drawback of this method is that it is no longer possible to those subscribers to unfollow a document. Indeed, as user ids are added directly in a list in message_get_subscribers, it is not possible to unsubscribe to a document. However, this drawback is mitigated by

  • only important users shoudl be added using this method. Important users should not unsubscribe from their documents.

  • users can hide the notifications on their Wall

Messages display management

By default, the mail_thread widget shows all messages related to the current document beside the document, in the History and comments section. However, you may want to display other messages in the widget. For example, the OpenChatter on res.users model shows

  • messages related to the user, as usual (messages with model = res.users, res_id = current_document_id)

  • messages directly pushed to this user (containing @login)

The best way to direct the messages that will be displayed in the OpenChatter widget is to override the message_load method. For example, the following method fetches messages as usual, but also fetches messages linked to the task project that contain the task name. Please refer to the API for more details about the arguments.

def message_load(self, cr, uid, ids, limit=100, offset=0, domain=[], ascent=False, root_ids=[False], context=None):
msg_obj = self.pool.get('mail.message')
for my_task in self.browse(cr, uid, ids, context=context):
# search as usual messages related to the current document
msg_ids += msg_obj.search(cr, uid, ['|', '&', ('res_id', '=', my_task.id), ('model', '=', self._name),
# add: search in the current task project messages
'&', '&', ('res_id', '=', my_task.project_id.id), ('model', '=', 'project.project'),
# ... containing the task name
'|', ('body', 'like', '%s' % (my_task.name)), ('body_html', 'like', '%s' % (my_task.name))
] + domain, limit=limit, offset=offset, context=context)
# if asked: add ancestor ids to have complete threads
if (ascent): msg_ids = self._message_add_ancestor_ids(cr, uid, ids, msg_ids, root_ids, context=context)
return msg_obj.read(cr, uid, msg_ids, context=context)

How to use OpenChatter in my addon的更多相关文章

  1. NodeJS Addon 多线程

    Mac版本客户端准备使用electron实现,需要对现有的C API的IM SDK 做NodeJS封装,提供Javascript接口. 使用Nan,遇到的问题主要是NodeJS是libuv defal ...

  2. nginx安装过程,报错处理:make[1]: *** [objs/addon/src/bson.o] Error 1

    nginx安装过程中,经常会有各种错误: 具体安装步骤这里不做说明,网上一搜大把: 主要分析安装过程中遇到的问题 在make编译的时候,若报如下错误: cc1: warnings being trea ...

  3. SAP B1 ADDON 开发

    承接各类SAP B1 ADDON 开发. 有需要,请联系.

  4. Ogre Addon之Paged Geometry

    还是OGRE好啊,无尽的Addon,无尽的宝藏.既有SkyX,Hydrx这样的天空水体渲染库可供学习,还有Paged Geometry这样的“大规模海量geometry管理系统”.它通过batch,s ...

  5. 使用 ADD-ON SDK 开发 基于 Html JQuery 和 CSS 的 firefox 插件入门教程1: 创建一个简单的 Add-on

    [本文转载自http://sixpoint.me/942/implementing-simple-addon/] 实现一个简单的插件 教程的这个部分带你使用 SDK 来实现, 运行并打包一个插件. 这 ...

  6. 如何使用Add-on SDK开发一个自己的火狐扩展

    黄聪:如何使用Add-on SDK开发一个自己的火狐扩展 火狐开放了扩展的开发权限给程序员们,相信很多人都会希望自己做一些扩展来方便一些使用. 我最近做一些项目也需要开发一个火狐扩展,方便收集自己需要 ...

  7. odoo10 addon开发流程

    odoo addon开发流程 创建一个addon(插件) 命令如下 python odoo-bin scaffold 插件名 路径 # 例如 python odoo-bin scaffold hh_t ...

  8. NodeJS Addon 多线程通信

    某个产品的Mac客户端计划基于electron实现,因为现有SDK有C API,原理上用NodeJS Addon来封装成JS API就可使用了.但涉及到与Addon多线程交互,翻找资料没能找到到底该怎 ...

  9. cPanel中添加设置附加域(Addon domain)

    本文介绍cPanel设置附加域(addon domain)来实现一个空间做多个网站的方法. 附加域(addon domain) 作用:通过它可以实现添加 新的顶级域名绑定到主机,从而创建新的站点.例如 ...

随机推荐

  1. CentOS6.5和RedHat6.5下以rpm方式安装mysql-5.6.20

    转帖;http://blog.csdn.net/mw08091020/article/details/39234207 a.检查下linux是不是已经安装了mysql rpm -qa | grep - ...

  2. Xcode GDB 调试

    关于GDB 对于大多数Cocoa程序员来说,最常用的debugger莫过于Xcode自带的调试工具了.而实际上,它正是gdb的一个图形化包装.相对于gdb,图形化带来了很多便利,但同时也缺少了一些重要 ...

  3. 【docker】关于docker中挂载的解释

    现在有这么一个命令: docker run -p 33061:3306 --name mysql --restart=always -e MYSQL_ROOT_PASSWORD=pisen -v /e ...

  4. Android Gradle Plugin指南(五)——Build Variants(构建变种版本号)

    原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 6. Build Vari ...

  5. pytest文档21-pytest-html报告优化(nodeid中文显示[\u6350\u52a9\u6211\u4eec]问题解决)

    前言 pytest-html报告中当用到参数化时候,获取用例的nodeid里面有中文时候,会显示[\u6350\u52a9\u6211\u4eec]这种编码(再次声明,这个不叫乱码,这是unicode ...

  6. iOS抽屉效果

    源代码下载 抽屉效果第三方类库下载 所需第三方类库下载 側拉栏抽屉效果图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTUhUaW9z/font/5a6L ...

  7. FFmpeg的H264编码有内存泄漏吗??!!!

    靠,内存泄漏好严重.开始怀疑是自己代码问题,调试了半天,又反复改写和优化代码,还是泄漏严重. 拿网上现成的FFMPEG H264编码的范例来测试,同样泄漏很严重. 百度了一下,有很多人遇到同样的问题, ...

  8. OpenShift上部署Redis主从集群

    客户有部署有状态服务的需求,单机部署模式相对简单,尝试一下集群部署. 关于Redis的master,slave 以及sentinal的架构和作用不提,有兴趣可以参考之前的博客 https://www. ...

  9. 简明python教程 --C++程序员的视角(七):异常

    当你的程序中出现某些 异常的 状况的时候,异常就发生了.例如,当你想要读某个文件的时候,而那个文件不存在.或者在程序运行的时候,你不小心把它删除了.上述这些情况可以使用异常来处理. 假如你的程序中有一 ...

  10. 比起 JSON 更方便、更快速、更簡短的 Protobuf 格式

    Protocol Buffers 是由 Google 所推出的一格式(後台真硬),你可以把它想像成是 XML 或 JSON 格式,但是更小.更快,而且更簡潔.這能夠幫你節省網路與硬體資源,且你只需要定 ...