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')
注意:
- mail模型有一個強大的字段跟蹤系統,可將對應值的變化記錄到討論系統中。
- 為了對字段進行監聽,只需要將
track_visibility
屬性設置為onchange
(當字段值改變時展示在通知中) 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