diff options
| author | Sébastien Theys <seb@odoo.com> | 2020-06-25 10:12:17 +0000 |
|---|---|---|
| committer | Sébastien Theys <seb@odoo.com> | 2020-06-25 12:54:26 +0000 |
| commit | 6da8fac5f46a0040fe8185e83a3f6a4a3c653464 (patch) | |
| tree | ead63ef392215221f4eb6a1431a6e3660bc390b6 | |
| parent | 7ab957d7b07e53d23872351919bf91de3a340d97 (diff) | |
[FIX] mail_bot: fix OdooBot not starting
- fix initializer start override (typo in method name)
- properly wrap async code in models
- disable OdooBot for System user
- use existing python method to create chat
task-2284584
closes odoo/odoo#53669
X-original-commit: 47bbfeab9e238ab542d16bf4ed17d60ad6aea50d
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
5 files changed, 93 insertions, 18 deletions
diff --git a/addons/mail_bot/data/mailbot_data.xml b/addons/mail_bot/data/mailbot_data.xml index 20233fd7310..4dbec8cf6c3 100644 --- a/addons/mail_bot/data/mailbot_data.xml +++ b/addons/mail_bot/data/mailbot_data.xml @@ -6,5 +6,9 @@ <field name="email">odoobot@example.com</field> <field name="image_1920" type="base64" file="mail/static/src/img/odoobot.png"/> </record> + + <record id="base.user_root" model="res.users"> + <field name="odoobot_state">disabled</field> + </record> </data> </odoo> diff --git a/addons/mail_bot/models/mail_channel.py b/addons/mail_bot/models/mail_channel.py index 6abccc8b426..a5e9a60a528 100644 --- a/addons/mail_bot/models/mail_channel.py +++ b/addons/mail_bot/models/mail_channel.py @@ -14,15 +14,9 @@ class Channel(models.Model): @api.model def init_odoobot(self): if self.env.user.odoobot_state in [False, 'not_initialized']: - partner = self.env.user.partner_id odoobot_id = self.env['ir.model.data'].xmlid_to_res_id("base.partner_root") - channel = self.with_context(mail_create_nosubscribe=True).create({ - 'channel_partner_ids': [(4, partner.id), (4, odoobot_id)], - 'public': 'private', - 'channel_type': 'chat', - 'email_send': False, - 'name': 'OdooBot' - }) + channel_info = self.channel_get([odoobot_id]) + channel = self.browse(channel_info['id']) message = _("Hello,<br/>Odoo's chat helps employees collaborate efficiently. I'm here to help you discover its features.<br/><b>Try to send me an emoji</b> <span class=\"o_odoobot_command\">:)</span>") channel.sudo().message_post(body=message, author_id=odoobot_id, message_type="comment", subtype_xmlid="mail.mt_comment") self.env.user.odoobot_state = 'onboarding_emoji' diff --git a/addons/mail_bot/static/src/models/messaging_initializer/messaging_initializer.js b/addons/mail_bot/static/src/models/messaging_initializer/messaging_initializer.js index 05ee8196b2c..4118b5228ef 100644 --- a/addons/mail_bot/static/src/models/messaging_initializer/messaging_initializer.js +++ b/addons/mail_bot/static/src/models/messaging_initializer/messaging_initializer.js @@ -11,23 +11,28 @@ registerInstancePatchModel('mail.messaging_initializer', 'mail_bot/static/src/mo /** * @private */ - _showOdoobotTimeout() { - setTimeout(() => { - this.env.session.odoobot_initialized = true; - this.env.services.rpc({ - model: 'mail.channel', - method: 'init_odoobot', - }); - }, 2 * 60 * 1000); + async _initializeOdooBot() { + await this.async(() => new Promise(resolve => + this.env.browser.setTimeout(resolve, 2 * 60 * 1000) + )); + const data = await this.async(() => this.env.services.rpc({ + model: 'mail.channel', + method: 'init_odoobot', + })); + if (!data) { + return; + } + this.env.session.odoobot_initialized = true; }, + /** * @override */ - async _start() { + async start() { await this.async(() => this._super()); if ('odoobot_initialized' in this.env.session && !this.env.session.odoobot_initialized) { - this._showOdoobotTimeout(); + this._initializeOdooBot(); } }, }); diff --git a/addons/mail_bot/static/src/models/messaging_initializer/messaging_initializer_tests.js b/addons/mail_bot/static/src/models/messaging_initializer/messaging_initializer_tests.js new file mode 100644 index 00000000000..ac54efa2a39 --- /dev/null +++ b/addons/mail_bot/static/src/models/messaging_initializer/messaging_initializer_tests.js @@ -0,0 +1,71 @@ +odoo.define('mail_bot/static/src/models/messaging_initializer/messaging_initializer_tests.js', function (require) { +"use strict"; + +const { + afterEach: utilsAfterEach, + beforeEach: utilsBeforeEach, + start: utilsStart, +} = require('mail/static/src/utils/test_utils.js'); + +QUnit.module('mail_bot', {}, function () { +QUnit.module('models', {}, function () { +QUnit.module('messaging_initializer', {}, function () { +QUnit.module('messaging_initializer_tests.js', { + beforeEach() { + utilsBeforeEach(this); + + this.start = async params => { + let { env, widget } = await utilsStart(Object.assign({}, params, { + data: this.data, + })); + this.env = env; + this.widget = widget; + }; + }, + afterEach() { + if (this.widget) { + this.widget.destroy(); + } + this.env = undefined; + utilsAfterEach(this); + }, +}); + + +QUnit.test('OdooBot initialized after 2 minutes', async function (assert) { + assert.expect(3); + + await this.start({ + env: { + session: { + odoobot_initialized: false, + }, + }, + hasTimeControl: true, + async mockRPC(route, args) { + if (args.method === 'init_odoobot') { + assert.step('init_odoobot'); + return; + } + return this._super(...arguments); + }, + }); + + await this.env.testUtils.advanceTime(119 * 1000); + assert.verifySteps( + [], + "should not have initialized OdooBot after 1 minute 59 seconds" + ); + + await this.env.testUtils.advanceTime(1 * 1000); + assert.verifySteps( + ['init_odoobot'], + "should have initialized OdooBot after 2 minutes" + ); +}); + +}); +}); +}); + +}); diff --git a/addons/mail_bot/views/assets.xml b/addons/mail_bot/views/assets.xml index bf10b4c458b..512ffebd6e0 100644 --- a/addons/mail_bot/views/assets.xml +++ b/addons/mail_bot/views/assets.xml @@ -23,6 +23,7 @@ <xpath expr="." position="inside"> <script type="text/javascript" src="/mail_bot/static/src/bugfix/bugfix_tests.js"></script> <script type="text/javascript" src="/mail_bot/static/src/components/messaging_menu/messaging_menu_tests.js"></script> + <script type="text/javascript" src="/mail_bot/static/src/models/messaging_initializer/messaging_initializer_tests.js"></script> <script type="text/javascript" src="/mail_bot/static/src/widgets/notification_alert/notification_alert_tests.js"></script> </xpath> </template> |
