zoukankan      html  css  js  c++  java
  • 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
    心有猛虎,细嗅蔷薇
  • 相关阅读:
    TortoiseSVN 实现文件的移动
    CSS选择器
    聚合报告90%参数说明
    JMeter响应断言详解
    测试结果分析
    Selenium+TestNG+Java报错:org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:40)
    在IntelliJ IDEA通过Maven添加依赖无效
    CentOS下安装TestLink
    Mysql存储过程生成指定格式的订单号
    Mysql使用函数生成指定随机字段内容
  • 原文地址:https://www.cnblogs.com/1314520xh/p/14646061.html
Copyright © 2011-2022 走看看