diff --git a/web_notify/models/res_users.py b/web_notify/models/res_users.py index 800380d2..f4738036 100644 --- a/web_notify/models/res_users.py +++ b/web_notify/models/res_users.py @@ -2,31 +2,45 @@ # Copyright 2016 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp import api, models, _ +from openerp import api, fields, models, _ class ResUsers(models.Model): _inherit = 'res.users' + @api.multi + @api.depends('create_date') + def _compute_channel_names(self): + for record in self: + res_id = record.id + record.notify_info_channel_name = 'notify_info_%s' % res_id + record.notify_warning_channel_name = 'notify_warning_%s' % res_id + + notify_info_channel_name = fields.Char( + compute='_compute_channel_names', store=True, required=True) + notify_warning_channel_name = fields.Char( + compute='_compute_channel_names', store=True, requried=True) + @api.multi def notify_info(self, message, title=None, sticky=False): title = title or _('Information') - self._notify_channel('notify_info', message, title, sticky) + self._notify_channel( + 'notify_info_channel_name', message, title, sticky) @api.multi def notify_warning(self, message, title=None, sticky=False): title = title or _('Warning') - self._notify_channel('notify_warning', message, title, sticky) + self._notify_channel( + 'notify_warning_channel_name', message, title, sticky) @api.multi - def _notify_channel(self, channel_name_prefix, message, title, sticky): - notification = { + def _notify_channel(self, channel_name_field, message, title, sticky): + bus_message = { 'message': message, 'title': title, 'sticky': sticky } - bus_bus = self.env['bus.bus'] - for record in self: - channel_name = channel_name_prefix + "_%s" % record.id - bus_bus.sendone(channel_name, notification) + notifications = [(getattr(record, channel_name_field), bus_message) + for record in self] + self.env['bus.bus'].sendmany(notifications) diff --git a/web_notify/tests/__init__.py b/web_notify/tests/__init__.py new file mode 100644 index 00000000..03c963d7 --- /dev/null +++ b/web_notify/tests/__init__.py @@ -0,0 +1 @@ +from . import test_res_users diff --git a/web_notify/tests/test_res_users.py b/web_notify/tests/test_res_users.py new file mode 100644 index 00000000..f6751fed --- /dev/null +++ b/web_notify/tests/test_res_users.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp.tests import common +from openerp.addons.bus.models.bus import json_dump +import mock + + +class TestResUsers(common.TransactionCase): + + def test_notify_info(self): + bus_bus = self.env['bus.bus'] + domain = [ + ('channel', '=', + json_dump(self.env.user.notify_info_channel_name)) + ] + existing = bus_bus.search(domain) + self.env.user.notify_info( + message='message', title='title', sticky=True) + news = bus_bus.search(domain) - existing + self.assertEqual(1, len(news)) + self.assertEqual( + '{"message":"message","sticky":true,"title":"title"}', + news.message) + + def test_notify_warning(self): + bus_bus = self.env['bus.bus'] + domain = [ + ('channel', '=', + json_dump(self.env.user.notify_warning_channel_name)) + ] + existing = bus_bus.search(domain) + self.env.user.notify_warning( + message='message', title='title', sticky=True) + news = bus_bus.search(domain) - existing + self.assertEqual(1, len(news)) + self.assertEqual( + '{"message":"message","sticky":true,"title":"title"}', + news.message) + + def test_notify_many(self): + # check that the notification of a list of users is done with + # a single call to the bus + with mock.patch('openerp.addons.bus.models.bus.ImBus.sendmany' + ) as mockedSendMany: + users = self.env.user.search([(1, "=", 1)]) + self.assertTrue(len(users) > 1) + users.notify_warning('message') + self.assertEqual(1, mockedSendMany.call_count) + self.assertEqual(len(users), len(mockedSendMany.call_args))