From b58af055830fd553f6c160a9ad33c4176fdfc845 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Fri, 18 Feb 2022 16:16:59 +0100 Subject: [PATCH 01/14] Add rpc_helper --- rpc_helper/README.rst | 1 + rpc_helper/__init__.py | 1 + rpc_helper/__manifest__.py | 15 +++++++++ rpc_helper/decorator.py | 19 +++++++++++ rpc_helper/hooks.py | 22 +++++++++++++ rpc_helper/patch.py | 26 +++++++++++++++ rpc_helper/readme/CONTRIBUTORS.rst | 1 + rpc_helper/readme/DESCRIPTION.rst | 1 + rpc_helper/readme/USAGE.rst | 15 +++++++++ rpc_helper/rpc_test_example.py | 15 +++++++++ rpc_helper/tests/__init__.py | 2 ++ rpc_helper/tests/test_decorator.py | 34 +++++++++++++++++++ rpc_helper/tests/test_xmlrpc.py | 53 ++++++++++++++++++++++++++++++ 13 files changed, 205 insertions(+) create mode 100644 rpc_helper/README.rst create mode 100644 rpc_helper/__init__.py create mode 100644 rpc_helper/__manifest__.py create mode 100644 rpc_helper/decorator.py create mode 100644 rpc_helper/hooks.py create mode 100644 rpc_helper/patch.py create mode 100644 rpc_helper/readme/CONTRIBUTORS.rst create mode 100644 rpc_helper/readme/DESCRIPTION.rst create mode 100644 rpc_helper/readme/USAGE.rst create mode 100644 rpc_helper/rpc_test_example.py create mode 100644 rpc_helper/tests/__init__.py create mode 100644 rpc_helper/tests/test_decorator.py create mode 100644 rpc_helper/tests/test_xmlrpc.py diff --git a/rpc_helper/README.rst b/rpc_helper/README.rst new file mode 100644 index 000000000..89bcd6c21 --- /dev/null +++ b/rpc_helper/README.rst @@ -0,0 +1 @@ +wait for the bot ;) diff --git a/rpc_helper/__init__.py b/rpc_helper/__init__.py new file mode 100644 index 000000000..99ac2b54f --- /dev/null +++ b/rpc_helper/__init__.py @@ -0,0 +1 @@ +from .hooks import post_load_hook diff --git a/rpc_helper/__manifest__.py b/rpc_helper/__manifest__.py new file mode 100644 index 000000000..f5b774941 --- /dev/null +++ b/rpc_helper/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright 2022 Camptocamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +{ + "name": "Disable RPC", + "summary": """Helpers for disabling RPC calls""", + "version": "14.0.1.0.0", + "development_status": "Alpha", + "license": "LGPL-3", + "website": "https://github.com/OCA/server-tools", + "author": "Camptocamp, Odoo Community Association (OCA)", + "maintainers": ["simahawk"], + "post_load": "post_load_hook", +} diff --git a/rpc_helper/decorator.py b/rpc_helper/decorator.py new file mode 100644 index 000000000..99c875c90 --- /dev/null +++ b/rpc_helper/decorator.py @@ -0,0 +1,19 @@ +# Copyright 2022 Camptocamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + + +def disable_rpc(*config): + """Decorate classes to disable RPC calls. + + Possible values: + + * none, block all methods + * *("$method_name1", "$method_name2"), blocks calls to specific methods + """ + + def _decorator(target): + target._disable_rpc = ("all",) if len(config) == 0 else config + return target + + return _decorator diff --git a/rpc_helper/hooks.py b/rpc_helper/hooks.py new file mode 100644 index 000000000..e6dbad6da --- /dev/null +++ b/rpc_helper/hooks.py @@ -0,0 +1,22 @@ +# Copyright 2022 Camptocamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import logging + +from odoo.service import model + +from .patch import protected__execute_cr + +_logger = logging.getLogger(__name__) + + +def patch__model_execute_cr(): + """Patch rpc model handler.""" + protected__execute_cr._orig__execute_cr = model.execute_cr + model.execute_cr = protected__execute_cr + _logger.info("PATCHED odoo.service.model.execute") + + +def post_load_hook(): + patch__model_execute_cr() diff --git a/rpc_helper/patch.py b/rpc_helper/patch.py new file mode 100644 index 000000000..b939b06c7 --- /dev/null +++ b/rpc_helper/patch.py @@ -0,0 +1,26 @@ +# Copyright 2022 Camptocamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import odoo +from odoo.exceptions import UserError +from odoo.tools.translate import _ + + +def protected__execute_cr(cr, uid, obj, method, *args, **kw): + # Same as original func in odoo.service.model.execute_cr + odoo.api.Environment.reset() # clean cache etc if we retry the same transaction + recs = odoo.api.Environment(cr, uid, {}).get(obj) + if recs is None: + raise UserError(_("Object %s doesn't exist", obj)) + # custom code starts here + if not _rpc_allowed(recs, method): + raise UserError(_("RPC call on %s is not allowed", obj)) + return protected__execute_cr._orig__execute_cr(cr, uid, obj, method, *args, **kw) + + +def _rpc_allowed(recordset, method): + config = getattr(recordset, "_disable_rpc", None) + if config is None: + return True + return "all" not in config and method not in config diff --git a/rpc_helper/readme/CONTRIBUTORS.rst b/rpc_helper/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..f1c71bce1 --- /dev/null +++ b/rpc_helper/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Simone Orsi diff --git a/rpc_helper/readme/DESCRIPTION.rst b/rpc_helper/readme/DESCRIPTION.rst new file mode 100644 index 000000000..e5078d952 --- /dev/null +++ b/rpc_helper/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Provide helpers to authorize RPC calls. diff --git a/rpc_helper/readme/USAGE.rst b/rpc_helper/readme/USAGE.rst new file mode 100644 index 000000000..56cfd7de2 --- /dev/null +++ b/rpc_helper/readme/USAGE.rst @@ -0,0 +1,15 @@ +Decorate an Odoo model class like this:: + + from odoo.addons.rpc_helper.decorator import disable_rpc + + @disable_rpc() + class AverageModel(models.Model): + _inherit = "avg.model" + +This will disable ALL calls. + +To selectively disable only some methods:: + + @disable_rpc("create", "write", "any_method") + class AverageModel(models.Model): + _inherit = "avg.model" diff --git a/rpc_helper/rpc_test_example.py b/rpc_helper/rpc_test_example.py new file mode 100644 index 000000000..35680bd0b --- /dev/null +++ b/rpc_helper/rpc_test_example.py @@ -0,0 +1,15 @@ +"""Basic example script you can use to test your own models for real. +""" +from xmlrpc import client + +HOST = "127.0.0.1" +PORT = 8069 +DB_NAME = "ododdb" + +url = "http://%s:%d/xmlrpc/2/" % (HOST, PORT) +xmlrpc_common = client.ServerProxy(url + "common") +xmlrpc_db = client.ServerProxy(url + "db") +xmlrpc_object = client.ServerProxy(url + "object") + +uid = xmlrpc_common.login(DB_NAME, "admin", "admin") +res = xmlrpc_object.execute(DB_NAME, uid, "admin", "res.partner", "search", []) diff --git a/rpc_helper/tests/__init__.py b/rpc_helper/tests/__init__.py new file mode 100644 index 000000000..c60563b6a --- /dev/null +++ b/rpc_helper/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_xmlrpc +from . import test_decorator diff --git a/rpc_helper/tests/test_decorator.py b/rpc_helper/tests/test_decorator.py new file mode 100644 index 000000000..1ee3ee54f --- /dev/null +++ b/rpc_helper/tests/test_decorator.py @@ -0,0 +1,34 @@ +# Copyright 2022 Camptocamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + + +import unittest + +from ..decorator import disable_rpc + + +@disable_rpc() +class All: + pass + + +@disable_rpc("create") +class One: + pass + + +@disable_rpc("create", "write") +class Multi: + pass + + +class TestDecorator(unittest.TestCase): + def test_all(self): + self.assertEqual(All._disable_rpc, ("all",)) + + def test_one(self): + self.assertEqual(One._disable_rpc, ("create",)) + + def test_multi(self): + self.assertEqual(Multi._disable_rpc, ("create", "write")) diff --git a/rpc_helper/tests/test_xmlrpc.py b/rpc_helper/tests/test_xmlrpc.py new file mode 100644 index 000000000..bc51f52ca --- /dev/null +++ b/rpc_helper/tests/test_xmlrpc.py @@ -0,0 +1,53 @@ +# Copyright 2022 Camptocamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + + +import xmlrpc + +from odoo.tests import common + + +@common.tagged("post_install", "-at_install") +class TestXMLRPC(common.HttpSavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.admin_uid = cls.env.ref("base.user_admin").id + + def _set_disable(self, val): + type(self.env["res.partner"])._disable_rpc = val + + def tearDown(self): + klass = type(self.env["res.partner"]) + if hasattr(klass, "_disable_rpc"): + delattr(klass, "_disable_rpc") + super().tearDown() + + def _rpc_call(self, method, vals=None): + o = self.xmlrpc_object + db_name = common.get_db_name() + return o.execute( + db_name, self.admin_uid, "admin", "res.partner", method, vals or [] + ) + + def test_xmlrpc_search_normal(self): + res = self._rpc_call("search") + self.assertTrue(isinstance(res, list)) + + def test_xmlrpc_all_blocked(self): + self._set_disable(("all",)) + msg = "RPC call on res.partner is not allowed" + with self.assertRaisesRegex(xmlrpc.client.Fault, msg): + self._rpc_call("search") + + with self.assertRaisesRegex(xmlrpc.client.Fault, msg): + self._rpc_call("create", vals=[{"name": "Foo"}]) + + def test_xmlrpc_can_search_create_blocked(self): + self._set_disable(("create",)) + self._rpc_call("search") + + msg = "RPC call on res.partner is not allowed" + with self.assertRaisesRegex(xmlrpc.client.Fault, msg): + self._rpc_call("create", vals=[{"name": "Foo"}]) From 9eac67a97bcc5ee1a22ea804bb1798a0883fb842 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Fri, 18 Feb 2022 16:58:32 +0000 Subject: [PATCH 02/14] [UPD] Update rpc_helper.pot --- rpc_helper/i18n/rpc_helper.pot | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 rpc_helper/i18n/rpc_helper.pot diff --git a/rpc_helper/i18n/rpc_helper.pot b/rpc_helper/i18n/rpc_helper.pot new file mode 100644 index 000000000..da30b640b --- /dev/null +++ b/rpc_helper/i18n/rpc_helper.pot @@ -0,0 +1,26 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * rpc_helper +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.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: rpc_helper +#: code:addons/rpc_helper/patch.py:0 +#, python-format +msgid "Object %s doesn't exist" +msgstr "" + +#. module: rpc_helper +#: code:addons/rpc_helper/patch.py:0 +#, python-format +msgid "RPC call on %s is not allowed" +msgstr "" From ed8bb14afb9db6779acb7c3e7ea8a0522c840f10 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 18 Feb 2022 17:18:12 +0000 Subject: [PATCH 03/14] [UPD] README.rst --- rpc_helper/README.rst | 106 +++++- rpc_helper/static/description/index.html | 446 +++++++++++++++++++++++ 2 files changed, 551 insertions(+), 1 deletion(-) create mode 100644 rpc_helper/static/description/index.html diff --git a/rpc_helper/README.rst b/rpc_helper/README.rst index 89bcd6c21..8e3d321a2 100644 --- a/rpc_helper/README.rst +++ b/rpc_helper/README.rst @@ -1 +1,105 @@ -wait for the bot ;) +=========== +Disable RPC +=========== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |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/14.0/rpc_helper + :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-rpc_helper + :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 + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Provide helpers to authorize RPC calls. + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Decorate an Odoo model class like this:: + + from odoo.addons.rpc_helper.decorator import disable_rpc + + @disable_rpc() + class AverageModel(models.Model): + _inherit = "avg.model" + +This will disable ALL calls. + +To selectively disable only some methods:: + + @disable_rpc("create", "write", "any_method") + class AverageModel(models.Model): + _inherit = "avg.model" + +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 +~~~~~~~ + +* Camptocamp + +Contributors +~~~~~~~~~~~~ + +* Simone Orsi + +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-simahawk| image:: https://github.com/simahawk.png?size=40px + :target: https://github.com/simahawk + :alt: simahawk + +Current `maintainer `__: + +|maintainer-simahawk| + +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/rpc_helper/static/description/index.html b/rpc_helper/static/description/index.html new file mode 100644 index 000000000..b15c5ee01 --- /dev/null +++ b/rpc_helper/static/description/index.html @@ -0,0 +1,446 @@ + + + + + + +Disable RPC + + + +
+

Disable RPC

+ + +

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

+

Provide helpers to authorize RPC calls.

+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Usage

+

Decorate an Odoo model class like this:

+
+from odoo.addons.rpc_helper.decorator import disable_rpc
+
+@disable_rpc()
+class AverageModel(models.Model):
+    _inherit = "avg.model"
+
+

This will disable ALL calls.

+

To selectively disable only some methods:

+
+@disable_rpc("create", "write", "any_method")
+class AverageModel(models.Model):
+    _inherit = "avg.model"
+
+
+
+

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

+
    +
  • Camptocamp
  • +
+
+ +
+

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:

+

simahawk

+

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.

+
+
+
+ + From f6980ba88a57ba61a79c486c5e93fc73a334b9f0 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 18 Feb 2022 17:18:13 +0000 Subject: [PATCH 04/14] [ADD] icon.png --- rpc_helper/static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 rpc_helper/static/description/icon.png diff --git a/rpc_helper/static/description/icon.png b/rpc_helper/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 997f1f2ae15d06372efe8444af883c1a7e0997d3 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Mon, 21 Feb 2022 09:52:51 +0100 Subject: [PATCH 05/14] rpc_helper: add config via UI --- rpc_helper/__init__.py | 1 + rpc_helper/__manifest__.py | 2 ++ rpc_helper/models/__init__.py | 1 + rpc_helper/models/ir_model.py | 44 +++++++++++++++++++++++++++++ rpc_helper/patch.py | 4 +++ rpc_helper/readme/CONFIGURATION.rst | 23 +++++++++++++++ rpc_helper/readme/USAGE.rst | 9 ++++++ rpc_helper/rpc_test_example.py | 2 +- rpc_helper/tests/test_xmlrpc.py | 24 ++++++++++++++++ rpc_helper/views/ir_model_views.xml | 23 +++++++++++++++ 10 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 rpc_helper/models/__init__.py create mode 100644 rpc_helper/models/ir_model.py create mode 100644 rpc_helper/readme/CONFIGURATION.rst create mode 100644 rpc_helper/views/ir_model_views.xml diff --git a/rpc_helper/__init__.py b/rpc_helper/__init__.py index 99ac2b54f..5bf67492b 100644 --- a/rpc_helper/__init__.py +++ b/rpc_helper/__init__.py @@ -1 +1,2 @@ +from . import models from .hooks import post_load_hook diff --git a/rpc_helper/__manifest__.py b/rpc_helper/__manifest__.py index f5b774941..f2d6ec427 100644 --- a/rpc_helper/__manifest__.py +++ b/rpc_helper/__manifest__.py @@ -11,5 +11,7 @@ "website": "https://github.com/OCA/server-tools", "author": "Camptocamp, Odoo Community Association (OCA)", "maintainers": ["simahawk"], + "depends": ["base_sparse_field"], + "data": ["views/ir_model_views.xml"], "post_load": "post_load_hook", } diff --git a/rpc_helper/models/__init__.py b/rpc_helper/models/__init__.py new file mode 100644 index 000000000..413bb2380 --- /dev/null +++ b/rpc_helper/models/__init__.py @@ -0,0 +1 @@ +from . import ir_model diff --git a/rpc_helper/models/ir_model.py b/rpc_helper/models/ir_model.py new file mode 100644 index 000000000..6913b33bc --- /dev/null +++ b/rpc_helper/models/ir_model.py @@ -0,0 +1,44 @@ +# Copyright 2022 Camptocamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import json + +from odoo import api, fields, models, tools + +from odoo.addons.base_sparse_field.models.fields import Serialized + + +class IrModel(models.Model): + _inherit = "ir.model" + + rpc_config = Serialized(compute="_compute_rpc_config", default={}) + # Allow editing via UI + rpc_config_edit = fields.Text( + help="Configure RPC config via JSON. " + "Value must be a list of methods to disable " + "wrapped by a dict with key `disable`. " + "Eg: {'disable': ['search', 'do_this']}" + "To disable all methods, use `{'disable: ['all']}`", + inverse="_inverse_rpc_config_edit", + ) + + @api.depends("rpc_config_edit") + def _compute_rpc_config(self): + for rec in self: + rec.rpc_config = rec._load_rpc_config() + + def _inverse_rpc_config_edit(self): + for rec in self: + # Make sure options_edit is always readable + rec.rpc_config_edit = json.dumps( + rec.rpc_config or {}, indent=4, sort_keys=True + ) + + def _load_rpc_config(self): + return json.loads(self.rpc_config_edit or "{}") + + @tools.ormcache("model") + def _get_rpc_config(self, model): + rec = self._get(model) + return rec.rpc_config or {} diff --git a/rpc_helper/patch.py b/rpc_helper/patch.py index b939b06c7..3eb987da8 100644 --- a/rpc_helper/patch.py +++ b/rpc_helper/patch.py @@ -21,6 +21,10 @@ def protected__execute_cr(cr, uid, obj, method, *args, **kw): def _rpc_allowed(recordset, method): config = getattr(recordset, "_disable_rpc", None) + if config is None: + config = ( + recordset.env["ir.model"]._get_rpc_config(recordset._name).get("disable") + ) if config is None: return True return "all" not in config and method not in config diff --git a/rpc_helper/readme/CONFIGURATION.rst b/rpc_helper/readme/CONFIGURATION.rst new file mode 100644 index 000000000..84347b529 --- /dev/null +++ b/rpc_helper/readme/CONFIGURATION.rst @@ -0,0 +1,23 @@ +Enable debug mode and go to "Technical -> Database Structure -> Models". + +Open the model that you like to configure and go to the tab "RPC config". + +There you see a text field which supports JSON configuration. + +The configuration is the same you can pass via decorator. +The only difference is that you have to wrap values in a dictionary +like `{"disable": [...values...]}`. + +To disable all calls:: + + { + "disable": ["all"], + } + +To disable only some methods:: + + { + "disable": ["create", "write", "another_method"], + } + +NOTE: on the resulting JSON will be automatically formatted on save for better readability. diff --git a/rpc_helper/readme/USAGE.rst b/rpc_helper/readme/USAGE.rst index 56cfd7de2..ff6752476 100644 --- a/rpc_helper/readme/USAGE.rst +++ b/rpc_helper/readme/USAGE.rst @@ -1,3 +1,6 @@ +Via code +~~~~~~~~ + Decorate an Odoo model class like this:: from odoo.addons.rpc_helper.decorator import disable_rpc @@ -13,3 +16,9 @@ To selectively disable only some methods:: @disable_rpc("create", "write", "any_method") class AverageModel(models.Model): _inherit = "avg.model" + + +Via `ir.model` configuration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +See "Configuration" section. diff --git a/rpc_helper/rpc_test_example.py b/rpc_helper/rpc_test_example.py index 35680bd0b..d48b9a73d 100644 --- a/rpc_helper/rpc_test_example.py +++ b/rpc_helper/rpc_test_example.py @@ -4,7 +4,7 @@ from xmlrpc import client HOST = "127.0.0.1" PORT = 8069 -DB_NAME = "ododdb" +DB_NAME = "odoodb" url = "http://%s:%d/xmlrpc/2/" % (HOST, PORT) xmlrpc_common = client.ServerProxy(url + "common") diff --git a/rpc_helper/tests/test_xmlrpc.py b/rpc_helper/tests/test_xmlrpc.py index bc51f52ca..e442fbe2a 100644 --- a/rpc_helper/tests/test_xmlrpc.py +++ b/rpc_helper/tests/test_xmlrpc.py @@ -3,6 +3,7 @@ # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +import json import xmlrpc from odoo.tests import common @@ -18,6 +19,12 @@ class TestXMLRPC(common.HttpSavepointCase): def _set_disable(self, val): type(self.env["res.partner"])._disable_rpc = val + def _set_disable_on_model(self, val): + self.env["ir.model"]._get("res.partner").rpc_config_edit = json.dumps( + {"disable": val} + ) + self.env["ir.model"].flush() + def tearDown(self): klass = type(self.env["res.partner"]) if hasattr(klass, "_disable_rpc"): @@ -51,3 +58,20 @@ class TestXMLRPC(common.HttpSavepointCase): msg = "RPC call on res.partner is not allowed" with self.assertRaisesRegex(xmlrpc.client.Fault, msg): self._rpc_call("create", vals=[{"name": "Foo"}]) + + def test_xmlrpc_all_blocked__ir_model(self): + self._set_disable_on_model(("all",)) + msg = "RPC call on res.partner is not allowed" + with self.assertRaisesRegex(xmlrpc.client.Fault, msg): + self._rpc_call("search") + + with self.assertRaisesRegex(xmlrpc.client.Fault, msg): + self._rpc_call("create", vals=[{"name": "Foo"}]) + + def test_xmlrpc_can_search_create_blocked__ir_model(self): + self._set_disable_on_model(("create",)) + self._rpc_call("search") + + msg = "RPC call on res.partner is not allowed" + with self.assertRaisesRegex(xmlrpc.client.Fault, msg): + self._rpc_call("create", vals=[{"name": "Foo"}]) diff --git a/rpc_helper/views/ir_model_views.xml b/rpc_helper/views/ir_model_views.xml new file mode 100644 index 000000000..d98b45c82 --- /dev/null +++ b/rpc_helper/views/ir_model_views.xml @@ -0,0 +1,23 @@ + + + + + rpc_helper view_model_form + ir.model + + + + + + + + + + From 0adb4459f89db2b1314278dab1b6fb4c44dabbd4 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Fri, 4 Mar 2022 17:12:09 +0000 Subject: [PATCH 06/14] [UPD] Update rpc_helper.pot --- rpc_helper/i18n/rpc_helper.pot | 73 ++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/rpc_helper/i18n/rpc_helper.pot b/rpc_helper/i18n/rpc_helper.pot index da30b640b..060291fa5 100644 --- a/rpc_helper/i18n/rpc_helper.pot +++ b/rpc_helper/i18n/rpc_helper.pot @@ -13,6 +13,54 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__changeset_change_ids +msgid "Changeset Changes" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__changeset_ids +msgid "Changesets" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,help:rpc_helper.field_ir_model__rpc_config_edit +msgid "" +"Configure RPC config via JSON. Value must be a list of methods to disable " +"wrapped by a dict with key `disable`. Eg: {'disable': ['search', " +"'do_this']}To disable all methods, use `{'disable: ['all']}`" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__count_pending_changeset_changes +msgid "Count Pending Changeset Changes" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__count_pending_changesets +msgid "Count Pending Changesets" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__display_name +msgid "Display Name" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__id +msgid "ID" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model____last_update +msgid "Last Modified on" +msgstr "" + +#. module: rpc_helper +#: model:ir.model,name:rpc_helper.model_ir_model +msgid "Models" +msgstr "" + #. module: rpc_helper #: code:addons/rpc_helper/patch.py:0 #, python-format @@ -24,3 +72,28 @@ msgstr "" #, python-format msgid "RPC call on %s is not allowed" msgstr "" + +#. module: rpc_helper +#: model_terms:ir.ui.view,arch_db:rpc_helper.view_model_form +msgid "RPC config" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__rpc_config +msgid "Rpc Config" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__rpc_config_edit +msgid "Rpc Config Edit" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__smart_search +msgid "Smart Search" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__user_can_see_changeset +msgid "User Can See Changeset" +msgstr "" From 3ea0f29f20eef833a2dc7a2efbd642e038b1c648 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 4 Mar 2022 17:18:37 +0000 Subject: [PATCH 07/14] [UPD] README.rst --- rpc_helper/README.rst | 9 +++++++ rpc_helper/static/description/index.html | 33 ++++++++++++++++-------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/rpc_helper/README.rst b/rpc_helper/README.rst index 8e3d321a2..d2aba0e21 100644 --- a/rpc_helper/README.rst +++ b/rpc_helper/README.rst @@ -40,6 +40,9 @@ Provide helpers to authorize RPC calls. Usage ===== +Via code +~~~~~~~~ + Decorate an Odoo model class like this:: from odoo.addons.rpc_helper.decorator import disable_rpc @@ -56,6 +59,12 @@ To selectively disable only some methods:: class AverageModel(models.Model): _inherit = "avg.model" + +Via `ir.model` configuration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +See "Configuration" section. + Bug Tracker =========== diff --git a/rpc_helper/static/description/index.html b/rpc_helper/static/description/index.html index b15c5ee01..b288563f2 100644 --- a/rpc_helper/static/description/index.html +++ b/rpc_helper/static/description/index.html @@ -378,18 +378,24 @@ Only for development or testing purpose, do not use in production.

Table of contents

Usage

+
+

Via code

Decorate an Odoo model class like this:

 from odoo.addons.rpc_helper.decorator import disable_rpc
@@ -406,8 +412,13 @@ class AverageModel(models.Model):
     _inherit = "avg.model"
 
+
+

Via ir.model configuration

+

See “Configuration” section.

+
+
-

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

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Camptocamp
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose From ff9e18ba9b22a140d97c89ba73252ee3d7d3f845 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 4 Mar 2022 17:18:38 +0000 Subject: [PATCH 08/14] rpc_helper 14.0.1.1.0 --- rpc_helper/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpc_helper/__manifest__.py b/rpc_helper/__manifest__.py index f2d6ec427..2896e40a9 100644 --- a/rpc_helper/__manifest__.py +++ b/rpc_helper/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Disable RPC", "summary": """Helpers for disabling RPC calls""", - "version": "14.0.1.0.0", + "version": "14.0.1.1.0", "development_status": "Alpha", "license": "LGPL-3", "website": "https://github.com/OCA/server-tools", From 6466d4607ac6bbb2cdd235ab0f7d7fa0ce92bc04 Mon Sep 17 00:00:00 2001 From: Ignacio Buioli Date: Fri, 2 Sep 2022 13:40:07 +0000 Subject: [PATCH 09/14] Added translation using Weblate (Spanish (Argentina)) --- rpc_helper/i18n/es_AR.po | 100 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 rpc_helper/i18n/es_AR.po diff --git a/rpc_helper/i18n/es_AR.po b/rpc_helper/i18n/es_AR.po new file mode 100644 index 000000000..1029a4c14 --- /dev/null +++ b/rpc_helper/i18n/es_AR.po @@ -0,0 +1,100 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * rpc_helper +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\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" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__changeset_change_ids +msgid "Changeset Changes" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__changeset_ids +msgid "Changesets" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,help:rpc_helper.field_ir_model__rpc_config_edit +msgid "" +"Configure RPC config via JSON. Value must be a list of methods to disable " +"wrapped by a dict with key `disable`. Eg: {'disable': ['search', " +"'do_this']}To disable all methods, use `{'disable: ['all']}`" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__count_pending_changeset_changes +msgid "Count Pending Changeset Changes" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__count_pending_changesets +msgid "Count Pending Changesets" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__display_name +msgid "Display Name" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__id +msgid "ID" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model____last_update +msgid "Last Modified on" +msgstr "" + +#. module: rpc_helper +#: model:ir.model,name:rpc_helper.model_ir_model +msgid "Models" +msgstr "" + +#. module: rpc_helper +#: code:addons/rpc_helper/patch.py:0 +#, python-format +msgid "Object %s doesn't exist" +msgstr "" + +#. module: rpc_helper +#: code:addons/rpc_helper/patch.py:0 +#, python-format +msgid "RPC call on %s is not allowed" +msgstr "" + +#. module: rpc_helper +#: model_terms:ir.ui.view,arch_db:rpc_helper.view_model_form +msgid "RPC config" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__rpc_config +msgid "Rpc Config" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__rpc_config_edit +msgid "Rpc Config Edit" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__smart_search +msgid "Smart Search" +msgstr "" + +#. module: rpc_helper +#: model:ir.model.fields,field_description:rpc_helper.field_ir_model__user_can_see_changeset +msgid "User Can See Changeset" +msgstr "" From 798d4b6e4767901a9cbbbc4f67c265fe58893ebe Mon Sep 17 00:00:00 2001 From: Ignacio Buioli Date: Fri, 2 Sep 2022 13:41:58 +0000 Subject: [PATCH 10/14] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (16 of 16 strings) Translation: server-tools-14.0/server-tools-14.0-rpc_helper Translate-URL: https://translation.odoo-community.org/projects/server-tools-14-0/server-tools-14-0-rpc_helper/es_AR/ --- rpc_helper/i18n/es_AR.po | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/rpc_helper/i18n/es_AR.po b/rpc_helper/i18n/es_AR.po index 1029a4c14..edbd12f85 100644 --- a/rpc_helper/i18n/es_AR.po +++ b/rpc_helper/i18n/es_AR.po @@ -6,23 +6,25 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2022-09-02 16: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: rpc_helper #: model:ir.model.fields,field_description:rpc_helper.field_ir_model__changeset_change_ids msgid "Changeset Changes" -msgstr "" +msgstr "Cambios del Conjunto de Cambios" #. module: rpc_helper #: model:ir.model.fields,field_description:rpc_helper.field_ir_model__changeset_ids msgid "Changesets" -msgstr "" +msgstr "Conjunto de Cambios" #. module: rpc_helper #: model:ir.model.fields,help:rpc_helper.field_ir_model__rpc_config_edit @@ -31,70 +33,74 @@ msgid "" "wrapped by a dict with key `disable`. Eg: {'disable': ['search', " "'do_this']}To disable all methods, use `{'disable: ['all']}`" msgstr "" +"Configure los ajustes de RPC a través de JSON. El valor debe ser una lista " +"de métodos para deshabilitar envueltos por un dict con la clave " +"`deshabilitar`. Por ejemplo: {'disable': ['search', 'do_this']} Para " +"deshabilitar todos los métodos, use `{'disable: ['all']}`" #. module: rpc_helper #: model:ir.model.fields,field_description:rpc_helper.field_ir_model__count_pending_changeset_changes msgid "Count Pending Changeset Changes" -msgstr "" +msgstr "Cuenta de los Cambios Pendientes de los Conjuntos de Cambios" #. module: rpc_helper #: model:ir.model.fields,field_description:rpc_helper.field_ir_model__count_pending_changesets msgid "Count Pending Changesets" -msgstr "" +msgstr "Cuenta de los Conjuntos de Cambios Pendientes" #. module: rpc_helper #: model:ir.model.fields,field_description:rpc_helper.field_ir_model__display_name msgid "Display Name" -msgstr "" +msgstr "Mostrar Nombre" #. module: rpc_helper #: model:ir.model.fields,field_description:rpc_helper.field_ir_model__id msgid "ID" -msgstr "" +msgstr "ID" #. module: rpc_helper #: model:ir.model.fields,field_description:rpc_helper.field_ir_model____last_update msgid "Last Modified on" -msgstr "" +msgstr "Última modificación en" #. module: rpc_helper #: model:ir.model,name:rpc_helper.model_ir_model msgid "Models" -msgstr "" +msgstr "Modelos" #. module: rpc_helper #: code:addons/rpc_helper/patch.py:0 #, python-format msgid "Object %s doesn't exist" -msgstr "" +msgstr "El Objeto %s no existe" #. module: rpc_helper #: code:addons/rpc_helper/patch.py:0 #, python-format msgid "RPC call on %s is not allowed" -msgstr "" +msgstr "Las llamadas RPC en %s no están permitidas" #. module: rpc_helper #: model_terms:ir.ui.view,arch_db:rpc_helper.view_model_form msgid "RPC config" -msgstr "" +msgstr "Configuración RPC" #. module: rpc_helper #: model:ir.model.fields,field_description:rpc_helper.field_ir_model__rpc_config msgid "Rpc Config" -msgstr "" +msgstr "Configuración Rpc" #. module: rpc_helper #: model:ir.model.fields,field_description:rpc_helper.field_ir_model__rpc_config_edit msgid "Rpc Config Edit" -msgstr "" +msgstr "Editar la Configuración Rpc" #. module: rpc_helper #: model:ir.model.fields,field_description:rpc_helper.field_ir_model__smart_search msgid "Smart Search" -msgstr "" +msgstr "Búsqueda Inteligente" #. module: rpc_helper #: model:ir.model.fields,field_description:rpc_helper.field_ir_model__user_can_see_changeset msgid "User Can See Changeset" -msgstr "" +msgstr "El Usuario Puede ver Conjuntos de Cambios" From 79b63fcad2fc70abfd37bb99c68ec9452ef318d9 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Tue, 7 Mar 2023 18:19:07 +0100 Subject: [PATCH 11/14] rpc_helper: fix readme --- rpc_helper/readme/{CONFIGURATION.rst => CONFIGURE.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename rpc_helper/readme/{CONFIGURATION.rst => CONFIGURE.rst} (100%) diff --git a/rpc_helper/readme/CONFIGURATION.rst b/rpc_helper/readme/CONFIGURE.rst similarity index 100% rename from rpc_helper/readme/CONFIGURATION.rst rename to rpc_helper/readme/CONFIGURE.rst From 843cd4c471f9c15ac94b33e53cd1621c84393c04 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 7 Mar 2023 17:37:53 +0000 Subject: [PATCH 12/14] [UPD] README.rst --- rpc_helper/README.rst | 27 ++++++++++++ rpc_helper/static/description/index.html | 55 +++++++++++++++++------- 2 files changed, 66 insertions(+), 16 deletions(-) diff --git a/rpc_helper/README.rst b/rpc_helper/README.rst index d2aba0e21..1bdacfa87 100644 --- a/rpc_helper/README.rst +++ b/rpc_helper/README.rst @@ -37,6 +37,33 @@ Provide helpers to authorize RPC calls. .. contents:: :local: +Configuration +============= + +Enable debug mode and go to "Technical -> Database Structure -> Models". + +Open the model that you like to configure and go to the tab "RPC config". + +There you see a text field which supports JSON configuration. + +The configuration is the same you can pass via decorator. +The only difference is that you have to wrap values in a dictionary +like `{"disable": [...values...]}`. + +To disable all calls:: + + { + "disable": ["all"], + } + +To disable only some methods:: + + { + "disable": ["create", "write", "another_method"], + } + +NOTE: on the resulting JSON will be automatically formatted on save for better readability. + Usage ===== diff --git a/rpc_helper/static/description/index.html b/rpc_helper/static/description/index.html index b288563f2..654fc69c5 100644 --- a/rpc_helper/static/description/index.html +++ b/rpc_helper/static/description/index.html @@ -378,24 +378,47 @@ Only for development or testing purpose, do not use in production.

Table of contents

+
+

Configuration

+

Enable debug mode and go to “Technical -> Database Structure -> Models”.

+

Open the model that you like to configure and go to the tab “RPC config”.

+

There you see a text field which supports JSON configuration.

+

The configuration is the same you can pass via decorator. +The only difference is that you have to wrap values in a dictionary +like {“disable”: […values…]}.

+

To disable all calls:

+
+{
+    "disable": ["all"],
+}
+
+

To disable only some methods:

+
+{
+    "disable": ["create", "write", "another_method"],
+}
+
+

NOTE: on the resulting JSON will be automatically formatted on save for better readability.

+
-

Usage

+

Usage

-

Via code

+

Via code

Decorate an Odoo model class like this:

 from odoo.addons.rpc_helper.decorator import disable_rpc
@@ -413,12 +436,12 @@ class AverageModel(models.Model):
 
-

Via ir.model configuration

+

Via ir.model configuration

See “Configuration” section.

-

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

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Camptocamp
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose From 9d023eff8ac8fd84fca906283ddd043f972edb2d Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 7 Mar 2023 17:37:53 +0000 Subject: [PATCH 13/14] rpc_helper 14.0.1.1.1 --- rpc_helper/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpc_helper/__manifest__.py b/rpc_helper/__manifest__.py index 2896e40a9..11f86dd32 100644 --- a/rpc_helper/__manifest__.py +++ b/rpc_helper/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Disable RPC", "summary": """Helpers for disabling RPC calls""", - "version": "14.0.1.1.0", + "version": "14.0.1.1.1", "development_status": "Alpha", "license": "LGPL-3", "website": "https://github.com/OCA/server-tools", From 220ec5964bcf9a25afb61f0af0d02a9449b865b5 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Thu, 16 Feb 2023 17:57:40 +0100 Subject: [PATCH 14/14] rpc_helper: migrate to v16 --- rpc_helper/__manifest__.py | 4 ++-- rpc_helper/patch.py | 2 +- rpc_helper/tests/test_xmlrpc.py | 4 ++-- setup/rpc_helper/odoo/addons/rpc_helper | 1 + setup/rpc_helper/setup.py | 6 ++++++ 5 files changed, 12 insertions(+), 5 deletions(-) create mode 120000 setup/rpc_helper/odoo/addons/rpc_helper create mode 100644 setup/rpc_helper/setup.py diff --git a/rpc_helper/__manifest__.py b/rpc_helper/__manifest__.py index 11f86dd32..b20a92031 100644 --- a/rpc_helper/__manifest__.py +++ b/rpc_helper/__manifest__.py @@ -5,8 +5,8 @@ { "name": "Disable RPC", "summary": """Helpers for disabling RPC calls""", - "version": "14.0.1.1.1", - "development_status": "Alpha", + "version": "16.0.1.0.0", + "development_status": "Beta", "license": "LGPL-3", "website": "https://github.com/OCA/server-tools", "author": "Camptocamp, Odoo Community Association (OCA)", diff --git a/rpc_helper/patch.py b/rpc_helper/patch.py index 3eb987da8..c3a05691b 100644 --- a/rpc_helper/patch.py +++ b/rpc_helper/patch.py @@ -9,7 +9,7 @@ from odoo.tools.translate import _ def protected__execute_cr(cr, uid, obj, method, *args, **kw): # Same as original func in odoo.service.model.execute_cr - odoo.api.Environment.reset() # clean cache etc if we retry the same transaction + cr.reset() recs = odoo.api.Environment(cr, uid, {}).get(obj) if recs is None: raise UserError(_("Object %s doesn't exist", obj)) diff --git a/rpc_helper/tests/test_xmlrpc.py b/rpc_helper/tests/test_xmlrpc.py index e442fbe2a..bf18ea26f 100644 --- a/rpc_helper/tests/test_xmlrpc.py +++ b/rpc_helper/tests/test_xmlrpc.py @@ -10,7 +10,7 @@ from odoo.tests import common @common.tagged("post_install", "-at_install") -class TestXMLRPC(common.HttpSavepointCase): +class TestXMLRPC(common.HttpCase): @classmethod def setUpClass(cls): super().setUpClass() @@ -23,7 +23,7 @@ class TestXMLRPC(common.HttpSavepointCase): self.env["ir.model"]._get("res.partner").rpc_config_edit = json.dumps( {"disable": val} ) - self.env["ir.model"].flush() + self.env.flush_all() def tearDown(self): klass = type(self.env["res.partner"]) diff --git a/setup/rpc_helper/odoo/addons/rpc_helper b/setup/rpc_helper/odoo/addons/rpc_helper new file mode 120000 index 000000000..f1248ff24 --- /dev/null +++ b/setup/rpc_helper/odoo/addons/rpc_helper @@ -0,0 +1 @@ +../../../../rpc_helper \ No newline at end of file diff --git a/setup/rpc_helper/setup.py b/setup/rpc_helper/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/rpc_helper/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)