From a05dd4fda2857c24416608f8c5496a3a3e324307 Mon Sep 17 00:00:00 2001 From: Dajuayen Date: Fri, 2 Nov 2018 10:38:21 +0100 Subject: [PATCH 01/38] [ADD][mail_activity_board] Add new module that insert activities board in boards. (#283) * [ADD] Module that insert activities board. * [FIX] Author error in __manifest__ file and style changes. * [FIX] Fix replace in view, rename files and style changes. * [FIX] Enumerated list ends without a blank line; unexpected unindent. * [FIX] Name fail. * [FIX] Bug in view. * [FIX] Add button Activities in mail.thread and readme folder. Others improvements in style of code. * [FIX] Type 'tree' not found in registry: problem solved. * [FIX] Dependence change: 'mail' for 'calendar'. * [FIX] Eliminated unnecessary imports. * [FIX] Bugs about js and if/else. * [FIX] Improvements following guide lines and eliminating unnecessary attributes in views. * [ADD] Added counter in the 'Activities List' button. * [FIX] Bugs in javascript with 'Activities' button. * [ADD] Tests folder. * [FIX] Deleted references to modules not installed. * [FIX] Formatting javascript. * [FIX] Bug: added a soft line before a class. * [FIX] Bug: https://github.com/OCA/social/pull/283#discussion_r204302325 * [FIX] Escaping 'lt' in xml file. Bug: https://github.com/OCA/social/pull/283#discussion_r204302325 * [FIX] The meeting attendees are shown in kanban mode on the meeting board. * [FIX] Hide in form view of the activity board the assistant field if the activity is not a meeting type or if there are no assistants. * [FIX] Change to default kanban view for partners. --- mail_activity_board/README.rst | 21 ++ mail_activity_board/__init__.py | 1 + mail_activity_board/__manifest__.py | 24 ++ mail_activity_board/models/__init__.py | 2 + mail_activity_board/models/mail_activity.py | 45 ++++ .../models/mail_activity_mixin.py | 32 +++ mail_activity_board/readme/CONTRIBUTORS.rst | 3 + mail_activity_board/readme/DESCRIPTION.rst | 2 + mail_activity_board/readme/USAGE.rst | 9 + .../static/src/js/override_chatter.js | 33 +++ .../static/src/xml/inherit_chatter.xml | 13 ++ mail_activity_board/tests/__init__.py | 1 + .../tests/test_mail_activity_board.py | 136 ++++++++++++ .../views/mail_activity_view.xml | 210 ++++++++++++++++++ mail_activity_board/views/templates.xml | 8 + 15 files changed, 540 insertions(+) create mode 100644 mail_activity_board/README.rst create mode 100644 mail_activity_board/__init__.py create mode 100644 mail_activity_board/__manifest__.py create mode 100644 mail_activity_board/models/__init__.py create mode 100644 mail_activity_board/models/mail_activity.py create mode 100644 mail_activity_board/models/mail_activity_mixin.py create mode 100644 mail_activity_board/readme/CONTRIBUTORS.rst create mode 100644 mail_activity_board/readme/DESCRIPTION.rst create mode 100644 mail_activity_board/readme/USAGE.rst create mode 100644 mail_activity_board/static/src/js/override_chatter.js create mode 100644 mail_activity_board/static/src/xml/inherit_chatter.xml create mode 100644 mail_activity_board/tests/__init__.py create mode 100644 mail_activity_board/tests/test_mail_activity_board.py create mode 100644 mail_activity_board/views/mail_activity_view.xml create mode 100644 mail_activity_board/views/templates.xml diff --git a/mail_activity_board/README.rst b/mail_activity_board/README.rst new file mode 100644 index 0000000000..21cd7854d5 --- /dev/null +++ b/mail_activity_board/README.rst @@ -0,0 +1,21 @@ +**This file is going to be generated by oca-gen-addon-readme.** + +*Manual changes will be overwritten.* + +Please provide content in the ``readme`` directory: + +* **DESCRIPTION.rst** (required) +* INSTALL.rst (optional) +* CONFIGURE.rst (optional) +* **USAGE.rst** (optional, highly recommended) +* DEVELOP.rst (optional) +* ROADMAP.rst (optional) +* HISTORY.rst (optional, recommended) +* **CONTRIBUTORS.rst** (optional, highly recommended) +* CREDITS.rst (optional) + +Content of this README will also be drawn from the addon manifest, +from keys such as name, authors, maintainers, development_status, +and license. + +A good, one sentence summary in the manifest is also highly recommended. diff --git a/mail_activity_board/__init__.py b/mail_activity_board/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/mail_activity_board/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/mail_activity_board/__manifest__.py b/mail_activity_board/__manifest__.py new file mode 100644 index 0000000000..8d0f015a79 --- /dev/null +++ b/mail_activity_board/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2018 David Juaneda - +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + 'name': 'Activities board', + 'summary': 'Add Activity Boards', + 'version': '11.0.1.0.0', + 'development_status': 'Beta', + 'category': 'Social Network', + 'website': 'https://github.com/OCA/social', + 'author': 'SDi, David Juaneda, Odoo Community Association (OCA)', + 'license': 'AGPL-3', + 'installable': True, + 'depends': [ + 'calendar', + 'board', + ], + 'data': [ + 'views/templates.xml', + 'views/mail_activity_view.xml', + ], + 'qweb': [ + 'static/src/xml/inherit_chatter.xml', + ] +} diff --git a/mail_activity_board/models/__init__.py b/mail_activity_board/models/__init__.py new file mode 100644 index 0000000000..caf9c18d40 --- /dev/null +++ b/mail_activity_board/models/__init__.py @@ -0,0 +1,2 @@ +from . import mail_activity +from . import mail_activity_mixin diff --git a/mail_activity_board/models/mail_activity.py b/mail_activity_board/models/mail_activity.py new file mode 100644 index 0000000000..9e55c03495 --- /dev/null +++ b/mail_activity_board/models/mail_activity.py @@ -0,0 +1,45 @@ +# Copyright 2018 David Juaneda - +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import api, models, fields + + +class MailActivity(models.Model): + _inherit = "mail.activity" + + res_model_id_name = fields.Char( + related='res_model_id.name', string="Origin", + readonly=True) + duration = fields.Float( + related='calendar_event_id.duration', readonly=True) + calendar_event_id_start = fields.Datetime( + related='calendar_event_id.start', readonly=True) + calendar_event_id_partner_ids = fields.Many2many( + related='calendar_event_id.partner_ids', + readonly=True) + + @api.multi + def open_origin(self): + self.ensure_one() + vid = self.env[self.res_model].browse(self.res_id).get_formview_id() + response = { + 'type': 'ir.actions.act_window', + 'res_model': self.res_model, + 'view_mode': 'form', + 'res_id': self.res_id, + 'target': 'current', + 'flags': { + 'form': { + 'action_buttons': False + } + }, + 'views': [ + (vid, "form") + ] + } + return response + + @api.model + def action_activities_board(self): + action = self.env.ref( + 'mail_activity_board.open_boards_activities').read()[0] + return action diff --git a/mail_activity_board/models/mail_activity_mixin.py b/mail_activity_board/models/mail_activity_mixin.py new file mode 100644 index 0000000000..4cb41cd73b --- /dev/null +++ b/mail_activity_board/models/mail_activity_mixin.py @@ -0,0 +1,32 @@ +# Copyright 2018 David Juaneda - +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import models + + +class MailActivityMixin(models.AbstractModel): + _inherit = 'mail.activity.mixin' + + def redirect_to_activities(self, **kwargs): + """Redirects to the list of activities of the object shown. + + Redirects to the activity board and configures the domain so that + only those activities that are related to the object shown are + displayed. + + Add to the title of the view the name the class of the object from + which the activities will be displayed. + + :param kwargs: contains the id of the object and the model it's about. + + :return: action. + """ + id = kwargs.get("id") + action = self.env['mail.activity'].action_activities_board() + views = [] + for v in action['views']: + if v[1] == 'tree': + v = (v[0], 'list') + views.append(v) + action['views'] = views + action['domain'] = [('res_id', '=', id)] + return action diff --git a/mail_activity_board/readme/CONTRIBUTORS.rst b/mail_activity_board/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..e18a28eab7 --- /dev/null +++ b/mail_activity_board/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `SDI `_: + + * David Juaneda diff --git a/mail_activity_board/readme/DESCRIPTION.rst b/mail_activity_board/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..99d1c555f4 --- /dev/null +++ b/mail_activity_board/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module adds an activity board with form, tree, kanban, calendar, pivot, graph and search views. + diff --git a/mail_activity_board/readme/USAGE.rst b/mail_activity_board/readme/USAGE.rst new file mode 100644 index 0000000000..82a854851a --- /dev/null +++ b/mail_activity_board/readme/USAGE.rst @@ -0,0 +1,9 @@ +To use this module, you need to: + +#. Access to the views from menu Boards. + +A smartButton of activities is added in the mail thread from form view. +From this smartButton is linked to the activity board, to the view tree, +which shows the activities related to the opportunity. + +From the form view of the activity you can navigate to the origin of the activity. diff --git a/mail_activity_board/static/src/js/override_chatter.js b/mail_activity_board/static/src/js/override_chatter.js new file mode 100644 index 0000000000..d3be65a64a --- /dev/null +++ b/mail_activity_board/static/src/js/override_chatter.js @@ -0,0 +1,33 @@ +/* Copyright 2018 David Juaneda + * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ +odoo.define('mail.Chatter.activity', function (require) { + "use strict"; + + var chatter = require('mail.Chatter'); + + chatter.include({ + + events: _.extend({}, chatter.prototype.events, { + 'click .o_chatter_button_list_activity': '_onListActivity', + }), + + /** + * Performs the action to redirect to the activities of the object. + * + * @private + */ + _onListActivity: function () { + this._rpc({ + model: this.record.model, + method: 'redirect_to_activities', + args: [[]], + kwargs: { + 'id':this.record.res_id, + 'model':this.record.model, + }, + context: this.record.getContext(), + }).then($.proxy(this, "do_action")); + }, + + }); +}); diff --git a/mail_activity_board/static/src/xml/inherit_chatter.xml b/mail_activity_board/static/src/xml/inherit_chatter.xml new file mode 100644 index 0000000000..5fee3e7dcb --- /dev/null +++ b/mail_activity_board/static/src/xml/inherit_chatter.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/mail_activity_board/tests/__init__.py b/mail_activity_board/tests/__init__.py new file mode 100644 index 0000000000..a87cb6e974 --- /dev/null +++ b/mail_activity_board/tests/__init__.py @@ -0,0 +1 @@ +from . import test_mail_activity_board diff --git a/mail_activity_board/tests/test_mail_activity_board.py b/mail_activity_board/tests/test_mail_activity_board.py new file mode 100644 index 0000000000..ac91c51ac6 --- /dev/null +++ b/mail_activity_board/tests/test_mail_activity_board.py @@ -0,0 +1,136 @@ +# Copyright 2018 David Juaneda - +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo.tests.common import TransactionCase + + +class TestMailActivityBoardMethods(TransactionCase): + + def setUp(self): + super(TestMailActivityBoardMethods, self).setUp() + # Set up activities + + # Create a user as 'Crm Salesman' and added few groups + self.employee = self.env['res.users'].create({ + 'company_id': self.env.ref("base.main_company").id, + 'name': "Employee", + 'login': "csu", + 'email': "crmuser@yourcompany.com", + 'groups_id': [(6, 0, [self.env.ref('base.group_user').id])] + }) + + # lead_model_id = self.env['ir.model']._get('crm.lead').id + partner_model_id = self.env['ir.model']._get('res.partner').id + + ActivityType = self.env['mail.activity.type'] + self.activity1 = ActivityType.create({ + 'name': 'Initial Contact', + 'days': 5, + 'summary': 'ACT 1 : Presentation, barbecue, ... ', + 'res_model_id': partner_model_id, + }) + self.activity2 = ActivityType.create({ + 'name': 'Call for Demo', + 'days': 6, + 'summary': 'ACT 2 : I want to show you my ERP !', + 'res_model_id': partner_model_id, + }) + self.activity3 = ActivityType.create({ + 'name': 'Celebrate the sale', + 'days': 3, + 'summary': 'ACT 3 : ' + 'Beers for everyone because I am a good salesman !', + 'res_model_id': partner_model_id, + }) + + # I create an opportunity, as employee + self.partner_client = self.env.ref("base.res_partner_1") + + self.act1 = self.env['mail.activity'].sudo().create({ + 'activity_type_id': self.activity3.id, + 'note': 'Partner activity 1.', + 'res_id': self.partner_client.id, + 'res_model_id': partner_model_id, + 'user_id': self.employee.id + }) + self.act2 = self.env['mail.activity'].sudo().create({ + 'activity_type_id': self.activity2.id, + 'note': 'Partner activity 2.', + 'res_id': self.partner_client.id, + 'res_model_id': partner_model_id, + 'user_id': self.employee.id + }) + self.act3 = self.env['mail.activity'].sudo().create({ + 'activity_type_id': self.activity3.id, + 'note': 'Partner activity 3.', + 'res_id': self.partner_client.id, + 'res_model_id': partner_model_id, + 'user_id': self.employee.id + }) + + def get_view(self, activity): + action = activity.open_origin() + result = self.env[action.get('res_model')]\ + .load_views(action.get('views')) + return result.get('fields_views').get(action.get('view_mode')) + + def test_open_origin_res_partner(self): + """ This test case checks + - If the method redirects to the form view of the correct one + of an object of the 'res.partner' class to which the activity + belongs. + """ + # Id of the form view for the class 'crm.lead', type 'lead' + form_view_partner_id = self.env.ref('base.view_partner_form').id + + # Id of the form view return open_origin() + view = self.get_view(self.act1) + + # Check the next view is correct + self.assertEqual(form_view_partner_id, view.get('view_id')) + + # Id of the form view return open_origin() + view = self.get_view(self.act2) + + # Check the next view is correct + self.assertEqual(form_view_partner_id, view.get('view_id')) + + # Id of the form view return open_origin() + view = self.get_view(self.act3) + + # Check the next view is correct + self.assertEqual(form_view_partner_id, view.get('view_id')) + + def test_redirect_to_activities(self): + """ This test case checks + - if the method returns the correct action, + - if the correct activities are shown. + """ + action_id = self.env.ref( + 'mail_activity_board.open_boards_activities').id + action = self.partner_client\ + .redirect_to_activities(**{'id': self.partner_client.id}) + self.assertEqual(action.get('id'), action_id) + + kwargs = { + 'groupby': [ + "activity_type_id" + ] + } + kwargs['domain'] = action.get('domain') + + result = self.env[action.get('res_model')]\ + .load_views(action.get('views')) + fields = result.get('fields_views').get('kanban').get('fields') + kwargs['fields'] = list(fields.keys()) + + result = self.env['mail.activity'].read_group(**kwargs) + + acts = [] + for group in result: + records = self.env['mail.activity'].search_read( + domain=group.get('__domain'), fields=kwargs['fields'] + ) + acts += [id.get('id') for id in records] + + for act in acts: + self.assertIn(act, self.partner_client.activity_ids.ids) diff --git a/mail_activity_board/views/mail_activity_view.xml b/mail_activity_board/views/mail_activity_view.xml new file mode 100644 index 0000000000..1db9fb3a7c --- /dev/null +++ b/mail_activity_board/views/mail_activity_view.xml @@ -0,0 +1,210 @@ + + + + + + + + mail.activity.boards.view.form + mail.activity + 30 + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + mail.activity.boards.view.tree + mail.activity + + + + + (date_deadline < current_date) + (date_deadline == current_date) + (date_deadline > current_date) + + + + + + + + + mail.activity.boards.view.kanban + mail.activity + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
+
+
+
+ + + + + mail.activity.boards.view.search + mail.activity + + + primary + + + + + + + + + + + + + + + + + + + + + + + + Activities + mail.activity + form + kanban,form + [] + {} + + + + + + + + +
diff --git a/mail_activity_board/views/templates.xml b/mail_activity_board/views/templates.xml new file mode 100644 index 0000000000..b16cbb7860 --- /dev/null +++ b/mail_activity_board/views/templates.xml @@ -0,0 +1,8 @@ + + + + From 37763cabcd007981f83fae398ed93cdbb7400d44 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 2 Nov 2018 09:38:29 +0000 Subject: [PATCH 02/38] [UPD] README.rst --- mail_activity_board/README.rst | 101 +++- .../static/description/index.html | 435 ++++++++++++++++++ 2 files changed, 520 insertions(+), 16 deletions(-) create mode 100644 mail_activity_board/static/description/index.html diff --git a/mail_activity_board/README.rst b/mail_activity_board/README.rst index 21cd7854d5..f7e731194b 100644 --- a/mail_activity_board/README.rst +++ b/mail_activity_board/README.rst @@ -1,21 +1,90 @@ -**This file is going to be generated by oca-gen-addon-readme.** +================ +Activities board +================ -*Manual changes will be overwritten.* +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -Please provide content in the ``readme`` directory: +.. |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%2Fsocial-lightgray.png?logo=github + :target: https://github.com/OCA/social/tree/11.0/mail_activity_board + :alt: OCA/social +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/social-11-0/social-11-0-mail_activity_board + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/205/11.0 + :alt: Try me on Runbot -* **DESCRIPTION.rst** (required) -* INSTALL.rst (optional) -* CONFIGURE.rst (optional) -* **USAGE.rst** (optional, highly recommended) -* DEVELOP.rst (optional) -* ROADMAP.rst (optional) -* HISTORY.rst (optional, recommended) -* **CONTRIBUTORS.rst** (optional, highly recommended) -* CREDITS.rst (optional) +|badge1| |badge2| |badge3| |badge4| |badge5| -Content of this README will also be drawn from the addon manifest, -from keys such as name, authors, maintainers, development_status, -and license. +This module adds an activity board with form, tree, kanban, calendar, pivot, graph and search views. -A good, one sentence summary in the manifest is also highly recommended. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +#. Access to the views from menu Boards. + +A smartButton of activities is added in the mail thread from form view. +From this smartButton is linked to the activity board, to the view tree, +which shows the activities related to the opportunity. + +From the form view of the activity you can navigate to the origin of the activity. + +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 +~~~~~~~ + +* SDi +* David Juaneda + +Contributors +~~~~~~~~~~~~ + +* `SDI `_: + + * David Juaneda + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +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/social `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/mail_activity_board/static/description/index.html b/mail_activity_board/static/description/index.html new file mode 100644 index 0000000000..c1d37a24c8 --- /dev/null +++ b/mail_activity_board/static/description/index.html @@ -0,0 +1,435 @@ + + + + + + +Activities board + + + +
+

Activities board

+ + +

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

+

This module adds an activity board with form, tree, kanban, calendar, pivot, graph and search views.

+

Table of contents

+ +
+

Usage

+

To use this module, you need to:

+
    +
  1. Access to the views from menu Boards.
  2. +
+

A smartButton of activities is added in the mail thread from form view. +From this smartButton is linked to the activity board, to the view tree, +which shows the activities related to the opportunity.

+

From the form view of the activity you can navigate to the origin of the activity.

+
+
+

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

+
    +
  • SDi
  • +
  • David Juaneda
  • +
+
+
+

Contributors

+
    +
  • SDI:
      +
    • David Juaneda
    • +
    +
  • +
+
+
+

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/social project on GitHub.

+

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

+
+
+
+ + From b12d7a31d91e8167c96977bd66ea7863cf507732 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Fri, 2 Nov 2018 09:47:08 +0000 Subject: [PATCH 03/38] [UPD] Update mail_activity_board.pot --- .../i18n/mail_activity_board.pot | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 mail_activity_board/i18n/mail_activity_board.pot diff --git a/mail_activity_board/i18n/mail_activity_board.pot b/mail_activity_board/i18n/mail_activity_board.pot new file mode 100644 index 0000000000..fe10519251 --- /dev/null +++ b/mail_activity_board/i18n/mail_activity_board.pot @@ -0,0 +1,113 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_activity_board +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: mail_activity_board +#: model:ir.ui.view,arch_db:mail_activity_board.mail_activity_view_search +msgid "Act. next 6 months" +msgstr "" + +#. module: mail_activity_board +#: model:ir.ui.view,arch_db:mail_activity_board.mail_activity_view_search +msgid "Act. next month" +msgstr "" + +#. module: mail_activity_board +#. openerp-web +#: code:addons/mail_activity_board/static/src/xml/inherit_chatter.xml:8 +#: model:ir.actions.act_window,name:mail_activity_board.open_boards_activities +#: model:ir.ui.menu,name:mail_activity_board.board_menu_activities +#, python-format +msgid "Activities" +msgstr "" + +#. module: mail_activity_board +#: model:ir.model,name:mail_activity_board.model_mail_activity +#: model:ir.ui.view,arch_db:mail_activity_board.mail_activity_view_form_board +msgid "Activity" +msgstr "" + +#. module: mail_activity_board +#: model:ir.ui.view,arch_db:mail_activity_board.mail_activity_view_form_board +msgid "Activity Form" +msgstr "" + +#. module: mail_activity_board +#: model:ir.model,name:mail_activity_board.model_mail_activity_mixin +msgid "Activity Mixin" +msgstr "" + +#. module: mail_activity_board +#: model:ir.model.fields,field_description:mail_activity_board.field_mail_activity_calendar_event_id_partner_ids +msgid "Attendees" +msgstr "" + +#. module: mail_activity_board +#: model:ir.model.fields,field_description:mail_activity_board.field_mail_activity_duration +msgid "Duration" +msgstr "" + +#. module: mail_activity_board +#: model:ir.ui.view,arch_db:mail_activity_board.mail_activity_view_form_board +msgid "Log a note..." +msgstr "" + +#. module: mail_activity_board +#: model:ir.model.fields,field_description:mail_activity_board.field_mail_activity_res_model_id_name +#: model:ir.ui.view,arch_db:mail_activity_board.mail_activity_view_search +msgid "Origin" +msgstr "" + +#. module: mail_activity_board +#. openerp-web +#: code:addons/mail_activity_board/static/src/xml/inherit_chatter.xml:7 +#, python-format +msgid "See activities list" +msgstr "" + +#. module: mail_activity_board +#: model:ir.ui.view,arch_db:mail_activity_board.mail_activity_view_search +msgid "Show activities scheduled for next 6 months." +msgstr "" + +#. module: mail_activity_board +#: model:ir.ui.view,arch_db:mail_activity_board.mail_activity_view_search +msgid "Show activities scheduled for next month." +msgstr "" + +#. module: mail_activity_board +#: model:ir.model.fields,field_description:mail_activity_board.field_mail_activity_calendar_event_id_start +msgid "Start" +msgstr "" + +#. module: mail_activity_board +#: model:ir.model.fields,help:mail_activity_board.field_mail_activity_calendar_event_id_start +msgid "Start date of an event, without time for full days events" +msgstr "" + +#. module: mail_activity_board +#: model:ir.ui.view,arch_db:mail_activity_board.mail_activity_view_form_board +msgid "Start meeting" +msgstr "" + +#. module: mail_activity_board +#: model:ir.ui.view,arch_db:mail_activity_board.mail_activity_view_search +msgid "User" +msgstr "" + +#. module: mail_activity_board +#: model:ir.ui.view,arch_db:mail_activity_board.mail_activity_view_form_board +msgid "e.g. Discuss proposal" +msgstr "" + From e62c39ebd023d2bdc363e0a191de35c6eb5abf19 Mon Sep 17 00:00:00 2001 From: mreficent Date: Fri, 30 Nov 2018 13:21:01 +0100 Subject: [PATCH 04/38] [IMP] mail_activity_board: filter activities by user read permissions --- mail_activity_board/__manifest__.py | 2 +- mail_activity_board/models/mail_activity.py | 63 ++++++++++++++++++- .../tests/test_mail_activity_board.py | 40 +++++++++++- 3 files changed, 101 insertions(+), 4 deletions(-) diff --git a/mail_activity_board/__manifest__.py b/mail_activity_board/__manifest__.py index 8d0f015a79..d747c81aad 100644 --- a/mail_activity_board/__manifest__.py +++ b/mail_activity_board/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'Activities board', 'summary': 'Add Activity Boards', - 'version': '11.0.1.0.0', + 'version': '11.0.1.0.1', 'development_status': 'Beta', 'category': 'Social Network', 'website': 'https://github.com/OCA/social', diff --git a/mail_activity_board/models/mail_activity.py b/mail_activity_board/models/mail_activity.py index 9e55c03495..dfc96df8bb 100644 --- a/mail_activity_board/models/mail_activity.py +++ b/mail_activity_board/models/mail_activity.py @@ -1,6 +1,6 @@ # Copyright 2018 David Juaneda - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import api, models, fields +from odoo import api, models, fields, SUPERUSER_ID class MailActivity(models.Model): @@ -43,3 +43,64 @@ def action_activities_board(self): action = self.env.ref( 'mail_activity_board.open_boards_activities').read()[0] return action + + @api.model + def _find_allowed_model_wise(self, doc_model, doc_dict): + doc_ids = list(doc_dict) + allowed_doc_ids = self.env[doc_model].with_context( + active_test=False).search([('id', 'in', doc_ids)]).ids + return set([message_id for allowed_doc_id in allowed_doc_ids + for message_id in doc_dict[allowed_doc_id]]) + + @api.model + def _find_allowed_doc_ids(self, model_ids): + IrModelAccess = self.env['ir.model.access'] + allowed_ids = set() + for doc_model, doc_dict in model_ids.items(): + if not IrModelAccess.check(doc_model, 'read', False): + continue + allowed_ids |= self._find_allowed_model_wise(doc_model, doc_dict) + return allowed_ids + + @api.model + def _search(self, args, offset=0, limit=None, order=None, count=False, + access_rights_uid=None): + # Rules do not apply to administrator + if self._uid == SUPERUSER_ID: + return super(MailActivity, self)._search( + args, offset=offset, limit=limit, order=order, + count=count, access_rights_uid=access_rights_uid) + + ids = super(MailActivity, self)._search( + args, offset=offset, limit=limit, order=order, + count=False, access_rights_uid=access_rights_uid) + if not ids and count: + return 0 + elif not ids: + return ids + + # check read access rights before checking the actual rules + super(MailActivity, self.sudo(access_rights_uid or self._uid)).\ + check_access_rights('read') + + model_ids = {} + + self._cr.execute(""" + SELECT DISTINCT a.id, im.id, im.model, a.res_id + FROM "%s" a + LEFT JOIN ir_model im ON im.id = a.res_model_id + WHERE a.id = ANY (%%(ids)s)""" % self._table, dict(ids=ids)) + for a_id, ir_model_id, model, model_id in self._cr.fetchall(): + model_ids.setdefault(model, {}).setdefault( + model_id, set()).add(a_id) + + allowed_ids = self._find_allowed_doc_ids(model_ids) + + final_ids = allowed_ids + + if count: + return len(final_ids) + else: + # re-construct a list based on ids, because set didn't keep order + id_list = [a_id for a_id in ids if a_id in final_ids] + return id_list diff --git a/mail_activity_board/tests/test_mail_activity_board.py b/mail_activity_board/tests/test_mail_activity_board.py index ac91c51ac6..aa23da90fc 100644 --- a/mail_activity_board/tests/test_mail_activity_board.py +++ b/mail_activity_board/tests/test_mail_activity_board.py @@ -18,6 +18,16 @@ def setUp(self): 'groups_id': [(6, 0, [self.env.ref('base.group_user').id])] }) + # Create a user who doesn't have access to anything except activities + mail_activity_group = self.create_mail_activity_group() + self.employee2 = self.env['res.users'].create({ + 'company_id': self.env.ref("base.main_company").id, + 'name': "Employee2", + 'login': "alien", + 'email': "alien@yourcompany.com", + 'groups_id': [(6, 0, [mail_activity_group.id])], + }) + # lead_model_id = self.env['ir.model']._get('crm.lead').id partner_model_id = self.env['ir.model']._get('res.partner').id @@ -45,6 +55,9 @@ def setUp(self): # I create an opportunity, as employee self.partner_client = self.env.ref("base.res_partner_1") + # assure there isn't any mail activity yet + self.env['mail.activity'].sudo().search([]).unlink() + self.act1 = self.env['mail.activity'].sudo().create({ 'activity_type_id': self.activity3.id, 'note': 'Partner activity 1.', @@ -67,6 +80,23 @@ def setUp(self): 'user_id': self.employee.id }) + def create_mail_activity_group(self): + manager_mail_activity_test_group = self.env['res.groups'].create({ + 'name': 'group_manager_mail_activity_test', + }) + mail_activity_model_id = self.env['ir.model'].sudo().search( + [('model', '=', 'mail.activity')], limit=1) + access = self.env['ir.model.access'].create({ + 'name': 'full_access_mail_activity', + 'model_id': mail_activity_model_id.id, + 'perm_read': True, + 'perm_write': True, + 'perm_create': True, + 'perm_unlink': True, + }) + access.group_id = manager_mail_activity_test_group + return manager_mail_activity_test_group + def get_view(self, activity): action = activity.open_origin() result = self.env[action.get('res_model')]\ @@ -114,7 +144,7 @@ def test_redirect_to_activities(self): kwargs = { 'groupby': [ "activity_type_id" - ] + ], } kwargs['domain'] = action.get('domain') @@ -130,7 +160,13 @@ def test_redirect_to_activities(self): records = self.env['mail.activity'].search_read( domain=group.get('__domain'), fields=kwargs['fields'] ) - acts += [id.get('id') for id in records] + acts += [record_id.get('id') for record_id in records] for act in acts: self.assertIn(act, self.partner_client.activity_ids.ids) + + def test_read_permissions(self): + search1 = self.env['mail.activity'].sudo(self.employee).search([]) + self.assertEqual(len(search1), 3) + search2 = self.env['mail.activity'].sudo(self.employee2).search([]) + self.assertEqual(len(search2), 0) From 90ab73c05757648061106d4d07cd59d74989d6ff Mon Sep 17 00:00:00 2001 From: mreficent Date: Mon, 3 Dec 2018 11:58:09 +0100 Subject: [PATCH 05/38] [MIG] mail_activity_board: Migration to 12.0 --- mail_activity_board/README.rst | 14 +++++++++----- mail_activity_board/__manifest__.py | 2 +- mail_activity_board/models/mail_activity.py | 5 +++-- .../models/mail_activity_mixin.py | 4 ++-- mail_activity_board/readme/CONTRIBUTORS.rst | 4 ++++ mail_activity_board/static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 6 +++--- mail_activity_board/views/mail_activity_view.xml | 10 +++++----- mail_activity_board/views/templates.xml | 4 ++-- 9 files changed, 29 insertions(+), 20 deletions(-) create mode 100644 mail_activity_board/static/description/icon.png diff --git a/mail_activity_board/README.rst b/mail_activity_board/README.rst index f7e731194b..b1c9f80432 100644 --- a/mail_activity_board/README.rst +++ b/mail_activity_board/README.rst @@ -14,13 +14,13 @@ Activities board :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsocial-lightgray.png?logo=github - :target: https://github.com/OCA/social/tree/11.0/mail_activity_board + :target: https://github.com/OCA/social/tree/12.0/mail_activity_board :alt: OCA/social .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/social-11-0/social-11-0-mail_activity_board + :target: https://translation.odoo-community.org/projects/social-12-0/social-12-0-mail_activity_board :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/205/11.0 + :target: https://runbot.odoo-community.org/runbot/205/12.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -52,7 +52,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -72,6 +72,10 @@ Contributors * David Juaneda +* `Eficent `_: + + * Miquel Raïch (miquel.raich@eficent.com) + Maintainers ~~~~~~~~~~~ @@ -85,6 +89,6 @@ 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/social `_ project on GitHub. +This module is part of the `OCA/social `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/mail_activity_board/__manifest__.py b/mail_activity_board/__manifest__.py index d747c81aad..a13100d50a 100644 --- a/mail_activity_board/__manifest__.py +++ b/mail_activity_board/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'Activities board', 'summary': 'Add Activity Boards', - 'version': '11.0.1.0.1', + 'version': '12.0.1.0.0', 'development_status': 'Beta', 'category': 'Social Network', 'website': 'https://github.com/OCA/social', diff --git a/mail_activity_board/models/mail_activity.py b/mail_activity_board/models/mail_activity.py index dfc96df8bb..817acde58c 100644 --- a/mail_activity_board/models/mail_activity.py +++ b/mail_activity_board/models/mail_activity.py @@ -1,4 +1,5 @@ # Copyright 2018 David Juaneda - +# Copyright 2018 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import api, models, fields, SUPERUSER_ID @@ -54,10 +55,10 @@ def _find_allowed_model_wise(self, doc_model, doc_dict): @api.model def _find_allowed_doc_ids(self, model_ids): - IrModelAccess = self.env['ir.model.access'] + ir_model_access_model = self.env['ir.model.access'] allowed_ids = set() for doc_model, doc_dict in model_ids.items(): - if not IrModelAccess.check(doc_model, 'read', False): + if not ir_model_access_model.check(doc_model, 'read', False): continue allowed_ids |= self._find_allowed_model_wise(doc_model, doc_dict) return allowed_ids diff --git a/mail_activity_board/models/mail_activity_mixin.py b/mail_activity_board/models/mail_activity_mixin.py index 4cb41cd73b..788c332830 100644 --- a/mail_activity_board/models/mail_activity_mixin.py +++ b/mail_activity_board/models/mail_activity_mixin.py @@ -20,7 +20,7 @@ def redirect_to_activities(self, **kwargs): :return: action. """ - id = kwargs.get("id") + _id = kwargs.get("id") action = self.env['mail.activity'].action_activities_board() views = [] for v in action['views']: @@ -28,5 +28,5 @@ def redirect_to_activities(self, **kwargs): v = (v[0], 'list') views.append(v) action['views'] = views - action['domain'] = [('res_id', '=', id)] + action['domain'] = [('res_id', '=', _id)] return action diff --git a/mail_activity_board/readme/CONTRIBUTORS.rst b/mail_activity_board/readme/CONTRIBUTORS.rst index e18a28eab7..f2a8d5ed10 100644 --- a/mail_activity_board/readme/CONTRIBUTORS.rst +++ b/mail_activity_board/readme/CONTRIBUTORS.rst @@ -1,3 +1,7 @@ * `SDI `_: * David Juaneda + +* `Eficent `_: + + * Miquel Raïch (miquel.raich@eficent.com) diff --git a/mail_activity_board/static/description/icon.png b/mail_activity_board/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/mail_activity_board/static/description/index.html b/mail_activity_board/static/description/index.html index c1d37a24c8..0d435ec9af 100644 --- a/mail_activity_board/static/description/index.html +++ b/mail_activity_board/static/description/index.html @@ -367,7 +367,7 @@

Activities board

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

This module adds an activity board with form, tree, kanban, calendar, pivot, graph and search views.

Table of contents

@@ -398,7 +398,7 @@

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.

+feedback.

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

@@ -426,7 +426,7 @@

Maintainers

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/social project on GitHub.

+

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

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

diff --git a/mail_activity_board/views/mail_activity_view.xml b/mail_activity_board/views/mail_activity_view.xml index 1db9fb3a7c..29c6910940 100644 --- a/mail_activity_board/views/mail_activity_view.xml +++ b/mail_activity_board/views/mail_activity_view.xml @@ -4,7 +4,6 @@ VIEWS --> - mail.activity.boards.view.form @@ -59,7 +58,7 @@ - + (date_deadline < current_date) (date_deadline == current_date) (date_deadline > current_date) @@ -131,7 +130,8 @@
+ t-att-title="record.user_id.value" + t-att-alt="record.user_id.value" width="24" height="24" class="oe_kanban_avatar"/>
@@ -167,8 +167,8 @@
- - + +
diff --git a/mail_activity_board/views/templates.xml b/mail_activity_board/views/templates.xml index b16cbb7860..54182edb7a 100644 --- a/mail_activity_board/views/templates.xml +++ b/mail_activity_board/views/templates.xml @@ -1,8 +1,8 @@