关于 @ 和 # 字符串触发器在 Odoo Chatter 中如何工作的问题?

Question on How @ and # String Trigger Works in Odoo Chatter?

希望你们一切顺利,

我很好奇 @# 等特定字符串如何触发 Odoo Chatter & Discuss 中用户和频道的弹出窗口。此聊天有 mail.thread 个与之相关的模型,但我似乎无法理解如何在聊天中创建我自己的自定义触发器?

它是否属于某些视图而不属于模型? 任何帮助将不胜感激!

还有另一种方法,那就是使用 / 或“命令”弹出窗口。您可以在弹出列表中添加自己的项目,并在用户从弹出列表中选择您的项目时触发任何操作。

  1. 继承自mail.channel
class MailChannel(models.Model):
    _inherit = 'mail.channel'
  1. 添加一个以 _define_command_XXXXX 开头的新方法。这会在弹出窗口中注册项目。
def _define_command_sample(self):
    return {'help': _('Here is some sample help')}
  1. 添加一个以 _execute_command_XXXXX 开头的新方法。当用户使用你的命令时执行此方法。
def _execute_command_sample(self, **kwargs):
    # Send a "temporary" message to the user
    self._send_transient_message(self.env.user.partner_id, f"Hello! You just successfully used the /sample command. You typed {kwargs['body']}.")

参考:Github 其中 Odoo 定义了 /lead 命令

PS:以上为Odoo V12.0 - V14.0。 Odoo V15.0 的工作方式略有不同,但您可以查看 this and this 了解具体操作方法。

这些是 suggestion delimiters 用于更新建议列表的模型。

const suggestionDelimiters = ['@', ':', '#', '/'];

例如@用于获取合作伙伴(mail.partner model) matching a given search term. The _updateSuggestionList function will search the suggestions, sort them then will show (update)弹出列表

要添加新的自定义触发器,您需要将分隔符添加到 suggestionDelimiters list and alter the _computeSuggestionModelName function to return the related model, the model must be defined like the mail.partner 模型。

如果要修补现有模型,请检查以下示例(取自 hr 模块):

/** @odoo-module **/

import {
    registerInstancePatchModel,
    registerFieldPatchModel,
} from '@mail/model/model_core';
import { attr, one2one } from '@mail/model/model_field';


// Patch model
registerInstancePatchModel('mail.partner', 'hr/static/src/models/partner/partner.js', {

    async checkIsEmployee() {
        await this.async(() => this.messaging.models['hr.employee'].performRpcSearchRead({
            context: { active_test: false },
            domain: [['user_partner_id', '=', this.id]],
            fields: ['user_id', 'user_partner_id'],
        }));
        this.update({ hasCheckedEmployee: true });
    },

});

// Patch fields
registerFieldPatchModel('mail.partner', 'hr/static/src/models/partner/partner.js', {

    hasCheckedEmployee: attr({
        default: false,
    }),

});