From 3a1feb6975af5442ea0e8874f51379869cf21ec8 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Wed, 8 Jul 2020 17:30:44 +0200 Subject: [PATCH 01/37] [11.0][ADD] filter_multi_user --- filter_multi_user/README.rst | 93 ++++ filter_multi_user/__init__.py | 1 + filter_multi_user/__manifest__.py | 21 + filter_multi_user/models/__init__.py | 1 + filter_multi_user/models/ir_filters.py | 27 ++ filter_multi_user/readme/CONFIGURE.rst | 8 + filter_multi_user/readme/CONTRIBUTORS.rst | 1 + filter_multi_user/readme/DESCRIPTION.rst | 1 + .../security/ir_filters_security.xml | 12 + .../static/description/index.html | 434 ++++++++++++++++++ filter_multi_user/tests/__init__.py | 1 + .../tests/test_filter_multi_user.py | 78 ++++ filter_multi_user/views/ir_filters_view.xml | 42 ++ 13 files changed, 720 insertions(+) create mode 100644 filter_multi_user/README.rst create mode 100644 filter_multi_user/__init__.py create mode 100644 filter_multi_user/__manifest__.py create mode 100644 filter_multi_user/models/__init__.py create mode 100644 filter_multi_user/models/ir_filters.py create mode 100644 filter_multi_user/readme/CONFIGURE.rst create mode 100644 filter_multi_user/readme/CONTRIBUTORS.rst create mode 100644 filter_multi_user/readme/DESCRIPTION.rst create mode 100644 filter_multi_user/security/ir_filters_security.xml create mode 100644 filter_multi_user/static/description/index.html create mode 100644 filter_multi_user/tests/__init__.py create mode 100644 filter_multi_user/tests/test_filter_multi_user.py create mode 100644 filter_multi_user/views/ir_filters_view.xml diff --git a/filter_multi_user/README.rst b/filter_multi_user/README.rst new file mode 100644 index 0000000000..02b6cc2e85 --- /dev/null +++ b/filter_multi_user/README.rst @@ -0,0 +1,93 @@ +================= +Filter Multi User +================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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%2Fserver--ux-lightgray.png?logo=github + :target: https://github.com/OCA/server-ux/tree/11.0/filter_multi_user + :alt: OCA/server-ux +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-ux-11-0/server-ux-11-0-filter_multi_user + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/250/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Allows to share user-defined filters among several users. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To share a filter among several users you need to: + +#. Go to *Settings > Technical > User Interface > User-defined Filters*. +#. Edit a filter and fill the field *Available for users* with the desired + users. +#. The selected users will find the filter available as any other custom filter + under favorites in the search panel. However only the owner will be able to + delete the filter. + +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 +~~~~~~~ + +* ForgeFlow + +Contributors +~~~~~~~~~~~~ + +* Lois Rilo + +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. + +.. |maintainer-LoisRForgeFlow| image:: https://github.com/LoisRForgeFlow.png?size=40px + :target: https://github.com/LoisRForgeFlow + :alt: LoisRForgeFlow + +Current `maintainer `__: + +|maintainer-LoisRForgeFlow| + +This module is part of the `OCA/server-ux `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/filter_multi_user/__init__.py b/filter_multi_user/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/filter_multi_user/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/filter_multi_user/__manifest__.py b/filter_multi_user/__manifest__.py new file mode 100644 index 0000000000..354f5af6c1 --- /dev/null +++ b/filter_multi_user/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright 2020 ForgeFlow S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Filter Multi User", + "summary": "Allows to share user-defined filters filters among several users.", + "version": "11.0.1.0.0", + "development_status": "Beta", + "maintainers": ['LoisRForgeFlow'], + "category": "Tools", + "website": "https://github.com/OCA/server-ux", + "author": "ForgeFlow, Odoo Community Association (OCA)", + "license": "AGPL-3", + "installable": True, + "depends": [ + "base", + ], + "data": [ + "security/ir_filters_security.xml", + "views/ir_filters_view.xml", + ], +} diff --git a/filter_multi_user/models/__init__.py b/filter_multi_user/models/__init__.py new file mode 100644 index 0000000000..4c520abbe4 --- /dev/null +++ b/filter_multi_user/models/__init__.py @@ -0,0 +1 @@ +from . import ir_filters diff --git a/filter_multi_user/models/ir_filters.py b/filter_multi_user/models/ir_filters.py new file mode 100644 index 0000000000..3aca7e472b --- /dev/null +++ b/filter_multi_user/models/ir_filters.py @@ -0,0 +1,27 @@ +# Copyright 2020 ForgeFlow S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class IrFilters(models.Model): + _inherit = "ir.filters" + + user_ids = fields.Many2many( + comodel_name="res.users", + string="Users", + ) + + @api.model + def get_filters(self, model, action_id=None): + # WARNING: this function overrides the standard one. + # The only change done is in the domain used to search the filters. + action_domain = self._get_action_domain(action_id) + filters = self.search(action_domain + [ + ('model_id', '=', model), + '|', ('user_id', 'in', [self._uid, False]), + ('user_ids', 'in', self._uid), + ]) + user_context = self.env['res.users'].context_get() + return filters.with_context(user_context).read( + ['name', 'is_default', 'domain', 'context', 'user_id', 'sort']) diff --git a/filter_multi_user/readme/CONFIGURE.rst b/filter_multi_user/readme/CONFIGURE.rst new file mode 100644 index 0000000000..fec8c1cde8 --- /dev/null +++ b/filter_multi_user/readme/CONFIGURE.rst @@ -0,0 +1,8 @@ +To share a filter among several users you need to: + +#. Go to *Settings > Technical > User Interface > User-defined Filters*. +#. Edit a filter and fill the field *Available for users* with the desired + users. +#. The selected users will find the filter available as any other custom filter + under favorites in the search panel. However only the owner will be able to + delete the filter. diff --git a/filter_multi_user/readme/CONTRIBUTORS.rst b/filter_multi_user/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..77dfbe89e9 --- /dev/null +++ b/filter_multi_user/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Lois Rilo diff --git a/filter_multi_user/readme/DESCRIPTION.rst b/filter_multi_user/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..cf4b5b22a5 --- /dev/null +++ b/filter_multi_user/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Allows to share user-defined filters among several users. diff --git a/filter_multi_user/security/ir_filters_security.xml b/filter_multi_user/security/ir_filters_security.xml new file mode 100644 index 0000000000..6b91525da6 --- /dev/null +++ b/filter_multi_user/security/ir_filters_security.xml @@ -0,0 +1,12 @@ + + + + + ir.filters.multiuser + + ['|', ('user_id','in',[False,user.id]), ('user_ids','in',user.id)] + + + + + diff --git a/filter_multi_user/static/description/index.html b/filter_multi_user/static/description/index.html new file mode 100644 index 0000000000..24ba0a500d --- /dev/null +++ b/filter_multi_user/static/description/index.html @@ -0,0 +1,434 @@ + + + + + + +Filter Multi User + + + +
+

Filter Multi User

+ + +

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

+

Allows to share user-defined filters among several users.

+

Table of contents

+ +
+

Configuration

+

To share a filter among several users you need to:

+
    +
  1. Go to Settings > Technical > User Interface > User-defined Filters.
  2. +
  3. Edit a filter and fill the field Available for users with the desired +users.
  4. +
  5. The selected users will find the filter available as any other custom filter +under favorites in the search panel. However only the owner will be able to +delete the filter.
  6. +
+
+
+

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

+
    +
  • ForgeFlow
  • +
+
+ +
+

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.

+

Current maintainer:

+

LoisRForgeFlow

+

This module is part of the OCA/server-ux project on GitHub.

+

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

+
+
+
+ + diff --git a/filter_multi_user/tests/__init__.py b/filter_multi_user/tests/__init__.py new file mode 100644 index 0000000000..1ec5b7eea6 --- /dev/null +++ b/filter_multi_user/tests/__init__.py @@ -0,0 +1 @@ +from . import test_filter_multi_user diff --git a/filter_multi_user/tests/test_filter_multi_user.py b/filter_multi_user/tests/test_filter_multi_user.py new file mode 100644 index 0000000000..78b1c89ccb --- /dev/null +++ b/filter_multi_user/tests/test_filter_multi_user.py @@ -0,0 +1,78 @@ +# Copyright 2020 ForgeFlow S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests import common +from odoo.exceptions import AccessError + + +class TestFilterMultiUser(common.SavepointCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.filter_model = cls.env["ir.filters"] + cls.user_model = cls.env["res.users"] + + cls.group_user = cls.env.ref("base.group_user") + + cls.user_1 = cls._create_user("user_1", [cls.group_user]) + cls.user_2 = cls._create_user("user_2", [cls.group_user]) + + @classmethod + def _create_user(self, login, groups): + group_ids = [group.id for group in groups] + user = self.user_model.with_context({"no_reset_password": True}).create({ + "name": "Test User", + "login": login, + "password": "demo", + "email": "%s@yourcompany.com" % login, + "groups_id": [(6, 0, group_ids)] + }) + return user + + def test_01_no_multi_user(self): + test_filter = self.filter_model.create({ + "name": "Test filter", + "model_id": "ir.filters", + "user_id": self.user_1.id, + }) + self.assertTrue(test_filter.sudo(self.user_1).name) + with self.assertRaises(AccessError): + self.assertTrue(test_filter.sudo(self.user_2).name) + + def test_02_multi_user(self): + test_filter = self.filter_model.create({ + "name": "Test filter", + "model_id": "ir.filters", + "user_id": self.user_1.id, + "user_ids": [(6, 0, (self.user_1 + self.user_2).ids)], + }) + self.assertTrue(test_filter.sudo(self.user_1).name) + self.assertTrue(test_filter.sudo(self.user_2).name) + + def test_02_get_filters(self): + test_filter_1 = self.filter_model.create({ + "name": "Test filter", + "model_id": "ir.filters", + "user_id": self.user_1.id, + "user_ids": [(6, 0, (self.user_1 + self.user_2).ids)], + }) + test_filter_2 = self.filter_model.create({ + "name": "Test filter 2", + "model_id": "ir.filters", + "user_id": self.user_1.id, + }) + # User 1: + res = self.filter_model.sudo(self.user_1).get_filters("ir.filters") + result = [] + for filter in res: + result.append(filter.get("id")) + self.assertIn(test_filter_1.id, result) + self.assertIn(test_filter_2.id, result) + # User 2: + res = self.filter_model.sudo(self.user_2).get_filters("ir.filters") + result = [] + for filter in res: + result.append(filter.get("id")) + self.assertIn(test_filter_1.id, result) + self.assertNotIn(test_filter_2.id, result) diff --git a/filter_multi_user/views/ir_filters_view.xml b/filter_multi_user/views/ir_filters_view.xml new file mode 100644 index 0000000000..6b54fa2ec2 --- /dev/null +++ b/filter_multi_user/views/ir_filters_view.xml @@ -0,0 +1,42 @@ + + + + + + ir.filters.form - filter_multi_user + ir.filters + + + + + + + Owner + + + + + + ir.filters.tree - filter_multi_user + ir.filters + + + + + + + + + + ir.filters.search - filter_multi_user + ir.filters + + + + + + + + + From 7ff09be9dc92d535c7268c7df5467141568005c2 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Wed, 15 Jul 2020 17:13:45 +0200 Subject: [PATCH 02/37] Apply suggestions from code review Co-authored-by: Simone Orsi --- filter_multi_user/tests/test_filter_multi_user.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/filter_multi_user/tests/test_filter_multi_user.py b/filter_multi_user/tests/test_filter_multi_user.py index 78b1c89ccb..537efa17ab 100644 --- a/filter_multi_user/tests/test_filter_multi_user.py +++ b/filter_multi_user/tests/test_filter_multi_user.py @@ -10,6 +10,9 @@ class TestFilterMultiUser(common.SavepointCase): @classmethod def setUpClass(cls): super().setUpClass() + cls.env = cls.env( + context=dict(cls.env.context, tracking_disable=True, no_reset_password=True) + ) cls.filter_model = cls.env["ir.filters"] cls.user_model = cls.env["res.users"] @@ -21,7 +24,7 @@ def setUpClass(cls): @classmethod def _create_user(self, login, groups): group_ids = [group.id for group in groups] - user = self.user_model.with_context({"no_reset_password": True}).create({ + user = self.user_model.create({ "name": "Test User", "login": login, "password": "demo", From 0927233e6897fab3603207b031715a3c4f967da9 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Wed, 15 Jul 2020 17:51:41 +0200 Subject: [PATCH 03/37] [11.0][IMP] filter_multi_user: add option to select groups [UPD] Update filter_multi_user.pot [UPD] README.rst --- filter_multi_user/README.rst | 6 +-- filter_multi_user/i18n/filter_multi_user.pot | 41 +++++++++++++++++++ filter_multi_user/models/ir_filters.py | 16 ++++++++ filter_multi_user/readme/CONFIGURE.rst | 6 +-- .../static/description/index.html | 8 ++-- .../tests/test_filter_multi_user.py | 21 ++++++++-- filter_multi_user/views/ir_filters_view.xml | 9 ++-- 7 files changed, 91 insertions(+), 16 deletions(-) create mode 100644 filter_multi_user/i18n/filter_multi_user.pot diff --git a/filter_multi_user/README.rst b/filter_multi_user/README.rst index 02b6cc2e85..46d720a33f 100644 --- a/filter_multi_user/README.rst +++ b/filter_multi_user/README.rst @@ -38,9 +38,9 @@ Configuration To share a filter among several users you need to: #. Go to *Settings > Technical > User Interface > User-defined Filters*. -#. Edit a filter and fill the field *Available for users* with the desired - users. -#. The selected users will find the filter available as any other custom filter +#. Edit a filter and fill the fields *Available for users* and/or *Available + for groups* with the desired users/groups. +#. The matched users will find the filter available as any other custom filter under favorites in the search panel. However only the owner will be able to delete the filter. diff --git a/filter_multi_user/i18n/filter_multi_user.pot b/filter_multi_user/i18n/filter_multi_user.pot new file mode 100644 index 0000000000..643d64b614 --- /dev/null +++ b/filter_multi_user/i18n/filter_multi_user.pot @@ -0,0 +1,41 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * filter_multi_user +# +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: filter_multi_user +#: model:ir.model.fields,field_description:filter_multi_user.field_ir_filters_group_ids +msgid "Available for Groups" +msgstr "" + +#. module: filter_multi_user +#: model:ir.model.fields,field_description:filter_multi_user.field_ir_filters_manual_user_ids +#: model:ir.ui.view,arch_db:filter_multi_user.ir_filters_view_tree +msgid "Available for Users" +msgstr "" + +#. module: filter_multi_user +#: model:ir.model,name:filter_multi_user.model_ir_filters +msgid "Filters" +msgstr "" + +#. module: filter_multi_user +#: model:ir.ui.view,arch_db:filter_multi_user.ir_filters_view_form +msgid "Owner" +msgstr "" + +#. module: filter_multi_user +#: model:ir.model.fields,field_description:filter_multi_user.field_ir_filters_user_ids +msgid "Users" +msgstr "" + diff --git a/filter_multi_user/models/ir_filters.py b/filter_multi_user/models/ir_filters.py index 3aca7e472b..8cb07bf8ab 100644 --- a/filter_multi_user/models/ir_filters.py +++ b/filter_multi_user/models/ir_filters.py @@ -10,7 +10,23 @@ class IrFilters(models.Model): user_ids = fields.Many2many( comodel_name="res.users", string="Users", + compute="_compute_user_ids", + store=True, ) + manual_user_ids = fields.Many2many( + comodel_name="res.users", + string="Available for Users", + relation="ir_filters_res_users_manual_rel", + ) + group_ids = fields.Many2many( + comodel_name="res.groups", + string="Available for Groups", + ) + + @api.constrains("manual_user_ids", "group_ids") + def _compute_user_ids(self): + for rec in self: + rec.user_ids = rec.manual_user_ids + rec.group_ids.users @api.model def get_filters(self, model, action_id=None): diff --git a/filter_multi_user/readme/CONFIGURE.rst b/filter_multi_user/readme/CONFIGURE.rst index fec8c1cde8..4380c523fc 100644 --- a/filter_multi_user/readme/CONFIGURE.rst +++ b/filter_multi_user/readme/CONFIGURE.rst @@ -1,8 +1,8 @@ To share a filter among several users you need to: #. Go to *Settings > Technical > User Interface > User-defined Filters*. -#. Edit a filter and fill the field *Available for users* with the desired - users. -#. The selected users will find the filter available as any other custom filter +#. Edit a filter and fill the fields *Available for users* and/or *Available + for groups* with the desired users/groups. +#. The matched users will find the filter available as any other custom filter under favorites in the search panel. However only the owner will be able to delete the filter. diff --git a/filter_multi_user/static/description/index.html b/filter_multi_user/static/description/index.html index 24ba0a500d..cfed1dd519 100644 --- a/filter_multi_user/static/description/index.html +++ b/filter_multi_user/static/description/index.html @@ -3,7 +3,7 @@ - + Filter Multi User -
-

Filter Multi User

+
+ + +Odoo Community Association + +
+

Filter Multi User

-

Beta License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

Allows to share user-defined filters among several users.

Table of contents

@@ -385,7 +390,7 @@

Filter Multi User

-

Configuration

+

Configuration

To share a filter among several users you need to:

  1. Go to Settings > Technical > User Interface > User-defined Filters.
  2. @@ -397,7 +402,7 @@

    Configuration

-

Bug Tracker

+

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 to smash it by providing a detailed and welcomed @@ -405,22 +410,22 @@

Bug Tracker

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

+
From 52fef7b80ed16cc982eb1395f6ee3e627cd85416 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Mon, 17 Nov 2025 14:38:50 +0000 Subject: [PATCH 36/37] [UPD] Update filter_multi_user.pot --- filter_multi_user/i18n/filter_multi_user.pot | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/filter_multi_user/i18n/filter_multi_user.pot b/filter_multi_user/i18n/filter_multi_user.pot index 4d9e3631c3..cedc8d3db6 100644 --- a/filter_multi_user/i18n/filter_multi_user.pot +++ b/filter_multi_user/i18n/filter_multi_user.pot @@ -13,11 +13,6 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" -#. module: filter_multi_user -#: model:ir.model.fields,field_description:filter_multi_user.field_ir_filters__group_ids -msgid "Available for Groups" -msgstr "" - #. module: filter_multi_user #: model:ir.model.fields,field_description:filter_multi_user.field_ir_filters__manual_user_ids #: model_terms:ir.ui.view,arch_db:filter_multi_user.ir_filters_view_tree @@ -34,6 +29,11 @@ msgstr "" msgid "Owner" msgstr "" +#. module: filter_multi_user +#: model:ir.model.fields,field_description:filter_multi_user.field_ir_filters__group_ids +msgid "User Groups" +msgstr "" + #. module: filter_multi_user #: model:ir.model.fields,field_description:filter_multi_user.field_ir_filters__user_ids msgid "Users" From 532f6bc36b6f02c9a50a5bd0e50ed3669acc1fe2 Mon Sep 17 00:00:00 2001 From: Samir GUESMI Date: Fri, 26 Jun 2026 15:38:55 +0200 Subject: [PATCH 37/37] [MIG] filter_multi_user: Migration to 19.0 --- filter_multi_user/README.rst | 11 ++-- filter_multi_user/__manifest__.py | 4 +- filter_multi_user/models/ir_filters.py | 66 +++++-------------- filter_multi_user/readme/CONTRIBUTORS.md | 1 + .../security/ir_filters_security.xml | 15 ----- .../static/description/index.html | 7 +- .../tests/test_filter_multi_user.py | 34 ++++------ filter_multi_user/views/ir_filters_view.xml | 11 ++-- 8 files changed, 46 insertions(+), 103 deletions(-) delete mode 100644 filter_multi_user/security/ir_filters_security.xml diff --git a/filter_multi_user/README.rst b/filter_multi_user/README.rst index 38585fcd16..d685623508 100644 --- a/filter_multi_user/README.rst +++ b/filter_multi_user/README.rst @@ -21,13 +21,13 @@ Filter Multi User :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github - :target: https://github.com/OCA/server-ux/tree/18.0/filter_multi_user + :target: https://github.com/OCA/server-ux/tree/19.0/filter_multi_user :alt: OCA/server-ux .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/server-ux-18-0/server-ux-18-0-filter_multi_user + :target: https://translation.odoo-community.org/projects/server-ux-19-0/server-ux-19-0-filter_multi_user :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/server-ux&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-ux&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -57,7 +57,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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -74,6 +74,7 @@ Contributors - Lois Rilo - Dhara Solanki +- Samir GUESMI Maintainers ----------- @@ -96,6 +97,6 @@ Current `maintainer `__: |maintainer-LoisRForgeFlow| -This module is part of the `OCA/server-ux `_ project on GitHub. +This module is part of the `OCA/server-ux `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/filter_multi_user/__manifest__.py b/filter_multi_user/__manifest__.py index 8147c6e9ea..9946dfbf29 100644 --- a/filter_multi_user/__manifest__.py +++ b/filter_multi_user/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Filter Multi User", "summary": "Allows to share user-defined filters filters among several users.", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "development_status": "Beta", "maintainers": ["LoisRForgeFlow"], "category": "Tools", @@ -12,5 +12,5 @@ "license": "AGPL-3", "installable": True, "depends": ["base"], - "data": ["security/ir_filters_security.xml", "views/ir_filters_view.xml"], + "data": ["views/ir_filters_view.xml"], } diff --git a/filter_multi_user/models/ir_filters.py b/filter_multi_user/models/ir_filters.py index 227cb3af7f..71f7aef194 100644 --- a/filter_multi_user/models/ir_filters.py +++ b/filter_multi_user/models/ir_filters.py @@ -7,12 +7,9 @@ class IrFilters(models.Model): _inherit = "ir.filters" - user_ids = fields.Many2many( - comodel_name="res.users", - string="Users", - compute="_compute_user_ids", - store=True, - ) + # user_ids is now a native Many2many on ir.filters in v19. + # We compute its value from manual_user_ids + group_ids.users via constrains. + manual_user_ids = fields.Many2many( comodel_name="res.users", string="Available for Users", @@ -23,47 +20,18 @@ class IrFilters(models.Model): string="Available for Groups", ) - @api.constrains("manual_user_ids", "group_ids") - def _compute_user_ids(self): - for rec in self: - rec.user_ids = rec.manual_user_ids + rec.group_ids.users + @api.model_create_multi + def create(self, vals_list): + records = super().create(vals_list) + records._sync_user_ids() + return records + + def write(self, vals): + result = super().write(vals) + if "manual_user_ids" in vals or "group_ids" in vals: + self._sync_user_ids() + return result - @api.model - def get_filters( - self, - model, - action_id=None, - embedded_action_id=None, - embedded_parent_res_id=None, - ): - # WARNING: this function overrides the standard one. - # The only change done is in the domain used to search the filters. - action_domain = self._get_action_domain( - action_id, embedded_action_id, embedded_parent_res_id - ) - filters = self.search( - action_domain - + [ - ("model_id", "=", model), - "|", - "|", - ("user_id", "=", self._uid), - ("user_ids", "in", self._uid), - "&", - ("user_id", "=", False), - ("user_ids", "=", False), - ] - ) - user_context = self.env["res.users"].context_get() - return filters.with_context(**user_context).read( - [ - "name", - "is_default", - "domain", - "context", - "user_id", - "sort", - "embedded_action_id", - "embedded_parent_res_id", - ] - ) + def _sync_user_ids(self): + for rec in self: + rec.user_ids = rec.manual_user_ids | rec.group_ids.user_ids diff --git a/filter_multi_user/readme/CONTRIBUTORS.md b/filter_multi_user/readme/CONTRIBUTORS.md index cc7192b8e1..29ee50e599 100644 --- a/filter_multi_user/readme/CONTRIBUTORS.md +++ b/filter_multi_user/readme/CONTRIBUTORS.md @@ -1,2 +1,3 @@ - Lois Rilo \ - Dhara Solanki \ +- Samir GUESMI \ diff --git a/filter_multi_user/security/ir_filters_security.xml b/filter_multi_user/security/ir_filters_security.xml deleted file mode 100644 index 0d2b9da8c3..0000000000 --- a/filter_multi_user/security/ir_filters_security.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - ir.filters.multiuser - - ['|', - '|', ('user_id', '=', user.id), ('user_ids', 'in', user.id), - '&', ('user_id', '=', False), ('user_ids', '=', False),] - - - - - - - diff --git a/filter_multi_user/static/description/index.html b/filter_multi_user/static/description/index.html index 5bea00f587..0ec82c4c37 100644 --- a/filter_multi_user/static/description/index.html +++ b/filter_multi_user/static/description/index.html @@ -374,7 +374,7 @@

Filter Multi User

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:ff1b88d8691600e7d7bf095c0285b5fb1a5f42895678b3feb6579034b1235bde !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

Allows to share user-defined filters among several users.

Table of contents

@@ -406,7 +406,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 to smash it by providing a detailed and welcomed -feedback.

+feedback.

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

@@ -422,6 +422,7 @@

Contributors

@@ -435,7 +436,7 @@

Maintainers

promote its widespread use.

Current maintainer:

LoisRForgeFlow

-

This module is part of the OCA/server-ux project on GitHub.

+

This module is part of the OCA/server-ux project on GitHub.

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

diff --git a/filter_multi_user/tests/test_filter_multi_user.py b/filter_multi_user/tests/test_filter_multi_user.py index 8b30fd87ee..0c7cbd4aef 100644 --- a/filter_multi_user/tests/test_filter_multi_user.py +++ b/filter_multi_user/tests/test_filter_multi_user.py @@ -2,6 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo.exceptions import AccessError +from odoo.fields import Command from odoo.tests import common @@ -24,24 +25,22 @@ def setUpClass(cls): @classmethod def _create_user(cls, login, groups): - group_ids = [group.id for group in groups] - user = cls.user_model.create( + return cls.user_model.create( { "name": "Test User", "login": login, "password": "demo", "email": f"{login}@yourcompany.com", - "groups_id": [(6, 0, group_ids)], + "group_ids": [Command.set([g.id for g in groups])], } ) - return user def test_01_no_multi_user(self): test_filter = self.filter_model.create( { "name": "Test filter", "model_id": "ir.filters", - "user_id": self.user_1.id, + "manual_user_ids": [Command.set([self.user_1.id])], } ) self.assertTrue(test_filter.with_user(self.user_1).name) @@ -54,8 +53,7 @@ def test_02_multi_user(self): { "name": "Test filter", "model_id": "ir.filters", - "user_id": self.user_1.id, - "manual_user_ids": [(6, 0, (self.user_1 + self.user_2).ids)], + "manual_user_ids": [Command.set((self.user_1 + self.user_2).ids)], } ) self.assertTrue(test_filter.with_user(self.user_1).name) @@ -67,45 +65,38 @@ def test_03_get_filters(self): { "name": "Test filter - specific user", "model_id": "ir.filters", - "manual_user_ids": [(6, 0, (self.user_1 + self.user_2).ids)], + "manual_user_ids": [Command.set((self.user_1 + self.user_2).ids)], } ) test_filter_2 = self.filter_model.create( { "name": "Test filter 2 - Regular", "model_id": "ir.filters", - "user_id": self.user_1.id, + "manual_user_ids": [Command.set([self.user_1.id])], } ) test_filter_3 = self.filter_model.create( { "name": "Test filter 3 - Group", "model_id": "ir.filters", - "user_id": self.user_1.id, - "group_ids": [(6, 0, self.group_private.ids)], + "group_ids": [Command.set(self.group_private.ids)], } ) # User 1: res = self.filter_model.with_user(self.user_1).get_filters("ir.filters") - result = [] - for filters in res: - result.append(filters.get("id")) + result = [f.get("id") for f in res] self.assertIn(test_filter_1.id, result) self.assertIn(test_filter_2.id, result) self.assertIn(test_filter_3.id, result) # User 2: res = self.filter_model.with_user(self.user_2).get_filters("ir.filters") - result = [] - for filters in res: - result.append(filters.get("id")) + result = [f.get("id") for f in res] self.assertIn(test_filter_1.id, result) self.assertNotIn(test_filter_2.id, result) self.assertNotIn(test_filter_3.id, result) # User 3: res = self.filter_model.with_user(self.user_3).get_filters("ir.filters") - result = [] - for filters in res: - result.append(filters.get("id")) + result = [f.get("id") for f in res] self.assertNotIn(test_filter_1.id, result) self.assertNotIn(test_filter_2.id, result) self.assertIn(test_filter_3.id, result) @@ -115,8 +106,7 @@ def test_04_group_filter(self): { "name": "Test filter", "model_id": "ir.filters", - "user_id": self.user_1.id, - "group_ids": [(6, 0, self.group_private.ids)], + "group_ids": [Command.set(self.group_private.ids)], } ) self.assertTrue(test_filter.with_user(self.user_1).name) diff --git a/filter_multi_user/views/ir_filters_view.xml b/filter_multi_user/views/ir_filters_view.xml index e52453a317..60975107e9 100644 --- a/filter_multi_user/views/ir_filters_view.xml +++ b/filter_multi_user/views/ir_filters_view.xml @@ -7,21 +7,18 @@ ir.filters - + - - Owner - - ir.filters.tree - filter_multi_user + ir.filters.list - filter_multi_user ir.filters - + ir.filters - +