From 03e70e298204e8e72704acefc83df25e1d0d8a86 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Thu, 16 Jul 2020 10:19:33 +0200 Subject: [PATCH 01/13] [11.0][ADD] default_multi_user --- default_multi_user/README.rst | 90 ++++ default_multi_user/__init__.py | 2 + default_multi_user/__manifest__.py | 21 + default_multi_user/hooks.py | 34 ++ .../i18n/default_multi_user.pot | 41 ++ default_multi_user/models/__init__.py | 1 + default_multi_user/models/ir_default.py | 55 +++ default_multi_user/readme/CONFIGURE.rst | 5 + default_multi_user/readme/CONTRIBUTORS.rst | 1 + default_multi_user/readme/DESCRIPTION.rst | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 431 ++++++++++++++++++ default_multi_user/tests/__init__.py | 1 + .../tests/test_default_multi_user.py | 106 +++++ default_multi_user/views/ir_default_view.xml | 45 ++ 15 files changed, 834 insertions(+) create mode 100644 default_multi_user/README.rst create mode 100644 default_multi_user/__init__.py create mode 100644 default_multi_user/__manifest__.py create mode 100644 default_multi_user/hooks.py create mode 100644 default_multi_user/i18n/default_multi_user.pot create mode 100644 default_multi_user/models/__init__.py create mode 100644 default_multi_user/models/ir_default.py create mode 100644 default_multi_user/readme/CONFIGURE.rst create mode 100644 default_multi_user/readme/CONTRIBUTORS.rst create mode 100644 default_multi_user/readme/DESCRIPTION.rst create mode 100644 default_multi_user/static/description/icon.png create mode 100644 default_multi_user/static/description/index.html create mode 100644 default_multi_user/tests/__init__.py create mode 100644 default_multi_user/tests/test_default_multi_user.py create mode 100644 default_multi_user/views/ir_default_view.xml diff --git a/default_multi_user/README.rst b/default_multi_user/README.rst new file mode 100644 index 0000000000..0a6ec86393 --- /dev/null +++ b/default_multi_user/README.rst @@ -0,0 +1,90 @@ +================== +Default 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/default_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-default_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 defaults among several users. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To share a default among several users you need to: + +#. Go to *Settings > Technical > Actions > User-defined Defaults*. +#. Edit a default and fill the field *Available for users* and *Available for + Groups* with the desired users and/or groups. + +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/default_multi_user/__init__.py b/default_multi_user/__init__.py new file mode 100644 index 0000000000..5bf67492bc --- /dev/null +++ b/default_multi_user/__init__.py @@ -0,0 +1,2 @@ +from . import models +from .hooks import post_load_hook diff --git a/default_multi_user/__manifest__.py b/default_multi_user/__manifest__.py new file mode 100644 index 0000000000..1afdf70eaf --- /dev/null +++ b/default_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": "Default Multi User", + "summary": "Allows to share user-defined defaults 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": [ + "views/ir_default_view.xml", + ], + "post_load": "post_load_hook", +} diff --git a/default_multi_user/hooks.py b/default_multi_user/hooks.py new file mode 100644 index 0000000000..fcae6aec52 --- /dev/null +++ b/default_multi_user/hooks.py @@ -0,0 +1,34 @@ +# Copyright 2020 ForgeFlow S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.addons.base.ir.ir_default import IrDefault +from odoo import api, tools + +import json + + +def post_load_hook(): + + @api.model + @tools.ormcache('self.env.uid', 'model_name', 'condition') + def new_get_model_defaults(self, model_name, condition=False): + if not hasattr(self, '_get_model_defaults_query_and_params'): + return self.get_model_defaults_original( + model_name, condition=condition) + cr = self.env.cr + # START OF CHANGES + query, params = self._get_model_defaults_query_and_params( + model_name, condition) + # END OF CHANGES + cr.execute(query, params) + result = {} + for row in cr.fetchall(): + # keep the highest priority default for each field + if row[0] not in result: + result[row[0]] = json.loads(row[1]) + return result + + if not hasattr(IrDefault, 'get_model_defaults_original'): + IrDefault.get_model_defaults_original = IrDefault.get_model_defaults + + IrDefault._patch_method("get_model_defaults", new_get_model_defaults) diff --git a/default_multi_user/i18n/default_multi_user.pot b/default_multi_user/i18n/default_multi_user.pot new file mode 100644 index 0000000000..1e842a7d63 --- /dev/null +++ b/default_multi_user/i18n/default_multi_user.pot @@ -0,0 +1,41 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * default_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: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default_group_ids +msgid "Available for Groups" +msgstr "" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default_manual_user_ids +#: model:ir.ui.view,arch_db:default_multi_user.ir_default_view_tree +msgid "Available for Users" +msgstr "" + +#. module: default_multi_user +#: model:ir.ui.view,arch_db:default_multi_user.ir_default_view_form +msgid "Owner" +msgstr "" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default_user_ids +msgid "Users" +msgstr "" + +#. module: default_multi_user +#: model:ir.model,name:default_multi_user.model_ir_default +msgid "ir.default" +msgstr "" + diff --git a/default_multi_user/models/__init__.py b/default_multi_user/models/__init__.py new file mode 100644 index 0000000000..a87ff262ff --- /dev/null +++ b/default_multi_user/models/__init__.py @@ -0,0 +1 @@ +from . import ir_default diff --git a/default_multi_user/models/ir_default.py b/default_multi_user/models/ir_default.py new file mode 100644 index 0000000000..6e9820235a --- /dev/null +++ b/default_multi_user/models/ir_default.py @@ -0,0 +1,55 @@ +# Copyright 2020 ForgeFlow S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class IrDefaultgard(models.Model): + _inherit = "ir.default" + + user_ids = fields.Many2many( + comodel_name="res.users", + string="Users", + relation="ir_default_res_users_rel", + column1="ir_default_id", + column2="res_users_id", + compute="_compute_user_ids", + store=True, + ) + manual_user_ids = fields.Many2many( + comodel_name="res.users", + string="Available for Users", + relation="ir_default_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_model_defaults_query_and_params(self, model_name, condition): + query = """ + SELECT f.name, d.json_value FROM ir_default d + JOIN ir_model_fields f ON d.field_id=f.id + JOIN res_users u ON u.id=%s + LEFT JOIN ir_default_res_users_rel m + ON m.ir_default_id = d.id + WHERE f.model=%s + AND ((d.user_id IS NULL AND m.res_users_id IS NULL) + OR d.user_id=u.id OR m.res_users_id = u.id) + AND (d.company_id IS NULL OR d.company_id=u.company_id) + AND {} + ORDER BY d.user_id, m.res_users_id, d.company_id, d.id + """ + params = [self.env.uid, model_name] + if condition: + query = query.format("d.condition=%s") + params.append(condition) + else: + query = query.format("d.condition IS NULL") + return query, params diff --git a/default_multi_user/readme/CONFIGURE.rst b/default_multi_user/readme/CONFIGURE.rst new file mode 100644 index 0000000000..f47ebba7ee --- /dev/null +++ b/default_multi_user/readme/CONFIGURE.rst @@ -0,0 +1,5 @@ +To share a default among several users you need to: + +#. Go to *Settings > Technical > Actions > User-defined Defaults*. +#. Edit a default and fill the field *Available for users* and *Available for + Groups* with the desired users and/or groups. diff --git a/default_multi_user/readme/CONTRIBUTORS.rst b/default_multi_user/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..77dfbe89e9 --- /dev/null +++ b/default_multi_user/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Lois Rilo diff --git a/default_multi_user/readme/DESCRIPTION.rst b/default_multi_user/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..794eaead87 --- /dev/null +++ b/default_multi_user/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Allows to share user-defined defaults among several users. diff --git a/default_multi_user/static/description/icon.png b/default_multi_user/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/default_multi_user/static/description/index.html b/default_multi_user/static/description/index.html new file mode 100644 index 0000000000..7c6dfa8bc8 --- /dev/null +++ b/default_multi_user/static/description/index.html @@ -0,0 +1,431 @@ + + + + + + +Default Multi User + + + +
+

Default Multi User

+ + +

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

+

Allows to share user-defined defaults among several users.

+

Table of contents

+ +
+

Configuration

+

To share a default among several users you need to:

+
    +
  1. Go to Settings > Technical > Actions > User-defined Defaults.
  2. +
  3. Edit a default and fill the field Available for users and Available for +Groups with the desired users and/or groups.
  4. +
+
+
+

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/default_multi_user/tests/__init__.py b/default_multi_user/tests/__init__.py new file mode 100644 index 0000000000..0b1fb541c2 --- /dev/null +++ b/default_multi_user/tests/__init__.py @@ -0,0 +1 @@ +from . import test_default_multi_user diff --git a/default_multi_user/tests/test_default_multi_user.py b/default_multi_user/tests/test_default_multi_user.py new file mode 100644 index 0000000000..290010addb --- /dev/null +++ b/default_multi_user/tests/test_default_multi_user.py @@ -0,0 +1,106 @@ +# Copyright 2020 ForgeFlow S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests import common + +import json + + +class TestDefaultMultiUser(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.default_model = cls.env["ir.default"] + cls.user_model = cls.env["res.users"] + cls.partner_model = cls.env["res.partner"] + + cls.field = cls.env.ref("base.field_res_partner_phone") + cls.group_user = cls.env.ref("base.group_user") + cls.group_partner = cls.env.ref("base.group_partner_manager") + cls.group_private = cls.env["res.groups"].create({ + "name": "Test Group", + }) + + cls.user_1 = cls._create_user("user_1", [ + cls.group_user, cls.group_partner, cls.group_private]) + cls.user_2 = cls._create_user("user_2", [cls.group_user, cls.group_partner]) + cls.user_3 = cls._create_user("user_3", [ + cls.group_user, cls.group_partner, cls.group_private]) + + cls.test_value = "+34 666 777 888" + + @classmethod + def _create_user(self, login, groups): + group_ids = [group.id for group in groups] + user = self.user_model.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): + self.default_model.create({ + "field_id": self.field.id, + "json_value": json.dumps(self.test_value, ensure_ascii=False), + "user_id": self.user_1.id, + }) + rec_1 = self.partner_model.sudo(self.user_1).create({"name": "Test"}) + self.assertEqual(rec_1.phone, self.test_value) + rec_2 = self.partner_model.sudo(self.user_2).create({"name": "Test"}) + self.assertNotEqual(rec_2.phone, self.test_value) + + def test_02_multi_user(self): + test_default = self.default_model.create({ + "field_id": self.field.id, + "json_value": json.dumps(self.test_value, ensure_ascii=False), + "user_id": self.user_1.id, + "manual_user_ids": [(6, 0, (self.user_1 + self.user_2).ids)], + }) + self.assertIn(self.user_1, test_default.user_ids) + self.assertIn(self.user_2, test_default.user_ids) + rec_1 = self.partner_model.sudo(self.user_1).create({"name": "Test"}) + self.assertEqual(rec_1.phone, self.test_value) + rec_2 = self.partner_model.sudo(self.user_2).create({"name": "Test"}) + self.assertEqual(rec_2.phone, self.test_value) + + def test_03_group_default(self): + # Global default - expected for user 2 + global_value = "+01 564 879 123" + self.default_model.create({ + "field_id": self.field.id, + "json_value": json.dumps(global_value, ensure_ascii=False), + }) + # Group specific default - expected for user 1 and 3 + test_default = self.default_model.create({ + "field_id": self.field.id, + "json_value": json.dumps(self.test_value, ensure_ascii=False), + "group_ids": [(6, 0, self.group_private.ids)], + }) + self.assertIn(self.user_1, test_default.user_ids) + self.assertIn(self.user_3, test_default.user_ids) + rec_1 = self.partner_model.sudo(self.user_1).create({"name": "Test"}) + self.assertEqual(rec_1.phone, self.test_value) + rec_2 = self.partner_model.sudo(self.user_2).create({"name": "Test"}) + self.assertEqual(rec_2.phone, global_value) + rec_3 = self.partner_model.sudo(self.user_3).create({"name": "Test"}) + self.assertEqual(rec_3.phone, self.test_value) + + def test_04_multi_user_no_alternative(self): + test_default = self.default_model.create({ + "field_id": self.field.id, + "json_value": json.dumps(self.test_value, ensure_ascii=False), + "manual_user_ids": [(6, 0, self.user_2.ids)], + }) + self.assertNotIn(self.user_1, test_default.user_ids) + self.assertIn(self.user_2, test_default.user_ids) + rec_1 = self.partner_model.sudo(self.user_1).create({"name": "Test"}) + self.assertNotEqual(rec_1.phone, self.test_value) + rec_2 = self.partner_model.sudo(self.user_2).create({"name": "Test"}) + self.assertEqual(rec_2.phone, self.test_value) diff --git a/default_multi_user/views/ir_default_view.xml b/default_multi_user/views/ir_default_view.xml new file mode 100644 index 0000000000..c0441707c1 --- /dev/null +++ b/default_multi_user/views/ir_default_view.xml @@ -0,0 +1,45 @@ + + + + + + ir.default.form - default_multi_user + ir.default + + + + + + + + Owner + + + + + + ir.default.tree - default_multi_user + ir.default + + + + + + + + + + + ir.default.search - default_multi_user + ir.default + + + + + + + + + + From 7555776c7072d1e884a60f0bf294da1834d1d386 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Tue, 21 Jul 2020 12:00:15 +0200 Subject: [PATCH 02/13] [12.0][MIG] default_multi_user --- default_multi_user/README.rst | 10 +++++----- default_multi_user/__manifest__.py | 2 +- default_multi_user/hooks.py | 2 +- .../i18n/default_multi_user.pot | 20 +++++++++---------- .../static/description/index.html | 6 +++--- .../tests/test_default_multi_user.py | 2 +- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/default_multi_user/README.rst b/default_multi_user/README.rst index 0a6ec86393..39874e1d95 100644 --- a/default_multi_user/README.rst +++ b/default_multi_user/README.rst @@ -14,13 +14,13 @@ Default 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/11.0/default_multi_user + :target: https://github.com/OCA/server-ux/tree/12.0/default_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-default_multi_user + :target: https://translation.odoo-community.org/projects/server-ux-12-0/server-ux-12-0-default_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 + :target: https://runbot.odoo-community.org/runbot/250/12.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -47,7 +47,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. @@ -85,6 +85,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/default_multi_user/__manifest__.py b/default_multi_user/__manifest__.py index 1afdf70eaf..b276dc70d6 100644 --- a/default_multi_user/__manifest__.py +++ b/default_multi_user/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Default Multi User", "summary": "Allows to share user-defined defaults among several users.", - "version": "11.0.1.0.0", + "version": "12.0.1.0.0", "development_status": "Beta", "maintainers": ['LoisRForgeFlow'], "category": "Tools", diff --git a/default_multi_user/hooks.py b/default_multi_user/hooks.py index fcae6aec52..356aa12b95 100644 --- a/default_multi_user/hooks.py +++ b/default_multi_user/hooks.py @@ -1,7 +1,7 @@ # Copyright 2020 ForgeFlow S.L. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo.addons.base.ir.ir_default import IrDefault +from odoo.addons.base.models.ir_default import IrDefault from odoo import api, tools import json diff --git a/default_multi_user/i18n/default_multi_user.pot b/default_multi_user/i18n/default_multi_user.pot index 1e842a7d63..60a2289372 100644 --- a/default_multi_user/i18n/default_multi_user.pot +++ b/default_multi_user/i18n/default_multi_user.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 11.0\n" +"Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: <>\n" "Language-Team: \n" @@ -14,28 +14,28 @@ msgstr "" "Plural-Forms: \n" #. module: default_multi_user -#: model:ir.model.fields,field_description:default_multi_user.field_ir_default_group_ids +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__group_ids msgid "Available for Groups" msgstr "" #. module: default_multi_user -#: model:ir.model.fields,field_description:default_multi_user.field_ir_default_manual_user_ids -#: model:ir.ui.view,arch_db:default_multi_user.ir_default_view_tree +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__manual_user_ids +#: model_terms:ir.ui.view,arch_db:default_multi_user.ir_default_view_tree msgid "Available for Users" msgstr "" #. module: default_multi_user -#: model:ir.ui.view,arch_db:default_multi_user.ir_default_view_form -msgid "Owner" +#: model:ir.model,name:default_multi_user.model_ir_default +msgid "Default Values" msgstr "" #. module: default_multi_user -#: model:ir.model.fields,field_description:default_multi_user.field_ir_default_user_ids -msgid "Users" +#: model_terms:ir.ui.view,arch_db:default_multi_user.ir_default_view_form +msgid "Owner" msgstr "" #. module: default_multi_user -#: model:ir.model,name:default_multi_user.model_ir_default -msgid "ir.default" +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__user_ids +msgid "Users" msgstr "" diff --git a/default_multi_user/static/description/index.html b/default_multi_user/static/description/index.html index 7c6dfa8bc8..8bc82ca3aa 100644 --- a/default_multi_user/static/description/index.html +++ b/default_multi_user/static/description/index.html @@ -367,7 +367,7 @@

Default Multi User

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

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

+

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

Allows to share user-defined defaults among several users.

Table of contents

@@ -396,7 +396,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.

@@ -422,7 +422,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/default_multi_user/tests/test_default_multi_user.py b/default_multi_user/tests/test_default_multi_user.py index 290010addb..0cc5ec97f0 100644 --- a/default_multi_user/tests/test_default_multi_user.py +++ b/default_multi_user/tests/test_default_multi_user.py @@ -18,7 +18,7 @@ def setUpClass(cls): cls.user_model = cls.env["res.users"] cls.partner_model = cls.env["res.partner"] - cls.field = cls.env.ref("base.field_res_partner_phone") + cls.field = cls.env.ref("base.field_res_partner__phone") cls.group_user = cls.env.ref("base.group_user") cls.group_partner = cls.env.ref("base.group_partner_manager") cls.group_private = cls.env["res.groups"].create({ From 764b05c3b49cb5aada946003f9c0cb5230a2a502 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Wed, 22 Jul 2020 16:12:50 +0200 Subject: [PATCH 03/13] [IMP] default_multi_user: black, isort, prettier --- default_multi_user/__manifest__.py | 10 +- default_multi_user/hooks.py | 18 ++-- default_multi_user/models/ir_default.py | 3 +- .../tests/test_default_multi_user.py | 95 +++++++++++-------- default_multi_user/views/ir_default_view.xml | 28 +++--- 5 files changed, 79 insertions(+), 75 deletions(-) diff --git a/default_multi_user/__manifest__.py b/default_multi_user/__manifest__.py index b276dc70d6..2371176c57 100644 --- a/default_multi_user/__manifest__.py +++ b/default_multi_user/__manifest__.py @@ -5,17 +5,13 @@ "summary": "Allows to share user-defined defaults among several users.", "version": "12.0.1.0.0", "development_status": "Beta", - "maintainers": ['LoisRForgeFlow'], + "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": [ - "views/ir_default_view.xml", - ], + "depends": ["base",], + "data": ["views/ir_default_view.xml",], "post_load": "post_load_hook", } diff --git a/default_multi_user/hooks.py b/default_multi_user/hooks.py index 356aa12b95..a24b5cc9f7 100644 --- a/default_multi_user/hooks.py +++ b/default_multi_user/hooks.py @@ -1,24 +1,22 @@ # Copyright 2020 ForgeFlow S.L. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo.addons.base.models.ir_default import IrDefault +import json + from odoo import api, tools -import json +from odoo.addons.base.models.ir_default import IrDefault def post_load_hook(): - @api.model - @tools.ormcache('self.env.uid', 'model_name', 'condition') + @tools.ormcache("self.env.uid", "model_name", "condition") def new_get_model_defaults(self, model_name, condition=False): - if not hasattr(self, '_get_model_defaults_query_and_params'): - return self.get_model_defaults_original( - model_name, condition=condition) + if not hasattr(self, "_get_model_defaults_query_and_params"): + return self.get_model_defaults_original(model_name, condition=condition) cr = self.env.cr # START OF CHANGES - query, params = self._get_model_defaults_query_and_params( - model_name, condition) + query, params = self._get_model_defaults_query_and_params(model_name, condition) # END OF CHANGES cr.execute(query, params) result = {} @@ -28,7 +26,7 @@ def new_get_model_defaults(self, model_name, condition=False): result[row[0]] = json.loads(row[1]) return result - if not hasattr(IrDefault, 'get_model_defaults_original'): + if not hasattr(IrDefault, "get_model_defaults_original"): IrDefault.get_model_defaults_original = IrDefault.get_model_defaults IrDefault._patch_method("get_model_defaults", new_get_model_defaults) diff --git a/default_multi_user/models/ir_default.py b/default_multi_user/models/ir_default.py index 6e9820235a..1197895a1a 100644 --- a/default_multi_user/models/ir_default.py +++ b/default_multi_user/models/ir_default.py @@ -22,8 +22,7 @@ class IrDefaultgard(models.Model): relation="ir_default_res_users_manual_rel", ) group_ids = fields.Many2many( - comodel_name="res.groups", - string="Available for Groups", + comodel_name="res.groups", string="Available for Groups", ) @api.constrains("manual_user_ids", "group_ids") diff --git a/default_multi_user/tests/test_default_multi_user.py b/default_multi_user/tests/test_default_multi_user.py index 0cc5ec97f0..95829dd971 100644 --- a/default_multi_user/tests/test_default_multi_user.py +++ b/default_multi_user/tests/test_default_multi_user.py @@ -1,13 +1,12 @@ # Copyright 2020 ForgeFlow S.L. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo.tests import common - import json +from odoo.tests import common -class TestDefaultMultiUser(common.SavepointCase): +class TestDefaultMultiUser(common.SavepointCase): @classmethod def setUpClass(cls): super().setUpClass() @@ -21,48 +20,54 @@ def setUpClass(cls): cls.field = cls.env.ref("base.field_res_partner__phone") cls.group_user = cls.env.ref("base.group_user") cls.group_partner = cls.env.ref("base.group_partner_manager") - cls.group_private = cls.env["res.groups"].create({ - "name": "Test Group", - }) + cls.group_private = cls.env["res.groups"].create({"name": "Test Group",}) - cls.user_1 = cls._create_user("user_1", [ - cls.group_user, cls.group_partner, cls.group_private]) + cls.user_1 = cls._create_user( + "user_1", [cls.group_user, cls.group_partner, cls.group_private] + ) cls.user_2 = cls._create_user("user_2", [cls.group_user, cls.group_partner]) - cls.user_3 = cls._create_user("user_3", [ - cls.group_user, cls.group_partner, cls.group_private]) + cls.user_3 = cls._create_user( + "user_3", [cls.group_user, cls.group_partner, cls.group_private] + ) cls.test_value = "+34 666 777 888" @classmethod def _create_user(self, login, groups): group_ids = [group.id for group in groups] - user = self.user_model.create({ - "name": "Test User", - "login": login, - "password": "demo", - "email": "%s@yourcompany.com" % login, - "groups_id": [(6, 0, group_ids)] - }) + user = self.user_model.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): - self.default_model.create({ - "field_id": self.field.id, - "json_value": json.dumps(self.test_value, ensure_ascii=False), - "user_id": self.user_1.id, - }) + self.default_model.create( + { + "field_id": self.field.id, + "json_value": json.dumps(self.test_value, ensure_ascii=False), + "user_id": self.user_1.id, + } + ) rec_1 = self.partner_model.sudo(self.user_1).create({"name": "Test"}) self.assertEqual(rec_1.phone, self.test_value) rec_2 = self.partner_model.sudo(self.user_2).create({"name": "Test"}) self.assertNotEqual(rec_2.phone, self.test_value) def test_02_multi_user(self): - test_default = self.default_model.create({ - "field_id": self.field.id, - "json_value": json.dumps(self.test_value, ensure_ascii=False), - "user_id": self.user_1.id, - "manual_user_ids": [(6, 0, (self.user_1 + self.user_2).ids)], - }) + test_default = self.default_model.create( + { + "field_id": self.field.id, + "json_value": json.dumps(self.test_value, ensure_ascii=False), + "user_id": self.user_1.id, + "manual_user_ids": [(6, 0, (self.user_1 + self.user_2).ids)], + } + ) self.assertIn(self.user_1, test_default.user_ids) self.assertIn(self.user_2, test_default.user_ids) rec_1 = self.partner_model.sudo(self.user_1).create({"name": "Test"}) @@ -73,16 +78,20 @@ def test_02_multi_user(self): def test_03_group_default(self): # Global default - expected for user 2 global_value = "+01 564 879 123" - self.default_model.create({ - "field_id": self.field.id, - "json_value": json.dumps(global_value, ensure_ascii=False), - }) + self.default_model.create( + { + "field_id": self.field.id, + "json_value": json.dumps(global_value, ensure_ascii=False), + } + ) # Group specific default - expected for user 1 and 3 - test_default = self.default_model.create({ - "field_id": self.field.id, - "json_value": json.dumps(self.test_value, ensure_ascii=False), - "group_ids": [(6, 0, self.group_private.ids)], - }) + test_default = self.default_model.create( + { + "field_id": self.field.id, + "json_value": json.dumps(self.test_value, ensure_ascii=False), + "group_ids": [(6, 0, self.group_private.ids)], + } + ) self.assertIn(self.user_1, test_default.user_ids) self.assertIn(self.user_3, test_default.user_ids) rec_1 = self.partner_model.sudo(self.user_1).create({"name": "Test"}) @@ -93,11 +102,13 @@ def test_03_group_default(self): self.assertEqual(rec_3.phone, self.test_value) def test_04_multi_user_no_alternative(self): - test_default = self.default_model.create({ - "field_id": self.field.id, - "json_value": json.dumps(self.test_value, ensure_ascii=False), - "manual_user_ids": [(6, 0, self.user_2.ids)], - }) + test_default = self.default_model.create( + { + "field_id": self.field.id, + "json_value": json.dumps(self.test_value, ensure_ascii=False), + "manual_user_ids": [(6, 0, self.user_2.ids)], + } + ) self.assertNotIn(self.user_1, test_default.user_ids) self.assertIn(self.user_2, test_default.user_ids) rec_1 = self.partner_model.sudo(self.user_1).create({"name": "Test"}) diff --git a/default_multi_user/views/ir_default_view.xml b/default_multi_user/views/ir_default_view.xml index c0441707c1..1082f9d1bd 100644 --- a/default_multi_user/views/ir_default_view.xml +++ b/default_multi_user/views/ir_default_view.xml @@ -1,45 +1,45 @@ - + - ir.default.form - default_multi_user ir.default - + - - + + Owner - ir.default.tree - default_multi_user ir.default - + - - + + - ir.default.search - default_multi_user ir.default - + - - + + - From 4f6914f2c5afecaf71dfa9282863d27050ac3953 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Wed, 22 Jul 2020 16:16:53 +0200 Subject: [PATCH 04/13] [13.0][MIG] default_multi_user --- default_multi_user/README.rst | 10 ++++---- default_multi_user/__manifest__.py | 6 ++--- .../i18n/default_multi_user.pot | 7 +++--- .../static/description/index.html | 6 ++--- .../tests/test_default_multi_user.py | 24 +++++++++---------- 5 files changed, 26 insertions(+), 27 deletions(-) diff --git a/default_multi_user/README.rst b/default_multi_user/README.rst index 39874e1d95..97809b70b9 100644 --- a/default_multi_user/README.rst +++ b/default_multi_user/README.rst @@ -14,13 +14,13 @@ Default 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/12.0/default_multi_user + :target: https://github.com/OCA/server-ux/tree/13.0/default_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-12-0/server-ux-12-0-default_multi_user + :target: https://translation.odoo-community.org/projects/server-ux-13-0/server-ux-13-0-default_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/12.0 + :target: https://runbot.odoo-community.org/runbot/250/13.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -47,7 +47,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. @@ -85,6 +85,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/default_multi_user/__manifest__.py b/default_multi_user/__manifest__.py index 2371176c57..5e9fad1ae9 100644 --- a/default_multi_user/__manifest__.py +++ b/default_multi_user/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Default Multi User", "summary": "Allows to share user-defined defaults among several users.", - "version": "12.0.1.0.0", + "version": "13.0.1.0.0", "development_status": "Beta", "maintainers": ["LoisRForgeFlow"], "category": "Tools", @@ -11,7 +11,7 @@ "author": "ForgeFlow, Odoo Community Association (OCA)", "license": "AGPL-3", "installable": True, - "depends": ["base",], - "data": ["views/ir_default_view.xml",], + "depends": ["base"], + "data": ["views/ir_default_view.xml"], "post_load": "post_load_hook", } diff --git a/default_multi_user/i18n/default_multi_user.pot b/default_multi_user/i18n/default_multi_user.pot index 60a2289372..75a4bf6fb1 100644 --- a/default_multi_user/i18n/default_multi_user.pot +++ b/default_multi_user/i18n/default_multi_user.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * default_multi_user +# * default_multi_user # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -38,4 +38,3 @@ msgstr "" #: model:ir.model.fields,field_description:default_multi_user.field_ir_default__user_ids msgid "Users" msgstr "" - diff --git a/default_multi_user/static/description/index.html b/default_multi_user/static/description/index.html index 8bc82ca3aa..0e4ae11517 100644 --- a/default_multi_user/static/description/index.html +++ b/default_multi_user/static/description/index.html @@ -367,7 +367,7 @@

Default Multi User

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

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

+

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

Allows to share user-defined defaults among several users.

Table of contents

@@ -396,7 +396,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.

@@ -422,7 +422,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/default_multi_user/tests/test_default_multi_user.py b/default_multi_user/tests/test_default_multi_user.py index 95829dd971..dd1277258c 100644 --- a/default_multi_user/tests/test_default_multi_user.py +++ b/default_multi_user/tests/test_default_multi_user.py @@ -20,7 +20,7 @@ def setUpClass(cls): cls.field = cls.env.ref("base.field_res_partner__phone") cls.group_user = cls.env.ref("base.group_user") cls.group_partner = cls.env.ref("base.group_partner_manager") - cls.group_private = cls.env["res.groups"].create({"name": "Test Group",}) + cls.group_private = cls.env["res.groups"].create({"name": "Test Group"}) cls.user_1 = cls._create_user( "user_1", [cls.group_user, cls.group_partner, cls.group_private] @@ -33,9 +33,9 @@ def setUpClass(cls): cls.test_value = "+34 666 777 888" @classmethod - def _create_user(self, login, groups): + def _create_user(cls, login, groups): group_ids = [group.id for group in groups] - user = self.user_model.create( + user = cls.user_model.create( { "name": "Test User", "login": login, @@ -54,9 +54,9 @@ def test_01_no_multi_user(self): "user_id": self.user_1.id, } ) - rec_1 = self.partner_model.sudo(self.user_1).create({"name": "Test"}) + rec_1 = self.partner_model.with_user(self.user_1).create({"name": "Test"}) self.assertEqual(rec_1.phone, self.test_value) - rec_2 = self.partner_model.sudo(self.user_2).create({"name": "Test"}) + rec_2 = self.partner_model.with_user(self.user_2).create({"name": "Test"}) self.assertNotEqual(rec_2.phone, self.test_value) def test_02_multi_user(self): @@ -70,9 +70,9 @@ def test_02_multi_user(self): ) self.assertIn(self.user_1, test_default.user_ids) self.assertIn(self.user_2, test_default.user_ids) - rec_1 = self.partner_model.sudo(self.user_1).create({"name": "Test"}) + rec_1 = self.partner_model.with_user(self.user_1).create({"name": "Test"}) self.assertEqual(rec_1.phone, self.test_value) - rec_2 = self.partner_model.sudo(self.user_2).create({"name": "Test"}) + rec_2 = self.partner_model.with_user(self.user_2).create({"name": "Test"}) self.assertEqual(rec_2.phone, self.test_value) def test_03_group_default(self): @@ -94,11 +94,11 @@ def test_03_group_default(self): ) self.assertIn(self.user_1, test_default.user_ids) self.assertIn(self.user_3, test_default.user_ids) - rec_1 = self.partner_model.sudo(self.user_1).create({"name": "Test"}) + rec_1 = self.partner_model.with_user(self.user_1).create({"name": "Test"}) self.assertEqual(rec_1.phone, self.test_value) - rec_2 = self.partner_model.sudo(self.user_2).create({"name": "Test"}) + rec_2 = self.partner_model.with_user(self.user_2).create({"name": "Test"}) self.assertEqual(rec_2.phone, global_value) - rec_3 = self.partner_model.sudo(self.user_3).create({"name": "Test"}) + rec_3 = self.partner_model.with_user(self.user_3).create({"name": "Test"}) self.assertEqual(rec_3.phone, self.test_value) def test_04_multi_user_no_alternative(self): @@ -111,7 +111,7 @@ def test_04_multi_user_no_alternative(self): ) self.assertNotIn(self.user_1, test_default.user_ids) self.assertIn(self.user_2, test_default.user_ids) - rec_1 = self.partner_model.sudo(self.user_1).create({"name": "Test"}) + rec_1 = self.partner_model.with_user(self.user_1).create({"name": "Test"}) self.assertNotEqual(rec_1.phone, self.test_value) - rec_2 = self.partner_model.sudo(self.user_2).create({"name": "Test"}) + rec_2 = self.partner_model.with_user(self.user_2).create({"name": "Test"}) self.assertEqual(rec_2.phone, self.test_value) From 2ab474c12b3d4c6357e21c64e58bff6650bb5a89 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Fri, 23 Oct 2020 10:54:03 +0200 Subject: [PATCH 05/13] [13.0][FIX] default_multi_user: multi company issue is incorrect to relay in the company_id field in the res_users table, we should use environment company instead. --- default_multi_user/__manifest__.py | 2 +- default_multi_user/models/ir_default.py | 4 +-- .../tests/test_default_multi_user.py | 34 ++++++++++++++++++- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/default_multi_user/__manifest__.py b/default_multi_user/__manifest__.py index 5e9fad1ae9..6135f33c23 100644 --- a/default_multi_user/__manifest__.py +++ b/default_multi_user/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Default Multi User", "summary": "Allows to share user-defined defaults among several users.", - "version": "13.0.1.0.0", + "version": "13.0.1.0.1", "development_status": "Beta", "maintainers": ["LoisRForgeFlow"], "category": "Tools", diff --git a/default_multi_user/models/ir_default.py b/default_multi_user/models/ir_default.py index 1197895a1a..86c55c324a 100644 --- a/default_multi_user/models/ir_default.py +++ b/default_multi_user/models/ir_default.py @@ -41,11 +41,11 @@ def _get_model_defaults_query_and_params(self, model_name, condition): WHERE f.model=%s AND ((d.user_id IS NULL AND m.res_users_id IS NULL) OR d.user_id=u.id OR m.res_users_id = u.id) - AND (d.company_id IS NULL OR d.company_id=u.company_id) + AND (d.company_id IS NULL OR d.company_id=%s) AND {} ORDER BY d.user_id, m.res_users_id, d.company_id, d.id """ - params = [self.env.uid, model_name] + params = [self.env.uid, model_name, self.env.company.id or None] if condition: query = query.format("d.condition=%s") params.append(condition) diff --git a/default_multi_user/tests/test_default_multi_user.py b/default_multi_user/tests/test_default_multi_user.py index dd1277258c..0442f14eaf 100644 --- a/default_multi_user/tests/test_default_multi_user.py +++ b/default_multi_user/tests/test_default_multi_user.py @@ -16,6 +16,10 @@ def setUpClass(cls): cls.default_model = cls.env["ir.default"] cls.user_model = cls.env["res.users"] cls.partner_model = cls.env["res.partner"] + cls.company_model = cls.env["res.company"] + + cls.main_company = cls.env.ref("base.main_company") + cls.other_company = cls.company_model.create({"name": "Test Company"}) cls.field = cls.env.ref("base.field_res_partner__phone") cls.group_user = cls.env.ref("base.group_user") @@ -29,11 +33,18 @@ def setUpClass(cls): cls.user_3 = cls._create_user( "user_3", [cls.group_user, cls.group_partner, cls.group_private] ) + cls.user_4 = cls._create_user( + "user_4", + [cls.group_user, cls.group_partner, cls.group_private], + cls.other_company, + ) cls.test_value = "+34 666 777 888" @classmethod - def _create_user(cls, login, groups): + def _create_user(cls, login, groups, company=False): + if not company: + company = cls.main_company group_ids = [group.id for group in groups] user = cls.user_model.create( { @@ -42,6 +53,8 @@ def _create_user(cls, login, groups): "password": "demo", "email": "%s@yourcompany.com" % login, "groups_id": [(6, 0, group_ids)], + "company_id": company.id, + "company_ids": [(6, 0, [cls.main_company.id, cls.other_company.id])], } ) return user @@ -115,3 +128,22 @@ def test_04_multi_user_no_alternative(self): self.assertNotEqual(rec_1.phone, self.test_value) rec_2 = self.partner_model.with_user(self.user_2).create({"name": "Test"}) self.assertEqual(rec_2.phone, self.test_value) + + def test_05_multi_company(self): + # Global for main company + self.default_model.create( + { + "field_id": self.field.id, + "json_value": json.dumps(self.test_value, ensure_ascii=False), + "company_id": self.main_company.id, + } + ) + rec_1 = self.partner_model.with_user(self.user_2).create({"name": "Test"}) + self.assertEqual(rec_1.phone, self.test_value) + # User in other company does not get the default. + rec_2 = self.partner_model.with_user(self.user_4).create({"name": "Test"}) + self.assertNotEqual(rec_2.phone, self.test_value) + # User 1 switch company. Does not get the default. + self.user_1.company_id = self.other_company + rec_3 = self.partner_model.with_user(self.user_1).create({"name": "Test"}) + self.assertNotEqual(rec_3.phone, self.test_value) From b624489b2ac25b82c867918b3e2e08c620d936e7 Mon Sep 17 00:00:00 2001 From: schhatbar Date: Mon, 1 Mar 2021 19:01:34 +0530 Subject: [PATCH 06/13] [IMP] default_multi_user: black, isort, prettier --- default_multi_user/__manifest__.py | 2 +- default_multi_user/models/ir_default.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/default_multi_user/__manifest__.py b/default_multi_user/__manifest__.py index 6135f33c23..fe77fc55cd 100644 --- a/default_multi_user/__manifest__.py +++ b/default_multi_user/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Default Multi User", "summary": "Allows to share user-defined defaults among several users.", - "version": "13.0.1.0.1", + "version": "14.0.1.0.1", "development_status": "Beta", "maintainers": ["LoisRForgeFlow"], "category": "Tools", diff --git a/default_multi_user/models/ir_default.py b/default_multi_user/models/ir_default.py index 86c55c324a..ef07e1a2e6 100644 --- a/default_multi_user/models/ir_default.py +++ b/default_multi_user/models/ir_default.py @@ -22,7 +22,8 @@ class IrDefaultgard(models.Model): relation="ir_default_res_users_manual_rel", ) group_ids = fields.Many2many( - comodel_name="res.groups", string="Available for Groups", + comodel_name="res.groups", + string="Available for Groups", ) @api.constrains("manual_user_ids", "group_ids") From 8179136a90472e6f56567069120b9e8231e5920a Mon Sep 17 00:00:00 2001 From: schhatbar Date: Mon, 1 Mar 2021 19:05:13 +0530 Subject: [PATCH 07/13] [14.0][MIG]default_multi_user --- default_multi_user/README.rst | 11 ++-- default_multi_user/__manifest__.py | 2 +- .../i18n/default_multi_user.pot | 17 +++++- default_multi_user/i18n/es.po | 58 +++++++++++++++++++ default_multi_user/i18n/pt.po | 58 +++++++++++++++++++ default_multi_user/readme/CONTRIBUTORS.rst | 1 + .../static/description/index.html | 7 ++- .../tests/test_default_multi_user.py | 3 +- 8 files changed, 146 insertions(+), 11 deletions(-) create mode 100644 default_multi_user/i18n/es.po create mode 100644 default_multi_user/i18n/pt.po diff --git a/default_multi_user/README.rst b/default_multi_user/README.rst index 97809b70b9..701fa98a1d 100644 --- a/default_multi_user/README.rst +++ b/default_multi_user/README.rst @@ -14,13 +14,13 @@ Default 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/13.0/default_multi_user + :target: https://github.com/OCA/server-ux/tree/14.0/default_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-13-0/server-ux-13-0-default_multi_user + :target: https://translation.odoo-community.org/projects/server-ux-14-0/server-ux-14-0-default_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/13.0 + :target: https://runbot.odoo-community.org/runbot/250/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -47,7 +47,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. @@ -63,6 +63,7 @@ Contributors ~~~~~~~~~~~~ * Lois Rilo +* Sunanda Chhatbar Maintainers ~~~~~~~~~~~ @@ -85,6 +86,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/default_multi_user/__manifest__.py b/default_multi_user/__manifest__.py index fe77fc55cd..5ec84cec97 100644 --- a/default_multi_user/__manifest__.py +++ b/default_multi_user/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Default Multi User", "summary": "Allows to share user-defined defaults among several users.", - "version": "14.0.1.0.1", + "version": "14.0.1.0.0", "development_status": "Beta", "maintainers": ["LoisRForgeFlow"], "category": "Tools", diff --git a/default_multi_user/i18n/default_multi_user.pot b/default_multi_user/i18n/default_multi_user.pot index 75a4bf6fb1..552b47f7be 100644 --- a/default_multi_user/i18n/default_multi_user.pot +++ b/default_multi_user/i18n/default_multi_user.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" +"Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -29,6 +29,21 @@ msgstr "" msgid "Default Values" msgstr "" +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__display_name +msgid "Display Name" +msgstr "" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__id +msgid "ID" +msgstr "" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default____last_update +msgid "Last Modified on" +msgstr "" + #. module: default_multi_user #: model_terms:ir.ui.view,arch_db:default_multi_user.ir_default_view_form msgid "Owner" diff --git a/default_multi_user/i18n/es.po b/default_multi_user/i18n/es.po new file mode 100644 index 0000000000..c6e8f12979 --- /dev/null +++ b/default_multi_user/i18n/es.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * default_multi_user +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-03-16 11:46+0000\n" +"Last-Translator: Ana Suárez \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__group_ids +msgid "Available for Groups" +msgstr "Disponible para Grupos" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__manual_user_ids +#: model_terms:ir.ui.view,arch_db:default_multi_user.ir_default_view_tree +msgid "Available for Users" +msgstr "Disponible para Usuarios" + +#. module: default_multi_user +#: model:ir.model,name:default_multi_user.model_ir_default +msgid "Default Values" +msgstr "Valores por defecto" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__id +msgid "ID" +msgstr "ID" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: default_multi_user +#: model_terms:ir.ui.view,arch_db:default_multi_user.ir_default_view_form +msgid "Owner" +msgstr "Propietario" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__user_ids +msgid "Users" +msgstr "Usuarios" diff --git a/default_multi_user/i18n/pt.po b/default_multi_user/i18n/pt.po new file mode 100644 index 0000000000..cdb31046ee --- /dev/null +++ b/default_multi_user/i18n/pt.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * default_multi_user +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-07-02 22:51+0000\n" +"Last-Translator: Pedro Castro Silva \n" +"Language-Team: none\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__group_ids +msgid "Available for Groups" +msgstr "Disponível para Grupos" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__manual_user_ids +#: model_terms:ir.ui.view,arch_db:default_multi_user.ir_default_view_tree +msgid "Available for Users" +msgstr "Disponível para Utilizadores" + +#. module: default_multi_user +#: model:ir.model,name:default_multi_user.model_ir_default +msgid "Default Values" +msgstr "Valore Pré-definidos" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__display_name +msgid "Display Name" +msgstr "Nome a Exibir" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__id +msgid "ID" +msgstr "ID" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default____last_update +msgid "Last Modified on" +msgstr "Última Modificação em" + +#. module: default_multi_user +#: model_terms:ir.ui.view,arch_db:default_multi_user.ir_default_view_form +msgid "Owner" +msgstr "Proprietário" + +#. module: default_multi_user +#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__user_ids +msgid "Users" +msgstr "Utilizadores" diff --git a/default_multi_user/readme/CONTRIBUTORS.rst b/default_multi_user/readme/CONTRIBUTORS.rst index 77dfbe89e9..95697c420f 100644 --- a/default_multi_user/readme/CONTRIBUTORS.rst +++ b/default_multi_user/readme/CONTRIBUTORS.rst @@ -1 +1,2 @@ * Lois Rilo +* Sunanda Chhatbar diff --git a/default_multi_user/static/description/index.html b/default_multi_user/static/description/index.html index 0e4ae11517..60f4a459d9 100644 --- a/default_multi_user/static/description/index.html +++ b/default_multi_user/static/description/index.html @@ -367,7 +367,7 @@

Default Multi User

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

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

+

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

Allows to share user-defined defaults among several users.

Table of contents

@@ -396,7 +396,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.

@@ -411,6 +411,7 @@

Authors

Contributors

@@ -422,7 +423,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/default_multi_user/tests/test_default_multi_user.py b/default_multi_user/tests/test_default_multi_user.py index 0442f14eaf..9a640e7072 100644 --- a/default_multi_user/tests/test_default_multi_user.py +++ b/default_multi_user/tests/test_default_multi_user.py @@ -3,9 +3,10 @@ import json -from odoo.tests import common +from odoo.tests import common, tagged +@tagged("post_install", "-at_install") class TestDefaultMultiUser(common.SavepointCase): @classmethod def setUpClass(cls): From b6d92cc530c00bf6c8a1e6b88de0025cbee02c7f Mon Sep 17 00:00:00 2001 From: mariadforgeflow Date: Thu, 9 Dec 2021 12:52:23 +0100 Subject: [PATCH 08/13] [MIG] default_multi_user: Migration to 15.0 --- default_multi_user/README.rst | 23 +++++----- default_multi_user/__manifest__.py | 2 +- .../i18n/default_multi_user.pot | 17 +------ default_multi_user/i18n/es.po | 24 ++++------ default_multi_user/i18n/pt.po | 24 ++++------ .../static/description/index.html | 44 ++++++++++--------- .../tests/test_default_multi_user.py | 2 +- 7 files changed, 57 insertions(+), 79 deletions(-) diff --git a/default_multi_user/README.rst b/default_multi_user/README.rst index 701fa98a1d..3729463733 100644 --- a/default_multi_user/README.rst +++ b/default_multi_user/README.rst @@ -2,10 +2,13 @@ Default Multi User ================== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:099007e322d391e66c7501059dfa2fc51827ab8c8f05fe86d0c0b2c42f32e207 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -14,16 +17,16 @@ Default 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/14.0/default_multi_user + :target: https://github.com/OCA/server-ux/tree/15.0/default_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-14-0/server-ux-14-0-default_multi_user + :target: https://translation.odoo-community.org/projects/server-ux-15-0/server-ux-15-0-default_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/14.0 - :alt: Try me on Runbot +.. |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=15.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| Allows to share user-defined defaults among several users. @@ -46,8 +49,8 @@ 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 `_. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -86,6 +89,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/default_multi_user/__manifest__.py b/default_multi_user/__manifest__.py index 5ec84cec97..a82f2aa15e 100644 --- a/default_multi_user/__manifest__.py +++ b/default_multi_user/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Default Multi User", "summary": "Allows to share user-defined defaults among several users.", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "development_status": "Beta", "maintainers": ["LoisRForgeFlow"], "category": "Tools", diff --git a/default_multi_user/i18n/default_multi_user.pot b/default_multi_user/i18n/default_multi_user.pot index 552b47f7be..ef2ca32ced 100644 --- a/default_multi_user/i18n/default_multi_user.pot +++ b/default_multi_user/i18n/default_multi_user.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -29,21 +29,6 @@ msgstr "" msgid "Default Values" msgstr "" -#. module: default_multi_user -#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__display_name -msgid "Display Name" -msgstr "" - -#. module: default_multi_user -#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__id -msgid "ID" -msgstr "" - -#. module: default_multi_user -#: model:ir.model.fields,field_description:default_multi_user.field_ir_default____last_update -msgid "Last Modified on" -msgstr "" - #. module: default_multi_user #: model_terms:ir.ui.view,arch_db:default_multi_user.ir_default_view_form msgid "Owner" diff --git a/default_multi_user/i18n/es.po b/default_multi_user/i18n/es.po index c6e8f12979..4a966b0a60 100644 --- a/default_multi_user/i18n/es.po +++ b/default_multi_user/i18n/es.po @@ -32,21 +32,6 @@ msgstr "Disponible para Usuarios" msgid "Default Values" msgstr "Valores por defecto" -#. module: default_multi_user -#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__display_name -msgid "Display Name" -msgstr "Nombre mostrado" - -#. module: default_multi_user -#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__id -msgid "ID" -msgstr "ID" - -#. module: default_multi_user -#: model:ir.model.fields,field_description:default_multi_user.field_ir_default____last_update -msgid "Last Modified on" -msgstr "Última modificación el" - #. module: default_multi_user #: model_terms:ir.ui.view,arch_db:default_multi_user.ir_default_view_form msgid "Owner" @@ -56,3 +41,12 @@ msgstr "Propietario" #: model:ir.model.fields,field_description:default_multi_user.field_ir_default__user_ids msgid "Users" msgstr "Usuarios" + +#~ msgid "Display Name" +#~ msgstr "Nombre mostrado" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación el" diff --git a/default_multi_user/i18n/pt.po b/default_multi_user/i18n/pt.po index cdb31046ee..98ac6a4193 100644 --- a/default_multi_user/i18n/pt.po +++ b/default_multi_user/i18n/pt.po @@ -32,21 +32,6 @@ msgstr "Disponível para Utilizadores" msgid "Default Values" msgstr "Valore Pré-definidos" -#. module: default_multi_user -#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__display_name -msgid "Display Name" -msgstr "Nome a Exibir" - -#. module: default_multi_user -#: model:ir.model.fields,field_description:default_multi_user.field_ir_default__id -msgid "ID" -msgstr "ID" - -#. module: default_multi_user -#: model:ir.model.fields,field_description:default_multi_user.field_ir_default____last_update -msgid "Last Modified on" -msgstr "Última Modificação em" - #. module: default_multi_user #: model_terms:ir.ui.view,arch_db:default_multi_user.ir_default_view_form msgid "Owner" @@ -56,3 +41,12 @@ msgstr "Proprietário" #: model:ir.model.fields,field_description:default_multi_user.field_ir_default__user_ids msgid "Users" msgstr "Utilizadores" + +#~ msgid "Display Name" +#~ msgstr "Nome a Exibir" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificação em" diff --git a/default_multi_user/static/description/index.html b/default_multi_user/static/description/index.html index 60f4a459d9..45d3561373 100644 --- a/default_multi_user/static/description/index.html +++ b/default_multi_user/static/description/index.html @@ -1,20 +1,20 @@ - + - + Default Multi User -
-

Default Multi User

+
+ + +Odoo Community Association + +
+

Default 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 defaults among several users.

Table of contents

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

Default Multi User

-

Configuration

+

Configuration

To share a default among several users you need to:

  1. Go to Settings > Technical > Actions > User-defined Defaults.
  2. @@ -394,7 +399,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 @@ -402,22 +407,22 @@

Bug Tracker

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

+
diff --git a/default_multi_user/tests/test_default_multi_user.py b/default_multi_user/tests/test_default_multi_user.py index 16f5584477..29eca7686f 100644 --- a/default_multi_user/tests/test_default_multi_user.py +++ b/default_multi_user/tests/test_default_multi_user.py @@ -52,7 +52,7 @@ def _create_user(cls, login, groups, company=False): "name": "Test User", "login": login, "password": "demo", - "email": "%s@yourcompany.com" % login, + "email": f"{login}@yourcompany.com", "groups_id": [(6, 0, group_ids)], "company_id": company.id, "company_ids": [(6, 0, [cls.main_company.id, cls.other_company.id])], From 76ad18dc2fd01d3f13aa0c55e98a35ed93a6888d Mon Sep 17 00:00:00 2001 From: Don Kendall Date: Fri, 29 May 2026 10:14:01 -0400 Subject: [PATCH 12/13] [IMP] default_multi_user: pre-commit auto fixes Signed-off-by: Don Kendall --- default_multi_user/README.rst | 12 ++++++------ default_multi_user/__manifest__.py | 2 +- default_multi_user/static/description/index.html | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/default_multi_user/README.rst b/default_multi_user/README.rst index 59af00f31c..898bf88835 100644 --- a/default_multi_user/README.rst +++ b/default_multi_user/README.rst @@ -11,7 +11,7 @@ Default Multi User !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:6455c8d38812bcb75572d79b16888592c228004a65eb2f79316c10ca5302a743 + !! source digest: sha256:4f252980e373ac479e8b0ba13f74e1f808bcb10cf72b823cc32c91dbd42539c7 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -21,13 +21,13 @@ Default 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/default_multi_user + :target: https://github.com/OCA/server-ux/tree/19.0/default_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-default_multi_user + :target: https://translation.odoo-community.org/projects/server-ux-19-0/server-ux-19-0-default_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| @@ -54,7 +54,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. @@ -93,6 +93,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/default_multi_user/__manifest__.py b/default_multi_user/__manifest__.py index fd39b74785..a05f312d73 100644 --- a/default_multi_user/__manifest__.py +++ b/default_multi_user/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Default Multi User", "summary": "Allows to share user-defined defaults among several users.", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "development_status": "Beta", "maintainers": ["LoisRForgeFlow"], "category": "Tools", diff --git a/default_multi_user/static/description/index.html b/default_multi_user/static/description/index.html index 0bbb044911..e229e4f95a 100644 --- a/default_multi_user/static/description/index.html +++ b/default_multi_user/static/description/index.html @@ -372,9 +372,9 @@

Default Multi User

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:6455c8d38812bcb75572d79b16888592c228004a65eb2f79316c10ca5302a743 +!! source digest: sha256:4f252980e373ac479e8b0ba13f74e1f808bcb10cf72b823cc32c91dbd42539c7 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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 defaults among several users.

Table of contents

@@ -403,7 +403,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.

@@ -432,7 +432,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.

From 5de84d36de875f6f3587b6264895e8274a1cb0d8 Mon Sep 17 00:00:00 2001 From: Don Kendall Date: Fri, 29 May 2026 10:14:41 -0400 Subject: [PATCH 13/13] [MIG] default_multi_user: Migration to 19.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - res.users m2m: groups_id → group_ids (19.0 res.groups privilege refactor). - res.groups.users → res.groups.user_ids (inverse renamed in 19.0); fixes the _compute_user_ids AttributeError the rename would otherwise raise. Signed-off-by: Don Kendall --- default_multi_user/models/ir_default.py | 2 +- default_multi_user/tests/test_default_multi_user.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/default_multi_user/models/ir_default.py b/default_multi_user/models/ir_default.py index ef07e1a2e6..b347b46c0d 100644 --- a/default_multi_user/models/ir_default.py +++ b/default_multi_user/models/ir_default.py @@ -29,7 +29,7 @@ class IrDefaultgard(models.Model): @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 + rec.user_ids = rec.manual_user_ids + rec.group_ids.user_ids @api.model def _get_model_defaults_query_and_params(self, model_name, condition): diff --git a/default_multi_user/tests/test_default_multi_user.py b/default_multi_user/tests/test_default_multi_user.py index 29eca7686f..1cb508dfef 100644 --- a/default_multi_user/tests/test_default_multi_user.py +++ b/default_multi_user/tests/test_default_multi_user.py @@ -53,7 +53,7 @@ def _create_user(cls, login, groups, company=False): "login": login, "password": "demo", "email": f"{login}@yourcompany.com", - "groups_id": [(6, 0, group_ids)], + "group_ids": [(6, 0, group_ids)], "company_id": company.id, "company_ids": [(6, 0, [cls.main_company.id, cls.other_company.id])], }