最近在开发一个项目管理系统,客户希望某些字段在改变的时候记录下这个字段的改变信息。这时候就可以使用Odoo的消息通知机制。
官方文档:https://www.odoo.com/documentation/10.0/reference/mixins.html#logging-changes
一、引入消息模型
__manifest__.py 文件增加依赖关系
'depends': ['base', 'mail']
class Modle(models.Model):
_name = "demo"
_inherit = ['mail.thread']
在form中增加消息显示代码
<form>
....
省略一串代码
....
<div class="oe_chatter">
<field name="message_follower_ids"
widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
二、定义追踪属性
在模块引入了消息机制模型后,track_visibility属性即可使用,它支持如下两种写法。
- track_visibility='always'
- track_visibility='onchange'
定义字段改变显示的内容
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="True">
<!-- mail-->
<record id="mt_state_change" model="mail.message.subtype">
<field name="name">confirmed</field>
<field name="res_model">demo</field>
<field name="default" eval="True"/>
<field name="description">项目状态变更为正式立项!</field>
</record>
</data>
</odoo>
class Modle(models.Model):
_name = "demo"
_inherit = ['mail.thread']
state = fields.Selection(selection=[('draft', 'Draft'), ('confirmed', 'Confirmed'), ], default='draft', track_visibility='onchange')
name = fields.Char(string="IP name", required=True, track_visibility='always')
# 重写该方法,在合适的条件下调用前面声明的消息内容
def _track_subtype(self, init_values):
self.ensure_one()
if 'state' in init_values and self.state == 'confirmed':
return 'project_manager.mt_state_change'
return super(Modle, self)._track_subtype(init_values)
文章评论
你好,我最近也在做一个消息推送,我遇到了一些问题,不知道你有没有遇到,就是:
我做了一个企业微信推送,然后我扩展了原生的_message_track_get_changes方法,实现了跟踪值的推送,但是也带来一些问题。我在应用到销售订单的时候,老是会推送之前的成功网上付款(我配置了网站的支付宝)的订单,老是推送我发现是因为有个定时任务一直在执行_cron_post_process_after_done这个函数导致的,我查了一大圈都没有找到症结点在哪里,不知道你有没有遇过这个问题。
@Faix 最好不要重写change这类的事件来触发动作,因为它会重复触发。