odoo14 mail.thread邮件消息机制(发送消息、字段变化跟踪记录)mail.activity.mixin安排活动

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/ 

class ApprovalFlow(models.Model): _name = 'approval.flow' _description = u'审批流程' def _compute_domain(self): all_cls = inspect.getmembers(sys.modules[__name__], inspect.isclass) odoo_cls = [getattr(cls[1], '_name') for cls in all_cls if cls[1].__bases__[0].__name__ == 'Model'] # 排除当前的对象 odoo_cls += [model.model for model in self.env['ir.model'].search([('transient', '=', True)])] # 排除临时对象 return [('model', 'not in', odoo_cls)] name = fields.Char(u'名称') model_id = fields.Many2one('ir.model', u'模型', domain=_compute_domain, index=1) model_name = fields.Char(related="model_id.model", string='模型名称') condition = fields.Char(u'条件', help=u'请遵循odoo的domain的写法,如:[("field_name", "=", value)]',store=True) class RokedispatchordermanagementPriceApprove(models.Model): _name = 'roke.dispatch.order.management.price.approve' _inherit = ['mail.thread', 'mail.activity.mixin'] _description = "派船单应付审核" _rec_name = "code" order_id = fields.Many2one('roke.dispatch.order.management', string='派船单', ondelete='cascade') code = fields.Char(string='单据编号', store=True, related='order_id.code') class Rokedispatchordermanagement(models.Model): _name = 'roke.dispatch.order.management' _inherit = ['mail.thread', 'mail.activity.mixin'] _description = "派船单" _rec_name = "code" client = fields.Many2one('roke.partner', string='客户', tracking=True, required=True,) department_manager = fields.Many2one('res.users', string='创建人', tracking=True, default=lambda self: self.env.user.id) box_number = fields.Char(string='箱号') shipping_companies = fields.Char(string='船公司') field_station = fields.Char(string='场站') ship_name_voyage = fields.Char(string='船名航次') port_of_discharge = fields.Char(string='卸货港') box_type = fields.Many2one('roke.box.type', string='箱型') code = fields.Char(string='单据编号', track_visibility='onchange') 派传单应付审核表提交审核在审批流程的条件里面有记录同时如果选择完成之后不能删除派船单这条审批通过的不能删除要重新写删除方法怎么写
06-10
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值