odoo内部的消息机制是十分便捷的,可以使用odoo 系统消息进行沟通,也可以通过odoo代发邮件进行沟通。
通过点击系统右上角的用户名,在弹出的下拉框中选择 ‘首选项‘ ,我们可以设置email选项:使用邮件处理 或 在Odoo内处理。这里我们选择在erp内使用
如果希望使用邮件处理消息 那么需要配置odoo 的邮件服务,可以参考这篇文章链接:
https://blog.csdn.net/Srekal/article/details/114824151
1.odoo里面字段追踪消息通知机制:
一、使用方式:1、在定义模型的py文件里继承mail.threadshix模型:
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')为了对字段进行监听,只需要将track_visibility 属性设置为onchange(当字段值改变时展示在通知中)
always(该值总是会被显示在通知中,一般用于让通知内容更好理解)
注意:One2many和Many2many字段不生效 具体原因可以查看odoo源码中odoo/addons/mail/models/mail_tracking_value.py 中45行create_tracking_values函数中的处理
如果想要实现记录Many2many字段,请参考我这篇文章: https://blog.csdn.net/weixin_44863237/article/details/124169556
二、在xml文件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>
效果:
2.odoo里面消息通知机制:
1.发送消息
message_post(self, body='', subject=None, message_type='notification', subtype=None, parent_id=False, attachments=None, content_subtype='html', **kwargs)
在一个会话列表中发布一条新消息,返回新的mail.message
ID
- body (str) - 消息内容,一般是原始html,会自动进行过滤
- message_type (str) - 与mail_message.type字段对应
- content_subtype (str) - 如果是
plaintext
(纯文本),会被转成html - parent_id (int) - 用于当在消息列表时以私信形式回复时使用,对应父级partner
- attachments (list(tuple(str,str))) - 使用(name,content)元组传送的附件列表,content是base64encode过的
- **kwargs - 其他的参数用于创建新mail.message记录
2.接收消息
1.message_new(msg_dict, custom_values=None)
当收到的消息不属于一个已存在的讨论列表时由message_process
调用
- msg_dict (dict) - 一个包含email内容和附件的映射表,具体看:message_process, mail.message.parse
- custom_values (dict) - 可选参数,附加的用于传递给记录创建的create()方法的字段,注意这里面的值可能会覆盖邮件里的内容。
2.message_update(msg_dict, update_vals=None)
当一个收到已存在的讨论列表的消息时由message_process
调用
- template_id - 用于渲染消息主体的模板id
- **kwargs - 用于创建mail.compose.message(继承自mail.message) wizzard的参数
3.关注者管理
1.message_subscribe(partner_ids=None, channel_ids=None, subtype_ids=None, force=True)
添加参与者
- partner_ids (list(int)) - 当前记录对应的订阅的伙伴id列表
- channel_ids (list(int)) - 订阅的渠道列表
- subtype_ids (list(int)) - 所订阅的子类,默认None
- force - 当值为true时会根据subtype来创建新关注关系(原关注关系会先删除)
返回:boolean 是否成功
2.message_subscribe_users(user_ids=None, subtype_ids=None)
将message_subscribe封装,只是用用户替代partner
- user_ids (list(int)) - 当前记录对应的订阅的用户id列表,如果是None订阅当前用户
- subtype_ids (list(int)) - 渠道或合作伙伴所订阅的子类id
3.message_unsubscribe(partner_ids=None, channel_ids=None)
将合作伙伴从记录的订阅列表移除
- partner_ids (list(int)) - 订阅该记录的伙伴id列表(官方是这样的,也许应该是取消订阅)
- channel_ids (list(int)) - 订阅该记录的渠道列表(官方是这样的,也许应该是取消订阅)
4.message_unsubscribe_users(user_ids=None)
封装message_unsubscribe,用user替代partner
- user_ids (list(int)) - 取消订阅的用户id列表,为空时用当前用户
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)
odoo活动日程安排
活动
是mail模块中的一部分,我们可通过继承mail.activity.mixin实现在chatter中选择性的启用该功能。与mail.thread模型类似,mail.activity.mixin也是抽象模型。
活动有不同的类型。默认我们可以创建诸如Email、Call、Meeting和To-Do。我们可以在Settings | Technical | Email | Activity Types添加新的活动类型。
如果你想实现代码自动关联活动,我们可以通过mail.activity.mixin模型中的activity_schedule()方法实现。如下:
@api.model
def create(self, vals_list):
res = super(PurchaseApplication, self).create(vals_list)
res.activity_schedule('mail.mail_activity_data_todo', summary='到期提醒', date_deadline=res.reminder_time1,
user_id=self.env.user.id)
return res
参考文章:https://www.cnblogs.com/1314520xh/p/14646061.html
https://www.jianshu.com/p/84c6518d7dbf
补充:oe_chatter类的作用及使用方式
https://en.ngasturi.id/2021/02/10/how-to-record-the-data-changes-in-odoo/