From 89d89782d3dbca23cac86ea1e5fcdc47463c0eed Mon Sep 17 00:00:00 2001 From: tslai Date: Fri, 5 Feb 2021 11:28:16 +0800 Subject: [PATCH 01/15] [12.0][ADD] base_model_restrict_update --- base_model_restrict_update/README.rst | 80 ++++ base_model_restrict_update/__init__.py | 1 + base_model_restrict_update/__manifest__.py | 13 + .../i18n/base_model_restrict_update.po | 58 +++ .../i18n/base_model_restrict_update.pot | 56 +++ base_model_restrict_update/i18n/ja_JP.po | 62 +++ base_model_restrict_update/models/__init__.py | 3 + base_model_restrict_update/models/ir_model.py | 14 + .../models/ir_model_access.py | 35 ++ .../models/res_users.py | 18 + .../readme/CONFIGURE.rst | 2 + base_model_restrict_update/readme/CREDITS.rst | 1 + .../readme/DESCRIPTION.rst | 2 + .../static/description/index.html | 426 ++++++++++++++++++ base_model_restrict_update/tests/__init__.py | 1 + .../tests/test_base_model_restrict_update.py | 56 +++ .../views/ir_model_views.xml | 15 + .../views/res_users_views.xml | 18 + 18 files changed, 861 insertions(+) create mode 100644 base_model_restrict_update/README.rst create mode 100644 base_model_restrict_update/__init__.py create mode 100644 base_model_restrict_update/__manifest__.py create mode 100644 base_model_restrict_update/i18n/base_model_restrict_update.po create mode 100644 base_model_restrict_update/i18n/base_model_restrict_update.pot create mode 100644 base_model_restrict_update/i18n/ja_JP.po create mode 100644 base_model_restrict_update/models/__init__.py create mode 100644 base_model_restrict_update/models/ir_model.py create mode 100644 base_model_restrict_update/models/ir_model_access.py create mode 100644 base_model_restrict_update/models/res_users.py create mode 100644 base_model_restrict_update/readme/CONFIGURE.rst create mode 100644 base_model_restrict_update/readme/CREDITS.rst create mode 100644 base_model_restrict_update/readme/DESCRIPTION.rst create mode 100644 base_model_restrict_update/static/description/index.html create mode 100644 base_model_restrict_update/tests/__init__.py create mode 100644 base_model_restrict_update/tests/test_base_model_restrict_update.py create mode 100644 base_model_restrict_update/views/ir_model_views.xml create mode 100644 base_model_restrict_update/views/res_users_views.xml diff --git a/base_model_restrict_update/README.rst b/base_model_restrict_update/README.rst new file mode 100644 index 00000000000..fb86df2fecf --- /dev/null +++ b/base_model_restrict_update/README.rst @@ -0,0 +1,80 @@ +===================== +Update Restrict Model +===================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github + :target: https://github.com/OCA/server-tools/tree/12.0/base_model_restrict_update + :alt: OCA/server-tools +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-tools-12-0/server-tools-12-0-base_model_restrict_update + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/149/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds a config to apply a global update restriction to specific model, +while only certain users can update the records if the config is enabled. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Enable the "Update Restrict Model" of specific model to restrict update from unpermitted users. +To set an user as a permitted user to update restricted model(s), click on "Grant Update Permit" in user form. + +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 +~~~~~~~ + +* Quartile Limited + +Other credits +~~~~~~~~~~~~~ + +* This module borrows the idea from 'Moises Lopez ' + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/server-tools `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_model_restrict_update/__init__.py b/base_model_restrict_update/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/base_model_restrict_update/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/base_model_restrict_update/__manifest__.py b/base_model_restrict_update/__manifest__.py new file mode 100644 index 00000000000..6e52e666e37 --- /dev/null +++ b/base_model_restrict_update/__manifest__.py @@ -0,0 +1,13 @@ +# Copyright 2021 Quartile Limited +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +{ + "name": "Update Restrict Model", + "version": "12.0.1.0.0", + "depends": ["base"], + "website": "https://github.com/OCA/server-tools", + "author": "Odoo Community Association (OCA), Quartile Limited", + "category": "Others", + "license": "LGPL-3", + "data": ["views/ir_model_views.xml", "views/res_users_views.xml"], + "installable": True, +} diff --git a/base_model_restrict_update/i18n/base_model_restrict_update.po b/base_model_restrict_update/i18n/base_model_restrict_update.po new file mode 100644 index 00000000000..f7ba20e357c --- /dev/null +++ b/base_model_restrict_update/i18n/base_model_restrict_update.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_model_restrict_update +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: base_model_restrict_update +#: model:ir.model,name:base_model_restrict_update.model_ir_model_access +msgid "Model Access" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model,name:base_model_restrict_update.model_ir_model +msgid "Models" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model.fields,help:base_model_restrict_update.field_res_users__unrestrict_model_update +msgid "Set to true and the user can update restricted model." +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__unrestrict_model_update +msgid "Unrestrict Model Update" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model__restrict_update +msgid "Update Restrict Model" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model,name:base_model_restrict_update.model_res_users +msgid "Users" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model.fields,help:base_model_restrict_update.field_ir_model__restrict_update +msgid "" +"When selected, the model is restricted to read-only unless the user has the " +"special permission." +msgstr "" + +#. module: base_model_restrict_update +#: code:addons/base_model_restrict_update/models/ir_model_access.py:31 +#, python-format +msgid "You are only allowed to read this record. (%s - %s)" +msgstr "" diff --git a/base_model_restrict_update/i18n/base_model_restrict_update.pot b/base_model_restrict_update/i18n/base_model_restrict_update.pot new file mode 100644 index 00000000000..5e34a514e6f --- /dev/null +++ b/base_model_restrict_update/i18n/base_model_restrict_update.pot @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_model_restrict_update +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.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: base_model_restrict_update +#: model:ir.model,name:base_model_restrict_update.model_ir_model_access +msgid "Model Access" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model,name:base_model_restrict_update.model_ir_model +msgid "Models" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model.fields,help:base_model_restrict_update.field_res_users__unrestrict_model_update +msgid "Set to true and the user can update restricted model." +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__unrestrict_model_update +msgid "Unrestrict Model Update" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model__restrict_update +msgid "Update Restrict Model" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model,name:base_model_restrict_update.model_res_users +msgid "Users" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model.fields,help:base_model_restrict_update.field_ir_model__restrict_update +msgid "When selected, the model is restricted to read-only unless the user has the special permission." +msgstr "" + +#. module: base_model_restrict_update +#: code:addons/base_model_restrict_update/models/ir_model_access.py:31 +#, python-format +msgid "You are only allowed to read this record. (%s - %s)" +msgstr "" + diff --git a/base_model_restrict_update/i18n/ja_JP.po b/base_model_restrict_update/i18n/ja_JP.po new file mode 100644 index 00000000000..09564531b0f --- /dev/null +++ b/base_model_restrict_update/i18n/ja_JP.po @@ -0,0 +1,62 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_model_restrict_update +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-02-04 09:47+0000\n" +"PO-Revision-Date: 2021-02-04 09:47+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: base_model_restrict_update +#: model:ir.model,name:base_model_restrict_update.model_ir_model_access +msgid "Model Access" +msgstr "モデルアクセス" + +#. module: base_model_restrict_update +#: model:ir.model,name:base_model_restrict_update.model_ir_model +msgid "Models" +msgstr "モデル" + +#. module: base_model_restrict_update +#: model:ir.model.fields,help:base_model_restrict_update.field_res_users__unrestrict_model_update +msgid "Set to true and the user can update restricted model." +msgstr "有効化にすると制限されたモデルを更新することができます。" + +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__unrestrict_model_update +msgid "Unrestrict Model Update" +msgstr "制限モデル更新許可" + +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model__restrict_update +msgid "Update Restrict Model" +msgstr "更新制限モデル" + +#. module: base_model_restrict_update +#: model:ir.model,name:base_model_restrict_update.model_res_users +msgid "Users" +msgstr "ユーザ" + +#. module: base_model_restrict_update +#: model:ir.model.fields,help:base_model_restrict_update.field_ir_model__restrict_update +msgid "" +"When selected, the model is restricted to read-only unless the user has the " +"special permission." +msgstr "" +"有効化にすると、「制限モデル更新許可」を持ちユーザのみモデルレコードを更新で" +"きます。" + +#. module: base_model_restrict_update +#: code:addons/base_model_restrict_update/models/ir_model_access.py:31 +#, python-format +msgid "You are only allowed to read this record. (%s - %s)" +msgstr "レコードを更新することはできません。(%s - %s)" diff --git a/base_model_restrict_update/models/__init__.py b/base_model_restrict_update/models/__init__.py new file mode 100644 index 00000000000..4f02d73ba29 --- /dev/null +++ b/base_model_restrict_update/models/__init__.py @@ -0,0 +1,3 @@ +from . import ir_model_access +from . import ir_model +from . import res_users diff --git a/base_model_restrict_update/models/ir_model.py b/base_model_restrict_update/models/ir_model.py new file mode 100644 index 00000000000..a60b6b8759d --- /dev/null +++ b/base_model_restrict_update/models/ir_model.py @@ -0,0 +1,14 @@ +# Copyright 2021 Quartile Limited +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import fields, models + + +class IrModel(models.Model): + _inherit = "ir.model" + + restrict_update = fields.Boolean( + "Update Restrict Model", + help="When selected, the model is restricted to read-only unless the " + "user has the special permission.", + ) diff --git a/base_model_restrict_update/models/ir_model_access.py b/base_model_restrict_update/models/ir_model_access.py new file mode 100644 index 00000000000..f6d7e0e89ae --- /dev/null +++ b/base_model_restrict_update/models/ir_model_access.py @@ -0,0 +1,35 @@ +# Copyright 2021 Quartile Limited +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import api, models, tools +from odoo.exceptions import AccessError +from odoo.tools.translate import _ + + +class IrModelAccess(models.Model): + _inherit = "ir.model.access" + + @api.model + @tools.ormcache_context( + "self._uid", "model", "mode", "raise_exception", keys=("lang",) + ) + def check(self, model, mode="read", raise_exception=True): + res = super(IrModelAccess, self).check(model, mode, raise_exception) + if self._uid == 1: + return True + self._cr.execute( + "SELECT restrict_update FROM ir_model WHERE model = %s", (model,) + ) + query_res = self._cr.dictfetchall()[0] + if ( + query_res["restrict_update"] + and mode != "read" + and not self.env.user.unrestrict_model_update + ): + if raise_exception: + raise AccessError( + _("You are only allowed to read this record. (%s - %s)") + % (model, mode) + ) + return False + return res diff --git a/base_model_restrict_update/models/res_users.py b/base_model_restrict_update/models/res_users.py new file mode 100644 index 00000000000..053ed6e5965 --- /dev/null +++ b/base_model_restrict_update/models/res_users.py @@ -0,0 +1,18 @@ +# Copyright 2021 Quartile Limited +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import api, fields, models + + +class ResUsers(models.Model): + _inherit = "res.users" + + unrestrict_model_update = fields.Boolean( + "Unrestrict Model Update", + help="Set to true and the user can update restricted model.", + ) + + @api.multi + def toggle_unrestrict_model_update(self): + for record in self: + record.unrestrict_model_update = not record.unrestrict_model_update diff --git a/base_model_restrict_update/readme/CONFIGURE.rst b/base_model_restrict_update/readme/CONFIGURE.rst new file mode 100644 index 00000000000..5ac08602f3e --- /dev/null +++ b/base_model_restrict_update/readme/CONFIGURE.rst @@ -0,0 +1,2 @@ +Enable the "Update Restrict Model" of specific model to restrict update from unpermitted users. +To set an user as a permitted user to update restricted model(s), click on "Grant Update Permit" in user form. diff --git a/base_model_restrict_update/readme/CREDITS.rst b/base_model_restrict_update/readme/CREDITS.rst new file mode 100644 index 00000000000..ac1be061efa --- /dev/null +++ b/base_model_restrict_update/readme/CREDITS.rst @@ -0,0 +1 @@ +* This module borrows the idea from 'Moises Lopez ' diff --git a/base_model_restrict_update/readme/DESCRIPTION.rst b/base_model_restrict_update/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..0a8c8c551c1 --- /dev/null +++ b/base_model_restrict_update/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module adds a config to apply a global update restriction to specific model, +while only certain users can update the records if the config is enabled. diff --git a/base_model_restrict_update/static/description/index.html b/base_model_restrict_update/static/description/index.html new file mode 100644 index 00000000000..3d9f11d1766 --- /dev/null +++ b/base_model_restrict_update/static/description/index.html @@ -0,0 +1,426 @@ + + + + + + +Update Restrict Model + + + +
+

Update Restrict Model

+ + +

Beta License: LGPL-3 OCA/server-tools Translate me on Weblate Try me on Runbot

+

This module adds a config to apply a global update restriction to specific model, +while only certain users can update the records if the config is enabled.

+

Table of contents

+ +
+

Configuration

+

Enable the “Update Restrict Model” of specific model to restrict update from unpermitted users. +To set an user as a permitted user to update restricted model(s), click on “Grant Update Permit” in user form.

+
+
+

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

+
    +
  • Quartile Limited
  • +
+
+
+

Other credits

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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

+

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

+

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

+
+
+
+ + diff --git a/base_model_restrict_update/tests/__init__.py b/base_model_restrict_update/tests/__init__.py new file mode 100644 index 00000000000..6b23d93c704 --- /dev/null +++ b/base_model_restrict_update/tests/__init__.py @@ -0,0 +1 @@ +from . import test_base_model_restrict_update diff --git a/base_model_restrict_update/tests/test_base_model_restrict_update.py b/base_model_restrict_update/tests/test_base_model_restrict_update.py new file mode 100644 index 00000000000..fa3bfd86c93 --- /dev/null +++ b/base_model_restrict_update/tests/test_base_model_restrict_update.py @@ -0,0 +1,56 @@ +# Copyright 2021 Quartile Limited +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo.exceptions import AccessError +from odoo.tests import SavepointCase, tagged + + +@tagged("post_install", "-at_install") +class TestBaseModelRestrictUpdate(SavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner_model = cls.env["ir.model"].search([("model", "=", "res.partner")])[ + 0 + ] + cls.partner_model.restrict_update = True + cls.test_partner = cls.env["res.partner"].create({"name": "Test Partner"}) + cls.restrict_test_user = cls.env["res.users"].create( + { + "name": "Resticted user", + "login": "resticted@example.com", + "unrestrict_model_update": False, + } + ) + cls.permit_test_user = cls.env["res.users"].create( + { + "name": "Permit user", + "login": "permit@example.com", + "email": "permit@example.com", + "unrestrict_model_update": True, + } + ) + + def test_01_create_partner(self): + with self.assertRaises(AccessError): + self.env["res.partner"].sudo(self.restrict_test_user.id).create( + {"name": "Test Partner"} + ) + self.env["res.partner"].sudo(self.permit_test_user.id).create( + {"name": "Test Partner"} + ) + + def test_02_update_partner(self): + with self.assertRaises(AccessError): + self.test_partner.sudo(self.restrict_test_user.id).update( + {"name": "Test Partner 2"} + ) + self.test_partner.sudo(self.permit_test_user.id).update( + {"name": "Test Partner 2"} + ) + + def test_03_unlink_partner(self): + test_partner = self.test_partner.sudo().copy() + with self.assertRaises(AccessError): + test_partner.sudo(self.restrict_test_user.id).unlink() + test_partner.sudo(self.permit_test_user.id).unlink() diff --git a/base_model_restrict_update/views/ir_model_views.xml b/base_model_restrict_update/views/ir_model_views.xml new file mode 100644 index 00000000000..1c17e162b96 --- /dev/null +++ b/base_model_restrict_update/views/ir_model_views.xml @@ -0,0 +1,15 @@ + + + + + ir.model form + ir.model + + + + + + + + + diff --git a/base_model_restrict_update/views/res_users_views.xml b/base_model_restrict_update/views/res_users_views.xml new file mode 100644 index 00000000000..1ad2b129518 --- /dev/null +++ b/base_model_restrict_update/views/res_users_views.xml @@ -0,0 +1,18 @@ + + + + + res.users.form + res.users + + +
+ +
+
+
+ +
From 35e63ef0187743d53cb9b9c99c61b286b55d50e7 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 30 Apr 2021 19:24:15 +0000 Subject: [PATCH 02/15] [ADD] icon.png --- .../static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 base_model_restrict_update/static/description/icon.png diff --git a/base_model_restrict_update/static/description/icon.png b/base_model_restrict_update/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 From 81f9fe52abe6c95d1791f81857054129f9b933e9 Mon Sep 17 00:00:00 2001 From: Kitti U Date: Sun, 5 Sep 2021 13:00:21 +0700 Subject: [PATCH 03/15] [IMP] base_model_restrict_update: black, isort, prettier --- .../views/ir_model_views.xml | 4 ++-- .../views/res_users_views.xml | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/base_model_restrict_update/views/ir_model_views.xml b/base_model_restrict_update/views/ir_model_views.xml index 1c17e162b96..0573ca08ceb 100644 --- a/base_model_restrict_update/views/ir_model_views.xml +++ b/base_model_restrict_update/views/ir_model_views.xml @@ -1,10 +1,10 @@ - + ir.model form ir.model - + diff --git a/base_model_restrict_update/views/res_users_views.xml b/base_model_restrict_update/views/res_users_views.xml index 1ad2b129518..1d16942ee1b 100644 --- a/base_model_restrict_update/views/res_users_views.xml +++ b/base_model_restrict_update/views/res_users_views.xml @@ -1,4 +1,4 @@ - + @@ -7,9 +7,17 @@
-
From 286e06d21ef5e72dced03ebee96fdf84a4571446 Mon Sep 17 00:00:00 2001 From: Kitti U Date: Sun, 5 Sep 2021 13:19:39 +0700 Subject: [PATCH 04/15] [14.0][MIG] base_model_restrict_update --- base_model_restrict_update/__manifest__.py | 2 +- base_model_restrict_update/models/ir_model_access.py | 6 +++--- base_model_restrict_update/models/res_users.py | 3 +-- base_model_restrict_update/readme/CONTRIBUTORS.rst | 7 +++++++ 4 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 base_model_restrict_update/readme/CONTRIBUTORS.rst diff --git a/base_model_restrict_update/__manifest__.py b/base_model_restrict_update/__manifest__.py index 6e52e666e37..27f9057fc47 100644 --- a/base_model_restrict_update/__manifest__.py +++ b/base_model_restrict_update/__manifest__.py @@ -2,7 +2,7 @@ # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). { "name": "Update Restrict Model", - "version": "12.0.1.0.0", + "version": "14.0.1.0.0", "depends": ["base"], "website": "https://github.com/OCA/server-tools", "author": "Odoo Community Association (OCA), Quartile Limited", diff --git a/base_model_restrict_update/models/ir_model_access.py b/base_model_restrict_update/models/ir_model_access.py index f6d7e0e89ae..e5da3aa4612 100644 --- a/base_model_restrict_update/models/ir_model_access.py +++ b/base_model_restrict_update/models/ir_model_access.py @@ -14,13 +14,13 @@ class IrModelAccess(models.Model): "self._uid", "model", "mode", "raise_exception", keys=("lang",) ) def check(self, model, mode="read", raise_exception=True): - res = super(IrModelAccess, self).check(model, mode, raise_exception) - if self._uid == 1: + if self.env.su: return True + res = super().check(model, mode, raise_exception) self._cr.execute( "SELECT restrict_update FROM ir_model WHERE model = %s", (model,) ) - query_res = self._cr.dictfetchall()[0] + query_res = self._cr.dictfetchone() if ( query_res["restrict_update"] and mode != "read" diff --git a/base_model_restrict_update/models/res_users.py b/base_model_restrict_update/models/res_users.py index 053ed6e5965..0c3ce733d8a 100644 --- a/base_model_restrict_update/models/res_users.py +++ b/base_model_restrict_update/models/res_users.py @@ -1,7 +1,7 @@ # Copyright 2021 Quartile Limited # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -from odoo import api, fields, models +from odoo import fields, models class ResUsers(models.Model): @@ -12,7 +12,6 @@ class ResUsers(models.Model): help="Set to true and the user can update restricted model.", ) - @api.multi def toggle_unrestrict_model_update(self): for record in self: record.unrestrict_model_update = not record.unrestrict_model_update diff --git a/base_model_restrict_update/readme/CONTRIBUTORS.rst b/base_model_restrict_update/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..6a2d7b3a99c --- /dev/null +++ b/base_model_restrict_update/readme/CONTRIBUTORS.rst @@ -0,0 +1,7 @@ +* Quartile Limited + + * Yoshi Tashiro + +* Ecosoft + + * Kitti U. From 20fb7edd7028d7751e065ee2a3c366a09fd0add2 Mon Sep 17 00:00:00 2001 From: Kitti U Date: Sun, 5 Sep 2021 14:30:09 +0700 Subject: [PATCH 05/15] [ENH] Add option 'Readonly User' to all models --- base_model_restrict_update/README.rst | 24 ++++++-- .../i18n/base_model_restrict_update.pot | 48 ++++++++++++++-- .../models/ir_model_access.py | 55 +++++++++++++++---- .../models/res_users.py | 17 +++++- .../readme/CONFIGURE.rst | 3 +- .../static/description/index.html | 31 ++++++++--- .../tests/test_base_model_restrict_update.py | 20 +++++-- .../views/res_users_views.xml | 13 +++++ 8 files changed, 172 insertions(+), 39 deletions(-) diff --git a/base_model_restrict_update/README.rst b/base_model_restrict_update/README.rst index fb86df2fecf..3bec3b05b62 100644 --- a/base_model_restrict_update/README.rst +++ b/base_model_restrict_update/README.rst @@ -14,13 +14,13 @@ Update Restrict Model :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github - :target: https://github.com/OCA/server-tools/tree/12.0/base_model_restrict_update + :target: https://github.com/OCA/server-tools/tree/14.0/base_model_restrict_update :alt: OCA/server-tools .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/server-tools-12-0/server-tools-12-0-base_model_restrict_update + :target: https://translation.odoo-community.org/projects/server-tools-14-0/server-tools-14-0-base_model_restrict_update :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/149/12.0 + :target: https://runbot.odoo-community.org/runbot/149/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -37,7 +37,8 @@ Configuration ============= Enable the "Update Restrict Model" of specific model to restrict update from unpermitted users. -To set an user as a permitted user to update restricted model(s), click on "Grant Update Permit" in user form. +To set a user as a permitted user to update restricted model(s), click on "Grant Update Permit" in user form. +Optionally, to set a user as readonly user to all models, click on "Readonly User" in user form. Bug Tracker =========== @@ -45,7 +46,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. @@ -57,6 +58,17 @@ Authors * Quartile Limited +Contributors +~~~~~~~~~~~~ + +* Quartile Limited + + * Yoshi Tashiro + +* Ecosoft + + * Kitti U. + Other credits ~~~~~~~~~~~~~ @@ -75,6 +87,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/server-tools `_ project on GitHub. +This module is part of the `OCA/server-tools `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_model_restrict_update/i18n/base_model_restrict_update.pot b/base_model_restrict_update/i18n/base_model_restrict_update.pot index 5e34a514e6f..a4936a255a7 100644 --- a/base_model_restrict_update/i18n/base_model_restrict_update.pot +++ b/base_model_restrict_update/i18n/base_model_restrict_update.pot @@ -1,18 +1,39 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * base_model_restrict_update +# * base_model_restrict_update # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 14.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" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model__display_name +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model_access__display_name +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__display_name +msgid "Display Name" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model__id +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model_access__id +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__id +msgid "ID" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model____last_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model_access____last_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users____last_update +msgid "Last Modified on" +msgstr "" + #. module: base_model_restrict_update #: model:ir.model,name:base_model_restrict_update.model_ir_model_access msgid "Model Access" @@ -23,6 +44,16 @@ msgstr "" msgid "Models" msgstr "" +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__is_readonly_user +msgid "Ready User" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model.fields,help:base_model_restrict_update.field_res_users__is_readonly_user +msgid "Set to true and the user are readonly user on all models" +msgstr "" + #. module: base_model_restrict_update #: model:ir.model.fields,help:base_model_restrict_update.field_res_users__unrestrict_model_update msgid "Set to true and the user can update restricted model." @@ -45,12 +76,19 @@ msgstr "" #. module: base_model_restrict_update #: model:ir.model.fields,help:base_model_restrict_update.field_ir_model__restrict_update -msgid "When selected, the model is restricted to read-only unless the user has the special permission." +msgid "" +"When selected, the model is restricted to read-only unless the user has the " +"special permission." msgstr "" #. module: base_model_restrict_update -#: code:addons/base_model_restrict_update/models/ir_model_access.py:31 +#: code:addons/base_model_restrict_update/models/ir_model_access.py:0 #, python-format msgid "You are only allowed to read this record. (%s - %s)" msgstr "" +#. module: base_model_restrict_update +#: code:addons/base_model_restrict_update/models/res_users.py:0 +#, python-format +msgid "You cannot set admin user as a readonly user." +msgstr "" diff --git a/base_model_restrict_update/models/ir_model_access.py b/base_model_restrict_update/models/ir_model_access.py index e5da3aa4612..8ba3bb5a8c7 100644 --- a/base_model_restrict_update/models/ir_model_access.py +++ b/base_model_restrict_update/models/ir_model_access.py @@ -11,25 +11,56 @@ class IrModelAccess(models.Model): @api.model @tools.ormcache_context( - "self._uid", "model", "mode", "raise_exception", keys=("lang",) + "self.env.uid", + "self.env.su", + "model", + "mode", + "raise_exception", + keys=("lang",), ) def check(self, model, mode="read", raise_exception=True): if self.env.su: return True res = super().check(model, mode, raise_exception) - self._cr.execute( - "SELECT restrict_update FROM ir_model WHERE model = %s", (model,) - ) - query_res = self._cr.dictfetchone() - if ( - query_res["restrict_update"] - and mode != "read" - and not self.env.user.unrestrict_model_update - ): - if raise_exception: + if mode != "read" and raise_exception: + if self._test_readonly(model) or self._test_restrict_update(model): raise AccessError( _("You are only allowed to read this record. (%s - %s)") % (model, mode) ) - return False return res + + @api.model + def _test_readonly(self, model): + exclude_models = self._readonly_exclude_models() + if model not in exclude_models and self.env.user.is_readonly_user: + return True + return False + + @api.model + def _test_restrict_update(self, model): + self.env.cr.execute( + "SELECT restrict_update FROM ir_model WHERE model = %s", (model,) + ) + query_res = self.env.cr.dictfetchone() + if query_res["restrict_update"] and not self.env.user.unrestrict_model_update: + return True + return False + + @api.model + def _readonly_exclude_models(self): + """ Models updtate/create by system, and should be excluded from checking """ + return ( + self.sudo() + .search( + [ + ("group_id", "=", False), + "|", + ("perm_write", "=", True), + "|", + ("perm_create", "=", True), + ("perm_unlink", "=", True), + ] + ) + .mapped("model_id.model") + ) diff --git a/base_model_restrict_update/models/res_users.py b/base_model_restrict_update/models/res_users.py index 0c3ce733d8a..e3bfc2cb378 100644 --- a/base_model_restrict_update/models/res_users.py +++ b/base_model_restrict_update/models/res_users.py @@ -1,7 +1,8 @@ # Copyright 2021 Quartile Limited # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -from odoo import fields, models +from odoo import _, api, fields, models +from odoo.exceptions import UserError class ResUsers(models.Model): @@ -11,7 +12,21 @@ class ResUsers(models.Model): "Unrestrict Model Update", help="Set to true and the user can update restricted model.", ) + is_readonly_user = fields.Boolean( + "Ready User", + help="Set to true and the user are readonly user on all models", + ) + + @api.constrains("is_readonly_user") + def _check_is_readonly_user(self): + for user in self: + if self.env.ref("base.group_system") in user.groups_id: + raise UserError(_("You cannot set admin user as a readonly user.")) def toggle_unrestrict_model_update(self): for record in self: record.unrestrict_model_update = not record.unrestrict_model_update + + def toggle_is_readonly_user(self): + for record in self: + record.is_readonly_user = not record.is_readonly_user diff --git a/base_model_restrict_update/readme/CONFIGURE.rst b/base_model_restrict_update/readme/CONFIGURE.rst index 5ac08602f3e..850b0ad8672 100644 --- a/base_model_restrict_update/readme/CONFIGURE.rst +++ b/base_model_restrict_update/readme/CONFIGURE.rst @@ -1,2 +1,3 @@ Enable the "Update Restrict Model" of specific model to restrict update from unpermitted users. -To set an user as a permitted user to update restricted model(s), click on "Grant Update Permit" in user form. +To set a user as a permitted user to update restricted model(s), click on "Grant Update Permit" in user form. +Optionally, to set a user as readonly user to all models, click on "Readonly User" in user form. diff --git a/base_model_restrict_update/static/description/index.html b/base_model_restrict_update/static/description/index.html index 3d9f11d1766..8854975ba0d 100644 --- a/base_model_restrict_update/static/description/index.html +++ b/base_model_restrict_update/static/description/index.html @@ -367,7 +367,7 @@

Update Restrict Model

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

Beta License: LGPL-3 OCA/server-tools Translate me on Weblate Try me on Runbot

+

Beta License: LGPL-3 OCA/server-tools Translate me on Weblate Try me on Runbot

This module adds a config to apply a global update restriction to specific model, while only certain users can update the records if the config is enabled.

Table of contents

@@ -377,8 +377,9 @@

Update Restrict Model

  • Bug Tracker
  • Credits
  • @@ -386,14 +387,15 @@

    Update Restrict Model

    Configuration

    Enable the “Update Restrict Model” of specific model to restrict update from unpermitted users. -To set an user as a permitted user to update restricted model(s), click on “Grant Update Permit” in user form.

    +To set a user as a permitted user to update restricted model(s), click on “Grant Update Permit” in user form. +Optionally, to set a user as readonly user to all models, click on “Readonly User” in user form.

    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.

    @@ -404,20 +406,33 @@

    Authors

  • Quartile Limited
  • +
    +

    Contributors

    + +
    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association

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

    -

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

    +

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

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

    diff --git a/base_model_restrict_update/tests/test_base_model_restrict_update.py b/base_model_restrict_update/tests/test_base_model_restrict_update.py index fa3bfd86c93..b098c08813a 100644 --- a/base_model_restrict_update/tests/test_base_model_restrict_update.py +++ b/base_model_restrict_update/tests/test_base_model_restrict_update.py @@ -33,24 +33,32 @@ def setUpClass(cls): def test_01_create_partner(self): with self.assertRaises(AccessError): - self.env["res.partner"].sudo(self.restrict_test_user.id).create( + self.env["res.partner"].with_user(self.restrict_test_user.id).create( {"name": "Test Partner"} ) - self.env["res.partner"].sudo(self.permit_test_user.id).create( + self.env["res.partner"].with_user(self.permit_test_user.id).create( {"name": "Test Partner"} ) def test_02_update_partner(self): with self.assertRaises(AccessError): - self.test_partner.sudo(self.restrict_test_user.id).update( + self.test_partner.with_user(self.restrict_test_user.id).update( {"name": "Test Partner 2"} ) - self.test_partner.sudo(self.permit_test_user.id).update( + self.test_partner.with_user(self.permit_test_user.id).update( {"name": "Test Partner 2"} ) def test_03_unlink_partner(self): test_partner = self.test_partner.sudo().copy() with self.assertRaises(AccessError): - test_partner.sudo(self.restrict_test_user.id).unlink() - test_partner.sudo(self.permit_test_user.id).unlink() + test_partner.with_user(self.restrict_test_user.id).unlink() + test_partner.with_user(self.permit_test_user.id).unlink() + + def test_04_readonly_user_update_partner(self): + self.permit_test_user.toggle_is_readonly_user() + self.assertTrue(self.permit_test_user.is_readonly_user) + with self.assertRaises(AccessError): + self.test_partner.with_user(self.permit_test_user.id).update( + {"name": "Test Partner 2"} + ) diff --git a/base_model_restrict_update/views/res_users_views.xml b/base_model_restrict_update/views/res_users_views.xml index 1d16942ee1b..aa0f5a1e871 100644 --- a/base_model_restrict_update/views/res_users_views.xml +++ b/base_model_restrict_update/views/res_users_views.xml @@ -12,6 +12,7 @@ type="object" class="oe_stat_button" icon="fa-pencil" + attrs="{'invisible': [('is_readonly_user', '=', True)]}" > +
    From 5fbee186f3d387e89e86a8bacadc143b8fdcc84c Mon Sep 17 00:00:00 2001 From: oca-git-bot Date: Wed, 30 Mar 2022 21:12:54 +0200 Subject: [PATCH 06/15] [IMP] update dotfiles --- base_model_restrict_update/models/ir_model_access.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base_model_restrict_update/models/ir_model_access.py b/base_model_restrict_update/models/ir_model_access.py index 8ba3bb5a8c7..142cb862417 100644 --- a/base_model_restrict_update/models/ir_model_access.py +++ b/base_model_restrict_update/models/ir_model_access.py @@ -49,7 +49,7 @@ def _test_restrict_update(self, model): @api.model def _readonly_exclude_models(self): - """ Models updtate/create by system, and should be excluded from checking """ + """Models updtate/create by system, and should be excluded from checking""" return ( self.sudo() .search( From a1cb70fd613da180c9152e09c8c84fb9ed1b5f3f Mon Sep 17 00:00:00 2001 From: Ignacio Buioli Date: Sun, 4 Sep 2022 03:39:28 +0000 Subject: [PATCH 07/15] Added translation using Weblate (Spanish (Argentina)) --- base_model_restrict_update/i18n/es_AR.po | 104 +++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 base_model_restrict_update/i18n/es_AR.po diff --git a/base_model_restrict_update/i18n/es_AR.po b/base_model_restrict_update/i18n/es_AR.po new file mode 100644 index 00000000000..493801b2c71 --- /dev/null +++ b/base_model_restrict_update/i18n/es_AR.po @@ -0,0 +1,104 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_model_restrict_update +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2022-09-04 06:07+0000\n" +"Last-Translator: Ignacio Buioli \n" +"Language-Team: none\n" +"Language: es_AR\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: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model__display_name +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model_access__display_name +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model__id +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model_access__id +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__id +msgid "ID" +msgstr "ID" + +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model____last_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model_access____last_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users____last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: base_model_restrict_update +#: model:ir.model,name:base_model_restrict_update.model_ir_model_access +msgid "Model Access" +msgstr "Modelo de Acceso" + +#. module: base_model_restrict_update +#: model:ir.model,name:base_model_restrict_update.model_ir_model +msgid "Models" +msgstr "Modelos" + +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__is_readonly_user +msgid "Ready User" +msgstr "Usuario Listo" + +#. module: base_model_restrict_update +#: model:ir.model.fields,help:base_model_restrict_update.field_res_users__is_readonly_user +msgid "Set to true and the user are readonly user on all models" +msgstr "" +"Establezcalo como verdadero y el usuario es un usuario de solo lectura en " +"todos los modelos" + +#. module: base_model_restrict_update +#: model:ir.model.fields,help:base_model_restrict_update.field_res_users__unrestrict_model_update +msgid "Set to true and the user can update restricted model." +msgstr "" +"Establezcalo como verdadero y bel usuario podrá actualizar el modelo " +"restringido." + +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__unrestrict_model_update +msgid "Unrestrict Model Update" +msgstr "Actualización del Modelo sin Restricciones" + +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model__restrict_update +msgid "Update Restrict Model" +msgstr "Actualizar Modelo Restricto" + +#. module: base_model_restrict_update +#: model:ir.model,name:base_model_restrict_update.model_res_users +msgid "Users" +msgstr "Usuarios" + +#. module: base_model_restrict_update +#: model:ir.model.fields,help:base_model_restrict_update.field_ir_model__restrict_update +msgid "" +"When selected, the model is restricted to read-only unless the user has the " +"special permission." +msgstr "" +"Cuando está seleccionado, el modelo está restringido a solo lectura a menos " +"que el usuario tenga permisos especiales." + +#. module: base_model_restrict_update +#: code:addons/base_model_restrict_update/models/ir_model_access.py:0 +#, python-format +msgid "You are only allowed to read this record. (%s - %s)" +msgstr "No está permitido para leer este registro. (%s - %s)" + +#. module: base_model_restrict_update +#: code:addons/base_model_restrict_update/models/res_users.py:0 +#, python-format +msgid "You cannot set admin user as a readonly user." +msgstr "" +"No puede configurar al usuario administrador como un usuario de sólo lectura." From dafeeb5f00cdf66c28f043dd9b5869a0555ba720 Mon Sep 17 00:00:00 2001 From: Saran440 Date: Thu, 11 May 2023 16:26:44 +0700 Subject: [PATCH 08/15] [MIG] base_model_restrict_update: Migration to 15.0 --- base_model_restrict_update/__manifest__.py | 2 +- base_model_restrict_update/models/ir_model_access.py | 5 +++-- base_model_restrict_update/models/res_users.py | 1 - 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/base_model_restrict_update/__manifest__.py b/base_model_restrict_update/__manifest__.py index 27f9057fc47..e7cb33e6a2c 100644 --- a/base_model_restrict_update/__manifest__.py +++ b/base_model_restrict_update/__manifest__.py @@ -2,7 +2,7 @@ # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). { "name": "Update Restrict Model", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "depends": ["base"], "website": "https://github.com/OCA/server-tools", "author": "Odoo Community Association (OCA), Quartile Limited", diff --git a/base_model_restrict_update/models/ir_model_access.py b/base_model_restrict_update/models/ir_model_access.py index 142cb862417..0742f43f85e 100644 --- a/base_model_restrict_update/models/ir_model_access.py +++ b/base_model_restrict_update/models/ir_model_access.py @@ -25,8 +25,9 @@ def check(self, model, mode="read", raise_exception=True): if mode != "read" and raise_exception: if self._test_readonly(model) or self._test_restrict_update(model): raise AccessError( - _("You are only allowed to read this record. (%s - %s)") - % (model, mode) + _("You are only allowed to read this record. ({} - {})").format( + model, mode + ) ) return res diff --git a/base_model_restrict_update/models/res_users.py b/base_model_restrict_update/models/res_users.py index e3bfc2cb378..c5254f8ed8d 100644 --- a/base_model_restrict_update/models/res_users.py +++ b/base_model_restrict_update/models/res_users.py @@ -9,7 +9,6 @@ class ResUsers(models.Model): _inherit = "res.users" unrestrict_model_update = fields.Boolean( - "Unrestrict Model Update", help="Set to true and the user can update restricted model.", ) is_readonly_user = fields.Boolean( From 51041bb2af353d45d8f2fd36e77db7ff2420dc8c Mon Sep 17 00:00:00 2001 From: Yoshi Tashiro Date: Sat, 20 May 2023 12:16:35 +0800 Subject: [PATCH 09/15] [FIX] base_model_restrict_update: button presentation Before this commit, button presentation of 'Grant Update Permit' and 'Readonly' were broken in the user form with the deprecation of boolean_button widget. In this commit, we switch to use boolean_toggle for these buttons, with some other style adjustments on the buttons. --- base_model_restrict_update/README.rst | 30 ++++++----- .../i18n/base_model_restrict_update.po | 30 ++++++++++- .../i18n/base_model_restrict_update.pot | 23 +++----- base_model_restrict_update/i18n/es_AR.po | 40 +++++++------- base_model_restrict_update/i18n/ja_JP.po | 36 +++++++++++-- .../models/res_users.py | 8 --- .../readme/CONFIGURE.rst | 7 ++- .../static/description/index.html | 52 ++++++++++--------- .../tests/test_base_model_restrict_update.py | 3 +- .../views/res_users_views.xml | 32 +++++------- 10 files changed, 152 insertions(+), 109 deletions(-) diff --git a/base_model_restrict_update/README.rst b/base_model_restrict_update/README.rst index 3bec3b05b62..ce417c7bc3c 100644 --- a/base_model_restrict_update/README.rst +++ b/base_model_restrict_update/README.rst @@ -2,10 +2,13 @@ Update Restrict Model ===================== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:e7e96b848cc4e880a39f69981f2c0d43245d2ff506b8b02754a94c7ed52ce581 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -14,16 +17,16 @@ Update Restrict Model :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github - :target: https://github.com/OCA/server-tools/tree/14.0/base_model_restrict_update + :target: https://github.com/OCA/server-tools/tree/15.0/base_model_restrict_update :alt: OCA/server-tools .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/server-tools-14-0/server-tools-14-0-base_model_restrict_update + :target: https://translation.odoo-community.org/projects/server-tools-15-0/server-tools-15-0-base_model_restrict_update :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/149/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-tools&target_branch=15.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module adds a config to apply a global update restriction to specific model, while only certain users can update the records if the config is enabled. @@ -37,16 +40,19 @@ Configuration ============= Enable the "Update Restrict Model" of specific model to restrict update from unpermitted users. -To set a user as a permitted user to update restricted model(s), click on "Grant Update Permit" in user form. -Optionally, to set a user as readonly user to all models, click on "Readonly User" in user form. +To set a user as a permitted user to update restricted model(s), click on "Unrestrict +Update" toggle button in the user form. + +Optionally, to set a user as read-only user to all models, click on "Read-only" toggle +button in the user form. 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. @@ -87,6 +93,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/server-tools `_ project on GitHub. +This module is part of the `OCA/server-tools `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_model_restrict_update/i18n/base_model_restrict_update.po b/base_model_restrict_update/i18n/base_model_restrict_update.po index f7ba20e357c..abe409bd45f 100644 --- a/base_model_restrict_update/i18n/base_model_restrict_update.po +++ b/base_model_restrict_update/i18n/base_model_restrict_update.po @@ -14,6 +14,16 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: base_model_restrict_update +#: model_terms:ir.ui.view,arch_db:base_model_restrict_update.view_users_form +msgid "Read-only" +msgstr "" + +#. module: base_model_restrict_update +#: model_terms:ir.ui.view,arch_db:base_model_restrict_update.view_users_form +msgid "Unrestrict Update" +msgstr "" + #. module: base_model_restrict_update #: model:ir.model,name:base_model_restrict_update.model_ir_model_access msgid "Model Access" @@ -24,6 +34,16 @@ msgstr "" msgid "Models" msgstr "" +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__is_readonly_user +msgid "Ready User" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model.fields,help:base_model_restrict_update.field_res_users__is_readonly_user +msgid "Set to true and the user are readonly user on all models" +msgstr "" + #. module: base_model_restrict_update #: model:ir.model.fields,help:base_model_restrict_update.field_res_users__unrestrict_model_update msgid "Set to true and the user can update restricted model." @@ -52,7 +72,13 @@ msgid "" msgstr "" #. module: base_model_restrict_update -#: code:addons/base_model_restrict_update/models/ir_model_access.py:31 +#: code:addons/base_model_restrict_update/models/ir_model_access.py:0 +#, python-format +msgid "You are only allowed to read this record. ({} - {})" +msgstr "" + +#. module: base_model_restrict_update +#: code:addons/base_model_restrict_update/models/res_users.py:0 #, python-format -msgid "You are only allowed to read this record. (%s - %s)" +msgid "You cannot set admin user as a readonly user." msgstr "" diff --git a/base_model_restrict_update/i18n/base_model_restrict_update.pot b/base_model_restrict_update/i18n/base_model_restrict_update.pot index a4936a255a7..7a60fa1a3ba 100644 --- a/base_model_restrict_update/i18n/base_model_restrict_update.pot +++ b/base_model_restrict_update/i18n/base_model_restrict_update.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" @@ -14,24 +14,13 @@ msgstr "" "Plural-Forms: \n" #. module: base_model_restrict_update -#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model__display_name -#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model_access__display_name -#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__display_name -msgid "Display Name" +#: model_terms:ir.ui.view,arch_db:base_model_restrict_update.view_users_form +msgid "Read-only" msgstr "" #. module: base_model_restrict_update -#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model__id -#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model_access__id -#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__id -msgid "ID" -msgstr "" - -#. module: base_model_restrict_update -#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model____last_update -#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model_access____last_update -#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users____last_update -msgid "Last Modified on" +#: model_terms:ir.ui.view,arch_db:base_model_restrict_update.view_users_form +msgid "Unrestrict Update" msgstr "" #. module: base_model_restrict_update @@ -84,7 +73,7 @@ msgstr "" #. module: base_model_restrict_update #: code:addons/base_model_restrict_update/models/ir_model_access.py:0 #, python-format -msgid "You are only allowed to read this record. (%s - %s)" +msgid "You are only allowed to read this record. ({} - {})" msgstr "" #. module: base_model_restrict_update diff --git a/base_model_restrict_update/i18n/es_AR.po b/base_model_restrict_update/i18n/es_AR.po index 493801b2c71..93d290d1b6c 100644 --- a/base_model_restrict_update/i18n/es_AR.po +++ b/base_model_restrict_update/i18n/es_AR.po @@ -17,25 +17,14 @@ msgstr "" "X-Generator: Weblate 4.3.2\n" #. module: base_model_restrict_update -#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model__display_name -#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model_access__display_name -#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__display_name -msgid "Display Name" -msgstr "Mostrar Nombre" - -#. module: base_model_restrict_update -#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model__id -#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model_access__id -#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__id -msgid "ID" -msgstr "ID" +#: model_terms:ir.ui.view,arch_db:base_model_restrict_update.view_users_form +msgid "Read-only" +msgstr "" #. module: base_model_restrict_update -#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model____last_update -#: model:ir.model.fields,field_description:base_model_restrict_update.field_ir_model_access____last_update -#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users____last_update -msgid "Last Modified on" -msgstr "Última modificación en" +#: model_terms:ir.ui.view,arch_db:base_model_restrict_update.view_users_form +msgid "Unrestrict Update" +msgstr "" #. module: base_model_restrict_update #: model:ir.model,name:base_model_restrict_update.model_ir_model_access @@ -93,8 +82,8 @@ msgstr "" #. module: base_model_restrict_update #: code:addons/base_model_restrict_update/models/ir_model_access.py:0 #, python-format -msgid "You are only allowed to read this record. (%s - %s)" -msgstr "No está permitido para leer este registro. (%s - %s)" +msgid "You are only allowed to read this record. ({} - {})" +msgstr "" #. module: base_model_restrict_update #: code:addons/base_model_restrict_update/models/res_users.py:0 @@ -102,3 +91,16 @@ msgstr "No está permitido para leer este registro. (%s - %s)" msgid "You cannot set admin user as a readonly user." msgstr "" "No puede configurar al usuario administrador como un usuario de sólo lectura." + +#~ msgid "Display Name" +#~ msgstr "Mostrar Nombre" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación en" + +#, python-format +#~ msgid "You are only allowed to read this record. (%s - %s)" +#~ msgstr "No está permitido para leer este registro. (%s - %s)" diff --git a/base_model_restrict_update/i18n/ja_JP.po b/base_model_restrict_update/i18n/ja_JP.po index 09564531b0f..b9c6ca56d98 100644 --- a/base_model_restrict_update/i18n/ja_JP.po +++ b/base_model_restrict_update/i18n/ja_JP.po @@ -16,6 +16,16 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: base_model_restrict_update +#: model_terms:ir.ui.view,arch_db:base_model_restrict_update.view_users_form +msgid "Read-only" +msgstr "" + +#. module: base_model_restrict_update +#: model_terms:ir.ui.view,arch_db:base_model_restrict_update.view_users_form +msgid "Unrestrict Update" +msgstr "" + #. module: base_model_restrict_update #: model:ir.model,name:base_model_restrict_update.model_ir_model_access msgid "Model Access" @@ -26,6 +36,16 @@ msgstr "モデルアクセス" msgid "Models" msgstr "モデル" +#. module: base_model_restrict_update +#: model:ir.model.fields,field_description:base_model_restrict_update.field_res_users__is_readonly_user +msgid "Ready User" +msgstr "" + +#. module: base_model_restrict_update +#: model:ir.model.fields,help:base_model_restrict_update.field_res_users__is_readonly_user +msgid "Set to true and the user are readonly user on all models" +msgstr "" + #. module: base_model_restrict_update #: model:ir.model.fields,help:base_model_restrict_update.field_res_users__unrestrict_model_update msgid "Set to true and the user can update restricted model." @@ -56,7 +76,17 @@ msgstr "" "きます。" #. module: base_model_restrict_update -#: code:addons/base_model_restrict_update/models/ir_model_access.py:31 +#: code:addons/base_model_restrict_update/models/ir_model_access.py:0 +#, python-format +msgid "You are only allowed to read this record. ({} - {})" +msgstr "" + +#. module: base_model_restrict_update +#: code:addons/base_model_restrict_update/models/res_users.py:0 +#, python-format +msgid "You cannot set admin user as a readonly user." +msgstr "" + #, python-format -msgid "You are only allowed to read this record. (%s - %s)" -msgstr "レコードを更新することはできません。(%s - %s)" +#~ msgid "You are only allowed to read this record. (%s - %s)" +#~ msgstr "レコードを更新することはできません。(%s - %s)" diff --git a/base_model_restrict_update/models/res_users.py b/base_model_restrict_update/models/res_users.py index c5254f8ed8d..ebf122fa9db 100644 --- a/base_model_restrict_update/models/res_users.py +++ b/base_model_restrict_update/models/res_users.py @@ -21,11 +21,3 @@ def _check_is_readonly_user(self): for user in self: if self.env.ref("base.group_system") in user.groups_id: raise UserError(_("You cannot set admin user as a readonly user.")) - - def toggle_unrestrict_model_update(self): - for record in self: - record.unrestrict_model_update = not record.unrestrict_model_update - - def toggle_is_readonly_user(self): - for record in self: - record.is_readonly_user = not record.is_readonly_user diff --git a/base_model_restrict_update/readme/CONFIGURE.rst b/base_model_restrict_update/readme/CONFIGURE.rst index 850b0ad8672..8594c5f79a6 100644 --- a/base_model_restrict_update/readme/CONFIGURE.rst +++ b/base_model_restrict_update/readme/CONFIGURE.rst @@ -1,3 +1,6 @@ Enable the "Update Restrict Model" of specific model to restrict update from unpermitted users. -To set a user as a permitted user to update restricted model(s), click on "Grant Update Permit" in user form. -Optionally, to set a user as readonly user to all models, click on "Readonly User" in user form. +To set a user as a permitted user to update restricted model(s), click on "Unrestrict +Update" toggle button in the user form. + +Optionally, to set a user as read-only user to all models, click on "Read-only" toggle +button in the user form. diff --git a/base_model_restrict_update/static/description/index.html b/base_model_restrict_update/static/description/index.html index 8854975ba0d..7d89aecfec6 100644 --- a/base_model_restrict_update/static/description/index.html +++ b/base_model_restrict_update/static/description/index.html @@ -1,20 +1,20 @@ - + - + Update Restrict Model