From d966b5136873e6cc8d1e23de97b51742979a8f8d Mon Sep 17 00:00:00 2001 From: Aitor Bouzas Date: Wed, 10 Oct 2018 10:37:35 +0200 Subject: [PATCH] [MIG] web_notify: Migration to 12.0 Add self-test buttons in demo environment, Updated readme to show how to test it. Add buttons to users form Do not rely on SUPERUSER_ID and avoid getattr usage --- web_notify/README.rst | 103 ++-- web_notify/__init__.py | 2 + web_notify/__manifest__.py | 10 +- web_notify/models/__init__.py | 2 + web_notify/models/res_users.py | 16 +- web_notify/readme/CONTRIBUTORS.rst | 3 + web_notify/readme/DESCRIPTION.rst | 7 + web_notify/readme/INSTALL.rst | 1 + web_notify/readme/USAGE.rst | 23 + web_notify/static/description/index.html | 455 ++++++++++++++++++ .../description/test_notifications_demo.png | Bin 0 -> 60893 bytes web_notify/static/src/js/web_client.js | 19 +- web_notify/tests/__init__.py | 2 + web_notify/tests/test_res_users.py | 6 +- web_notify/views/res_users_demo.xml | 30 ++ web_notify/views/web_notify.xml | 12 +- 16 files changed, 622 insertions(+), 69 deletions(-) create mode 100644 web_notify/readme/CONTRIBUTORS.rst create mode 100644 web_notify/readme/DESCRIPTION.rst create mode 100644 web_notify/readme/INSTALL.rst create mode 100644 web_notify/readme/USAGE.rst create mode 100644 web_notify/static/description/index.html create mode 100644 web_notify/static/description/test_notifications_demo.png create mode 100644 web_notify/views/res_users_demo.xml diff --git a/web_notify/README.rst b/web_notify/README.rst index 2fa24871b..243dc229f 100644 --- a/web_notify/README.rst +++ b/web_notify/README.rst @@ -1,11 +1,30 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 - ========== Web Notify ========== +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/12.0/web_notify + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-12-0/web-12-0-web_notify + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/162/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + Send instant notification messages to the user in live. This technical module allows you to send instant notification messages from the server to the user in live. @@ -14,68 +33,82 @@ Two kinds of notification are supported. * Warning: Displayed in a red flying popup div * Information: Displayed in a light yellow flying popup div -To send a notification to the user you just need to call one of the new methods defined on res.users: +**Table of contents** -.. code-block:: python - - self.env.user.notify_info('My information message') - -or - -.. code-block:: python - - self.env.user.notify_warning('My marning message') - -.. figure:: static/description/notifications_screenshot.png - :scale: 80 % - :alt: Sample notifications +.. contents:: + :local: Installation ============ This module is based on the Instant Messaging Bus. To work properly, the server must be launched in gevent mode. - Usage ===== -.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas - :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/162/10.0 + +To send a notification to the user you just need to call one of the new methods defined on res.users: + +.. code-block:: python + + self.env.user.notify_info(message='My information message') + +or + +.. code-block:: python + + self.env.user.notify_warning(message='My marning message') + +.. figure:: static/description/notifications_screenshot.png + :scale: 80 % + :alt: Sample notifications + +You can test the behaviour of the notifications by installing this module in a demo database. + Click in your user logo in the top right corner of the screen then click "Preferences". + +.. figure:: static/description/test_notifications_demo.png + :scale: 80 % + :alt: Sample notifications Bug Tracker =========== -Bugs are tracked on `GitHub Issues -`_. In case of trouble, please -check there if your issue has already been reported. If you spotted it first, -help us smashing it by providing a detailed and welcomed feedback. +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. Credits ======= -Images ------- +Authors +~~~~~~~ -* Odoo Community Association: `Icon `_. +* ACSONE SA/NV +* AdaptiveCity Contributors ------------- +~~~~~~~~~~~~ * Laurent Mignon * Serpent Consulting Services Pvt. Ltd. +* Aitor Bouzas -Maintainer ----------- +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. .. image:: https://odoo-community.org/logo.png :alt: Odoo Community Association :target: https://odoo-community.org -This module is maintained by the OCA. - OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -To contribute to this module, please visit https://odoo-community.org. +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_notify/__init__.py b/web_notify/__init__.py index 0650744f6..31660d6a9 100644 --- a/web_notify/__init__.py +++ b/web_notify/__init__.py @@ -1 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + from . import models diff --git a/web_notify/__manifest__.py b/web_notify/__manifest__.py index 0ad8d42fd..0643b87d8 100644 --- a/web_notify/__manifest__.py +++ b/web_notify/__manifest__.py @@ -5,19 +5,23 @@ 'name': 'Web Notify', 'summary': """ Send notification messages to user""", - 'version': '11.0.1.1.0', + 'version': '12.0.1.0.0', 'description': 'Web Notify', 'license': 'AGPL-3', - 'author': 'ACSONE SA/NV,Odoo Community Association (OCA)', - 'website': 'https://acsone.eu/', + 'author': 'ACSONE SA/NV,' + 'AdaptiveCity,' + 'Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/web', 'depends': [ 'web', 'bus', + 'base', ], 'data': [ 'views/web_notify.xml' ], 'demo': [ + 'views/res_users_demo.xml' ], 'installable': True, } diff --git a/web_notify/models/__init__.py b/web_notify/models/__init__.py index 883516533..c39e40a15 100644 --- a/web_notify/models/__init__.py +++ b/web_notify/models/__init__.py @@ -1 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + from . import res_users diff --git a/web_notify/models/res_users.py b/web_notify/models/res_users.py index 25f650845..9e1f2f040 100644 --- a/web_notify/models/res_users.py +++ b/web_notify/models/res_users.py @@ -1,14 +1,12 @@ # Copyright 2016 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import api, exceptions, fields, models, _, SUPERUSER_ID +from odoo import api, exceptions, fields, models, _ class ResUsers(models.Model): - _inherit = 'res.users' - @api.multi @api.depends('create_date') def _compute_channel_names(self): for record in self: @@ -21,21 +19,19 @@ class ResUsers(models.Model): notify_warning_channel_name = fields.Char( compute='_compute_channel_names') - @api.multi - def notify_info(self, message, title=None, sticky=False): + def notify_info(self, message="Default message", title=None, sticky=False): title = title or _('Information') self._notify_channel( 'notify_info_channel_name', message, title, sticky) - @api.multi - def notify_warning(self, message, title=None, sticky=False): + def notify_warning(self, message="Default message", + title=None, sticky=False): title = title or _('Warning') self._notify_channel( 'notify_warning_channel_name', message, title, sticky) - @api.multi def _notify_channel(self, channel_name_field, message, title, sticky): - if (self.env.uid != SUPERUSER_ID + if (not self.env.user._is_admin() and any(user.id != self.env.uid for user in self)): raise exceptions.UserError( _('Sending a notification to another user is forbidden.') @@ -45,6 +41,6 @@ class ResUsers(models.Model): 'title': title, 'sticky': sticky } - notifications = [(getattr(record, channel_name_field), bus_message) + notifications = [(record[channel_name_field], bus_message) for record in self] self.env['bus.bus'].sendmany(notifications) diff --git a/web_notify/readme/CONTRIBUTORS.rst b/web_notify/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..70f99b045 --- /dev/null +++ b/web_notify/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* Laurent Mignon +* Serpent Consulting Services Pvt. Ltd. +* Aitor Bouzas \ No newline at end of file diff --git a/web_notify/readme/DESCRIPTION.rst b/web_notify/readme/DESCRIPTION.rst new file mode 100644 index 000000000..7d7528a3b --- /dev/null +++ b/web_notify/readme/DESCRIPTION.rst @@ -0,0 +1,7 @@ +Send instant notification messages to the user in live. + +This technical module allows you to send instant notification messages from the server to the user in live. +Two kinds of notification are supported. + +* Warning: Displayed in a red flying popup div +* Information: Displayed in a light yellow flying popup div \ No newline at end of file diff --git a/web_notify/readme/INSTALL.rst b/web_notify/readme/INSTALL.rst new file mode 100644 index 000000000..a27ef8949 --- /dev/null +++ b/web_notify/readme/INSTALL.rst @@ -0,0 +1 @@ +This module is based on the Instant Messaging Bus. To work properly, the server must be launched in gevent mode. \ No newline at end of file diff --git a/web_notify/readme/USAGE.rst b/web_notify/readme/USAGE.rst new file mode 100644 index 000000000..3570a4860 --- /dev/null +++ b/web_notify/readme/USAGE.rst @@ -0,0 +1,23 @@ + +To send a notification to the user you just need to call one of the new methods defined on res.users: + +.. code-block:: python + + self.env.user.notify_info(message='My information message') + +or + +.. code-block:: python + + self.env.user.notify_warning(message='My marning message') + +.. figure:: static/description/notifications_screenshot.png + :scale: 80 % + :alt: Sample notifications + +You can test the behaviour of the notifications by installing this module in a demo database. + Click in your user logo in the top right corner of the screen then click "Preferences". + +.. figure:: static/description/test_notifications_demo.png + :scale: 80 % + :alt: Sample notifications diff --git a/web_notify/static/description/index.html b/web_notify/static/description/index.html new file mode 100644 index 000000000..26f951bd3 --- /dev/null +++ b/web_notify/static/description/index.html @@ -0,0 +1,455 @@ + + + + + + +Web Notify + + + +
+

Web Notify

+ + +

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runbot

+

Send instant notification messages to the user in live.

+

This technical module allows you to send instant notification messages from the server to the user in live. +Two kinds of notification are supported.

+
    +
  • Warning: Displayed in a red flying popup div
  • +
  • Information: Displayed in a light yellow flying popup div
  • +
+

Table of contents

+ +
+

Installation

+

This module is based on the Instant Messaging Bus. To work properly, the server must be launched in gevent mode.

+
+
+

Usage

+

To send a notification to the user you just need to call one of the new methods defined on res.users:

+
+self.env.user.notify_info(message='My information message')
+
+

or

+
+self.env.user.notify_warning(message='My marning message')
+
+
+Sample notifications +
+
+
You can test the behaviour of the notifications by installing this module in a demo database.
+
Click in your user logo in the top right corner of the screen then click “Preferences”.
+
+
+Sample notifications +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
  • AdaptiveCity
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/web project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/web_notify/static/description/test_notifications_demo.png b/web_notify/static/description/test_notifications_demo.png new file mode 100644 index 0000000000000000000000000000000000000000..fb2e4c3cc41019d043ea4f6c3e0b48b7ef595d20 GIT binary patch literal 60893 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 literal 0 HcmV?d00001 diff --git a/web_notify/static/src/js/web_client.js b/web_notify/static/src/js/web_client.js index 739251c87..c9b0139f4 100644 --- a/web_notify/static/src/js/web_client.js +++ b/web_notify/static/src/js/web_client.js @@ -2,8 +2,9 @@ odoo.define('web_notify.WebClient', function (require) { "use strict"; var WebClient = require('web.WebClient'); -var base_bus = require('bus.bus'); +var base_bus = require('bus.Longpolling'); var session = require('web.session'); +require('bus.BusService'); WebClient.include({ @@ -15,10 +16,10 @@ WebClient.include({ start_polling: function() { this.channel_warning = 'notify_warning_' + session.uid; this.channel_info = 'notify_info_' + session.uid; - base_bus.bus.add_channel(this.channel_warning); - base_bus.bus.add_channel(this.channel_info); - base_bus.bus.on('notification', this, this.bus_notification); - base_bus.bus.start_polling(); + this.call('bus_service', 'addChannel', this.channel_warning); + this.call('bus_service', 'addChannel', this.channel_info); + this.call('bus_service', 'on', 'notification', this, this.bus_notification); + this.call('bus_service', 'startPolling'); }, bus_notification: function(notifications) { var self = this; @@ -33,14 +34,10 @@ WebClient.include({ }); }, on_message_warning: function(message){ - if(this.notification_manager) { - this.notification_manager.do_warn(message.title, message.message, message.sticky); - } + this.do_warn(message.title, message.message, message.sticky); }, on_message_info: function(message){ - if(this.notification_manager) { - this.notification_manager.do_notify(message.title, message.message, message.sticky); - } + this.do_notify(message.title, message.message, message.sticky); } }); diff --git a/web_notify/tests/__init__.py b/web_notify/tests/__init__.py index 03c963d72..f759b968b 100644 --- a/web_notify/tests/__init__.py +++ b/web_notify/tests/__init__.py @@ -1 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + from . import test_res_users diff --git a/web_notify/tests/test_res_users.py b/web_notify/tests/test_res_users.py index 2f336a277..80a1a937f 100644 --- a/web_notify/tests/test_res_users.py +++ b/web_notify/tests/test_res_users.py @@ -43,7 +43,7 @@ class TestResUsers(common.TransactionCase): ) as mockedSendMany: users = self.env.user.search([(1, "=", 1)]) self.assertTrue(len(users) > 1) - users.notify_warning('message') + users.notify_warning(message='message') self.assertEqual(1, mockedSendMany.call_count) @@ -61,8 +61,8 @@ class TestResUsers(common.TransactionCase): other_user = self.env.ref('base.user_demo') other_user_model = self.env['res.users'].sudo(other_user) with self.assertRaises(exceptions.UserError): - other_user_model.browse(self.env.uid).notify_info('hello') + other_user_model.browse(self.env.uid).notify_info(message='hello') def test_notify_admin_allowed_other_user(self): other_user = self.env.ref('base.user_demo') - other_user.notify_info('hello') + other_user.notify_info(message='hello') diff --git a/web_notify/views/res_users_demo.xml b/web_notify/views/res_users_demo.xml new file mode 100644 index 000000000..4ca9f4222 --- /dev/null +++ b/web_notify/views/res_users_demo.xml @@ -0,0 +1,30 @@ + + + + + res.users.form.simple.view.modif.inherit + res.users + + + + + + +