odoo14里面的消息机制

odoo里面 字段追踪、消息通知机制:

 一、使用方式:1、在定义模型的py文件里继承mail模型

class DemoModle(models.Model):
    """ 模型名称 """
    _name = 'demo.model'    # 定义 模型名(类名)   必写
    _rec_name = 'name'           # 定义 模型引用时 显示的默认字段  非必写
    _description = 'demo model'  # 定义数据库中的表名  非必写
    _inherit = ['mail.thread', 'mail.activity.mixin']  # 集成消息模型 增加消息记录通知功能

一、 odoo14里是:tracking=True
     user_id = fields.Many2one('res.users', string='Salesperson', index=True, tracking=True)

add_follow_ids = fields.Many2many('hr.employee',string=u'关注者')


二、 odoo12里面是:track_visibility
     inout = fields.Selection(string="InOut", selection=[('Import', '进口'), ('Export', '出口'), ], track_visibility='always',)
contract_num = fields.Char(string="Contract Num", track_visibility='onchange')

注意:

  1. mail模型有一个强大的字段跟踪系统,可将对应值的变化记录到讨论系统中。
  2. 为了对字段进行监听,只需要将track_visibility 属性设置为onchange(当字段值改变时展示在通知中)
  3. always(该值总是会被显示在通知中,一般用于让通知内容更好理解)

def btn_add_follow(self):

"""自动添加关注者"""
partner_ids= []
for employee in self.add_follow_ids:
if employee.user_id.partner_id:
partner_ids.append(employee.user_id.partner_id.id)
self.message_subscribe(partner_ids=partner_ids )


"""自定义发消息:在form表单下面显示的那一种"""
p_ids= []
for line in self.message_follower_ids:
p_ids.append(line.partner_id.id)
self.message_post(body='%s-%s测试消息发给关注者' % (self.name,self.create_uid.name),
subject = '邮件主题:', partner_ids = p_ids)



添加 follower

从业务逻辑角度来看还有一个有意思的功能:可以向文档添加 follower,这样他们可以获取相应的通知。我们有以下几种方法来添加 follower:

  • message_subscribe(partner_ids=<整型 id 列表>)添加伙伴
  • message_subscribe(channel_ids=<整型 id 列表>) 添加频道
  • message_subscribe_users(user_ids=<整型 id 列表>) 添加用户
 

二、在form表达添加

<form>
   ....
   ....
    <div class="oe_chatter">
        <field name="message_follower_ids" widget="mail_followers"/>
        <field name="activity_ids" widget="mail_activity"/>
        <field name="message_ids" widget="mail_thread"/>
    </div>
</form>

根据自己需要自定义获取变化字段的值:

   def write(self,values):
        t_record = self.get_simple_variable_attr(values)
        otm_t_record = self.get_otm_variable_attr(values)
        return super(ZimoProductPreview,self).write(values)

    def get_simple_variable_attr(self,values):
        """监控修改的值:组成字典{}
           针对:many2one、char、text、float
           one2many字段的监控:可根据需要自定义编写逻辑
           原来存在的记录,未修改 [4,开始:  [4, 4, False]:
           原来存在的记录,已修改 [1,开头:  [1, 21, {'price': 44, 'product_description': '的房产税'}]
           新增记录,[0,开始:  [0, 'virtual_689', {'product_id': 4, 'price': 456, 'product_description': '大碗面', 'note': False}]

        """
        simple_track_value= []
        tracked_fields=self._get_tracked_fields()
        for k, v in values.items():
            if k in tracked_fields:
                field_vals=self.fields_get(k)
                old_fd_value = self[k]
                new_fd_value = v
                if field_vals[k]['type'] == 'many2one':
                    new_fd_value = self.env[field_vals[k]['relation']].browse(v).name
                    old_fd_value = self[k].name
                simple_track_value.append({
                    'fiele_name':field_vals[k]['string'],
                    'old_value':old_fd_value,
                    'new_value': new_fd_value
                })
        return simple_track_value

    def get_otm_variable_attr(self,values):
        """监控修改的值:组成字典{}
           one2many字段的监控:可根据需要自定义编写逻辑
           原来存在的记录,未修改 [4,开始:  [4, 4, False]:
           原来存在的记录,已修改 [1,开头:  [1, 21, {'price': 44, 'product_description': '的房产税'}]
           新增记录,[0,开始:  [0, 'virtual_689', {'product_id': 4, 'price': 456, 'product_description': '大碗面', 'note': False}]

        """
        otm_track_value=[]
        # 暂时监控修改的字段
        new_product_value=values.get('product_line_ids')
        line_obj=self.env['zimo.product.preview.order.line']
        if new_product_value:
            for line in new_product_value:
                print (line)
                if line[0] in [1,'1']:
                    record=line_obj.browse(line[1])
                    line_values=[]
                    for k,v in line[2].items():
                        field_vals=record.fields_get(k)
                        old_fd_value=record[k]
                        new_fd_value=v
                        if field_vals[k]['type']=='many2one':
                           new_fd_value=self.env[field_vals[k]['relation']].browse(v).name
                           old_fd_value = record[k].name
                        line_values.append({
                            'fiele_name':field_vals[k]['string'],
                            'old_value':old_fd_value,
                            'new_value': new_fd_value,
                        })
                    otm_track_value.append(line_values)
        return otm_track_value
心有猛虎,细嗅蔷薇
原文地址:https://www.cnblogs.com/1314520xh/p/14646061.html