From 6155509df8574ae4367ec82fb08b5e7f518d825d Mon Sep 17 00:00:00 2001 From: Dajuayen Date: Fri, 2 Nov 2018 10:38:21 +0100 Subject: [PATCH 1/6] [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 00000000..21cd7854 --- /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 00000000..0650744f --- /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 00000000..8d0f015a --- /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 00000000..caf9c18d --- /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 00000000..9e55c034 --- /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 00000000..4cb41cd7 --- /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 00000000..e18a28ea --- /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 00000000..99d1c555 --- /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 00000000..82a85485 --- /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 00000000..d3be65a6 --- /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 00000000..5fee3e7d --- /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 00000000..a87cb6e9 --- /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 00000000..ac91c51a --- /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 00000000..1db9fb3a --- /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 00000000..b16cbb78 --- /dev/null +++ b/mail_activity_board/views/templates.xml @@ -0,0 +1,8 @@ + + + + From c86a5748c9b36d2effde50bae07332a51ce454a9 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 2 Nov 2018 09:38:29 +0000 Subject: [PATCH 2/6] [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 21cd7854..f7e73119 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 00000000..c1d37a24 --- /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 c5b0d0669ed2e4bb5b45653940e0a256324f1eb1 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Fri, 2 Nov 2018 09:47:08 +0000 Subject: [PATCH 3/6] [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 00000000..fe105192 --- /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 fd6e37867a79aa43f5c235c0820a2e08a0e0a552 Mon Sep 17 00:00:00 2001 From: mreficent Date: Fri, 30 Nov 2018 13:21:01 +0100 Subject: [PATCH 4/6] [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 8d0f015a..d747c81a 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 9e55c034..dfc96df8 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 @@ class MailActivity(models.Model): 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 ac91c51a..aa23da90 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 @@ class TestMailActivityBoardMethods(TransactionCase): '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 @@ class TestMailActivityBoardMethods(TransactionCase): # 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 @@ class TestMailActivityBoardMethods(TransactionCase): '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 @@ class TestMailActivityBoardMethods(TransactionCase): kwargs = { 'groupby': [ "activity_type_id" - ] + ], } kwargs['domain'] = action.get('domain') @@ -130,7 +160,13 @@ class TestMailActivityBoardMethods(TransactionCase): 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 70b5a761015505f0c71622287624e3a95804fead Mon Sep 17 00:00:00 2001 From: mreficent Date: Mon, 3 Dec 2018 11:58:09 +0100 Subject: [PATCH 5/6] [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 f7e73119..b1c9f804 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 d747c81a..a13100d5 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 dfc96df8..817acde5 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 @@ class MailActivity(models.Model): @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 4cb41cd7..788c3328 100644 --- a/mail_activity_board/models/mail_activity_mixin.py +++ b/mail_activity_board/models/mail_activity_mixin.py @@ -20,7 +20,7 @@ class MailActivityMixin(models.AbstractModel): :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 @@ class MailActivityMixin(models.AbstractModel): 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 e18a28ea..f2a8d5ed 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 z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N 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 c1d37a24..0d435ec9 100644 --- a/mail_activity_board/static/description/index.html +++ b/mail_activity_board/static/description/index.html @@ -367,7 +367,7 @@ ul.auto-toc { !! 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 @@ which shows the activities related to the opportunity.

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 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

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 1db9fb3a..29c69109 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 b16cbb78..54182edb 100644 --- a/mail_activity_board/views/templates.xml +++ b/mail_activity_board/views/templates.xml @@ -1,8 +1,8 @@