From 861ce1033b3eeb5c29645408c92e2359b9095f74 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Sun, 28 Apr 2024 11:41:49 +0100 Subject: [PATCH 01/71] [ADD] webservice_server_env: make server_environment an optional dependency --- webservice_server_env/README.rst | 87 ++++ webservice_server_env/__init__.py | 1 + webservice_server_env/__manifest__.py | 18 + webservice_server_env/models/__init__.py | 1 + .../models/webservice_backend.py | 41 ++ webservice_server_env/pyproject.toml | 3 + webservice_server_env/readme/CONTRIBUTORS.md | 2 + webservice_server_env/readme/DESCRIPTION.md | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 428 ++++++++++++++++++ webservice_server_env/tests/__init__.py | 1 + webservice_server_env/tests/test_oauth2.py | 77 ++++ 12 files changed, 661 insertions(+) create mode 100644 webservice_server_env/README.rst create mode 100644 webservice_server_env/__init__.py create mode 100644 webservice_server_env/__manifest__.py create mode 100644 webservice_server_env/models/__init__.py create mode 100644 webservice_server_env/models/webservice_backend.py create mode 100644 webservice_server_env/pyproject.toml create mode 100644 webservice_server_env/readme/CONTRIBUTORS.md create mode 100644 webservice_server_env/readme/DESCRIPTION.md create mode 100644 webservice_server_env/static/description/icon.png create mode 100644 webservice_server_env/static/description/index.html create mode 100644 webservice_server_env/tests/__init__.py create mode 100644 webservice_server_env/tests/test_oauth2.py diff --git a/webservice_server_env/README.rst b/webservice_server_env/README.rst new file mode 100644 index 00000000..7026d4ae --- /dev/null +++ b/webservice_server_env/README.rst @@ -0,0 +1,87 @@ +============================= +WebService Server Environment +============================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:3259abecb5f2052be5402be6eaa2e4a70ee6d401a3b9e1d6fd58499b13c36099 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb--api-lightgray.png?logo=github + :target: https://github.com/OCA/web-api/tree/18.0/webservice_server_env + :alt: OCA/web-api +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-api-18-0/web-api-18-0-webservice_server_env + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web-api&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Glue module to make Server Environment features available for the +Webservice addon. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Creu Blanca +* Camptocamp + +Contributors +------------ + +- Enric Tobella +- Daniel Reis + +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-etobella| image:: https://github.com/etobella.png?size=40px + :target: https://github.com/etobella + :alt: etobella + +Current `maintainer `__: + +|maintainer-etobella| + +This module is part of the `OCA/web-api `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/webservice_server_env/__init__.py b/webservice_server_env/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/webservice_server_env/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/webservice_server_env/__manifest__.py b/webservice_server_env/__manifest__.py new file mode 100644 index 00000000..31aecd93 --- /dev/null +++ b/webservice_server_env/__manifest__.py @@ -0,0 +1,18 @@ +# Copyright 2020 Creu Blanca +# Copyright 2022 Camptocamp SA +# @author Simone Orsi +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +{ + "name": "WebService Server Environment", + "summary": "Use Server Environment feature to manage Webservice configs", + "version": "18.0.1.0.0", + "license": "AGPL-3", + "development_status": "Production/Stable", + "maintainers": ["etobella"], + "author": "Creu Blanca, Camptocamp, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web-api", + "depends": ["webservice", "server_environment"], + "auto_install": True, +} diff --git a/webservice_server_env/models/__init__.py b/webservice_server_env/models/__init__.py new file mode 100644 index 00000000..c08fb9a9 --- /dev/null +++ b/webservice_server_env/models/__init__.py @@ -0,0 +1 @@ +from . import webservice_backend diff --git a/webservice_server_env/models/webservice_backend.py b/webservice_server_env/models/webservice_backend.py new file mode 100644 index 00000000..a4b364fb --- /dev/null +++ b/webservice_server_env/models/webservice_backend.py @@ -0,0 +1,41 @@ +# Copyright 2020 Creu Blanca +# Copyright 2022 Camptocamp SA +# @author Simone Orsi +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models + + +class WebserviceBackend(models.Model): + _name = "webservice.backend" + _inherit = ["webservice.backend", "server.env.techname.mixin", "server.env.mixin"] + + @property + def _server_env_fields(self): + base_fields = super()._server_env_fields + webservice_fields = { + "protocol": {}, + "url": {}, + "auth_type": {}, + "username": {}, + "password": {}, + "api_key": {}, + "api_key_header": {}, + "content_type": {}, + "oauth2_flow": {}, + "oauth2_scope": {}, + "oauth2_clientid": {}, + "oauth2_client_secret": {}, + "oauth2_authorization_url": {}, + "oauth2_token_url": {}, + "oauth2_audience": {}, + } + webservice_fields.update(base_fields) + return webservice_fields + + def _compute_server_env(self): + # OVERRIDE: reset ``oauth2_flow`` when ``auth_type`` is not "oauth2", even if + # defined otherwise in server env vars + res = super()._compute_server_env() + self.filtered(lambda r: r.auth_type != "oauth2").oauth2_flow = None + return res diff --git a/webservice_server_env/pyproject.toml b/webservice_server_env/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/webservice_server_env/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/webservice_server_env/readme/CONTRIBUTORS.md b/webservice_server_env/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..8fb74687 --- /dev/null +++ b/webservice_server_env/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- Enric Tobella \<\> +- Daniel Reis \<\> diff --git a/webservice_server_env/readme/DESCRIPTION.md b/webservice_server_env/readme/DESCRIPTION.md new file mode 100644 index 00000000..1c6edaa6 --- /dev/null +++ b/webservice_server_env/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +Glue module to make Server Environment features available for the +Webservice addon. diff --git a/webservice_server_env/static/description/icon.png b/webservice_server_env/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/webservice_server_env/static/description/index.html b/webservice_server_env/static/description/index.html new file mode 100644 index 00000000..31674568 --- /dev/null +++ b/webservice_server_env/static/description/index.html @@ -0,0 +1,428 @@ + + + + + +WebService Server Environment + + + +
+

WebService Server Environment

+ + +

Production/Stable License: AGPL-3 OCA/web-api Translate me on Weblate Try me on Runboat

+

Glue module to make Server Environment features available for the +Webservice addon.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Creu Blanca
  • +
  • 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:

+

etobella

+

This module is part of the OCA/web-api project on GitHub.

+

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

+
+
+
+ + diff --git a/webservice_server_env/tests/__init__.py b/webservice_server_env/tests/__init__.py new file mode 100644 index 00000000..38fb5cf0 --- /dev/null +++ b/webservice_server_env/tests/__init__.py @@ -0,0 +1 @@ +from . import test_oauth2 diff --git a/webservice_server_env/tests/test_oauth2.py b/webservice_server_env/tests/test_oauth2.py new file mode 100644 index 00000000..b22e945a --- /dev/null +++ b/webservice_server_env/tests/test_oauth2.py @@ -0,0 +1,77 @@ +# Copyright 2023 Camptocamp SA +# @author Alexandre Fayolle +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import os +from unittest import mock + +from odoo.addons.server_environment import server_env +from odoo.addons.server_environment.models import server_env_mixin +from odoo.addons.webservice.tests.common import CommonWebService + + +class TestWebServiceOauth2WebApplication(CommonWebService): + @classmethod + def _setup_records(cls): + res = super()._setup_records() + cls.url = "https://localhost.demo.odoo/" + os.environ["SERVER_ENV_CONFIG"] = "\n".join( + [ + "[webservice_backend.test_oauth2_web]", + "auth_type = oauth2", + "oauth2_flow = web_application", + "oauth2_clientid = some_client_id", + "oauth2_client_secret = shh_secret", + f"oauth2_token_url = {cls.url}oauth2/token", + f"oauth2_audience = {cls.url}", + f"oauth2_authorization_url = {cls.url}/authorize", + ] + ) + cls.webservice = cls.env["webservice.backend"].create( + { + "name": "WebService OAuth2", + "tech_name": "test_oauth2_web", + "auth_type": "oauth2", + "protocol": "http", + "url": cls.url, + "oauth2_flow": "web_application", + "content_type": "application/xml", + "oauth2_clientid": "some_client_id", + "oauth2_client_secret": "shh_secret", + "oauth2_token_url": f"{cls.url}oauth2/token", + "oauth2_audience": cls.url, + "oauth2_authorization_url": f"{cls.url}/authorize", + } + ) + return res + + def test_oauth2_flow_compute_with_server_env(self): + """Check the ``compute`` method when updating server envs""" + ws = self.webservice + url = self.url + for auth_type, oauth2_flow in [ + (tp, fl) + for tp in ws._fields["auth_type"].get_values(ws.env) + for fl in ws._fields["oauth2_flow"].get_values(ws.env) + ]: + # Update env with current ``auth_type`` and ``oauth2_flow`` + with mock.patch.dict( + os.environ, + { + "SERVER_ENV_CONFIG": f""" +[webservice_backend.test_oauth2_web] +auth_type = {auth_type} +oauth2_flow = {oauth2_flow} +oauth2_clientid = some_client_id +oauth2_client_secret = shh_secret +oauth2_token_url = {url}oauth2/token +oauth2_audience = {url} +oauth2_authorization_url = {url}/authorize +""", + }, + ): + server_env_mixin.serv_config = server_env._load_config() # Reload vars + ws.invalidate_recordset() # Avoid reading from cache + if auth_type == "oauth2": + self.assertEqual(ws.oauth2_flow, oauth2_flow) + else: + self.assertFalse(ws.oauth2_flow) From d18744bec329737731359801745c00f078781fe3 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Thu, 10 Dec 2020 16:06:38 +0100 Subject: [PATCH 02/71] [ADD] webservice --- webservice/README.rst | 73 ++++ webservice/__init__.py | 2 + webservice/__manifest__.py | 16 + webservice/components/__init__.py | 2 + webservice/components/base_adapter.py | 19 + webservice/components/request_adapter.py | 47 +++ webservice/models/__init__.py | 1 + webservice/models/webservice_backend.py | 45 +++ webservice/readme/CONTRIBUTORS.rst | 1 + webservice/readme/DESCRIPTION.rst | 1 + webservice/security/ir.model.access.csv | 2 + webservice/static/description/icon.png | Bin 0 -> 9455 bytes webservice/static/description/index.html | 419 +++++++++++++++++++++++ webservice/tests/__init__.py | 1 + webservice/tests/common.py | 29 ++ webservice/tests/test_webservice.py | 94 +++++ webservice/views/webservice_backend.xml | 76 ++++ 17 files changed, 828 insertions(+) create mode 100644 webservice/README.rst create mode 100644 webservice/__init__.py create mode 100644 webservice/__manifest__.py create mode 100644 webservice/components/__init__.py create mode 100644 webservice/components/base_adapter.py create mode 100644 webservice/components/request_adapter.py create mode 100644 webservice/models/__init__.py create mode 100644 webservice/models/webservice_backend.py create mode 100644 webservice/readme/CONTRIBUTORS.rst create mode 100644 webservice/readme/DESCRIPTION.rst create mode 100644 webservice/security/ir.model.access.csv create mode 100644 webservice/static/description/icon.png create mode 100644 webservice/static/description/index.html create mode 100644 webservice/tests/__init__.py create mode 100644 webservice/tests/common.py create mode 100644 webservice/tests/test_webservice.py create mode 100644 webservice/views/webservice_backend.xml diff --git a/webservice/README.rst b/webservice/README.rst new file mode 100644 index 00000000..84d5bcc7 --- /dev/null +++ b/webservice/README.rst @@ -0,0 +1,73 @@ +========== +WebService +========== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi-lightgray.png?logo=github + :target: https://github.com/OCA/edi/tree/13.0/webservice + :alt: OCA/edi +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/edi-13-0/edi-13-0-webservice + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/226/13.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module creates WebService frameworks to be used globally + +**Table of contents** + +.. contents:: + :local: + +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 +~~~~~~~ + +* Creu Blanca + +Contributors +~~~~~~~~~~~~ + +* Enric Tobella + +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/edi `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/webservice/__init__.py b/webservice/__init__.py new file mode 100644 index 00000000..f24d3e24 --- /dev/null +++ b/webservice/__init__.py @@ -0,0 +1,2 @@ +from . import components +from . import models diff --git a/webservice/__manifest__.py b/webservice/__manifest__.py new file mode 100644 index 00000000..abf022cb --- /dev/null +++ b/webservice/__manifest__.py @@ -0,0 +1,16 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "WebService", + "summary": """ + Defines webservice abstract definition to be used generally""", + "version": "13.0.1.0.0", + "license": "AGPL-3", + "development_status": "Alpha", + "author": "Creu Blanca,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/edi", + "depends": ["component", "server_environment"], + "data": ["security/ir.model.access.csv", "views/webservice_backend.xml"], + "demo": [], +} diff --git a/webservice/components/__init__.py b/webservice/components/__init__.py new file mode 100644 index 00000000..4647bfb3 --- /dev/null +++ b/webservice/components/__init__.py @@ -0,0 +1,2 @@ +from . import base_adapter +from . import request_adapter diff --git a/webservice/components/base_adapter.py b/webservice/components/base_adapter.py new file mode 100644 index 00000000..8ac2b380 --- /dev/null +++ b/webservice/components/base_adapter.py @@ -0,0 +1,19 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.addons.component.core import AbstractComponent + + +class BaseWebServiceAdapter(AbstractComponent): + _name = "base.webservice.adapter" + _collection = "webservice.backend" + _webservice_protocol = False + _usage = "webservice.request" + + @classmethod + def _component_match(cls, work, usage=None, model_name=None, **kw): + """Override to customize match. + Registry lookup filtered by usage and model_name when landing here. + Now, narrow match to `_match_attrs` attributes. + """ + return kw.get("webservice_protocol") in (None, cls._webservice_protocol) diff --git a/webservice/components/request_adapter.py b/webservice/components/request_adapter.py new file mode 100644 index 00000000..062ffdd2 --- /dev/null +++ b/webservice/components/request_adapter.py @@ -0,0 +1,47 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import requests + +from odoo.addons.component.core import Component + + +class BaseRestRequestsAdapter(Component): + _name = "base.requests" + _webservice_protocol = "http" + _inherit = "base.webservice.adapter" + + def _request(self, method, **kwargs): + new_kwargs = kwargs.copy() + new_kwargs.update( + {"auth": self._get_auth(**kwargs), "headers": self._get_headers(**kwargs)} + ) + request = requests.request( + method, self.collection.url.format(**kwargs), **new_kwargs + ) + request.raise_for_status() + return request.content + + def get(self, **kwargs): + return self._request("get", **kwargs) + + def post(self, **kwargs): + return self._request("post", **kwargs) + + def put(self, **kwargs): + return self._request("put", **kwargs) + + def _get_auth(self, auth=False, **kwargs): + if auth: + return auth + if self.collection.username and self.collection.password: + return self.collection.username, self.collection.password + return None + + def _get_headers(self, content_type=False, headers=False, **kwargs): + result = { + "Content-Type": content_type or self.collection.content_type, + } + if isinstance(headers, dict): + result.update(headers) + return result diff --git a/webservice/models/__init__.py b/webservice/models/__init__.py new file mode 100644 index 00000000..c08fb9a9 --- /dev/null +++ b/webservice/models/__init__.py @@ -0,0 +1 @@ +from . import webservice_backend diff --git a/webservice/models/webservice_backend.py b/webservice/models/webservice_backend.py new file mode 100644 index 00000000..d63d06f3 --- /dev/null +++ b/webservice/models/webservice_backend.py @@ -0,0 +1,45 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class WebserviceBackend(models.Model): + + _name = "webservice.backend" + _inherit = ["collection.base", "server.env.techname.mixin"] + _description = "WebService Backend" + + name = fields.Char(required=True) + tech_name = fields.Char(required=True) + protocol = fields.Selection([("http", "HTTP Request")], required=True) + url = fields.Char(required=True) + username = fields.Char() + password = fields.Char() + content_type = fields.Selection( + [ + ("application/json", "JSON"), + ("application/xml", "XML"), + ("application/x-www-form-urlencoded", "Form"), + ], + required=True, + ) + + def call(self, method, *args, **kwargs): + return getattr(self._get_adapter(), method)(*args, **kwargs) + + def _get_adapter(self): + with self.work_on(self._name) as work: + return work.component( + usage="webservice.request", webservice_protocol=self.protocol + ) + + @property + def _server_env_fields(self): + return { + "protocol": {}, + "url": {}, + "username": {}, + "password": {}, + "content_type": {}, + } diff --git a/webservice/readme/CONTRIBUTORS.rst b/webservice/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..93ec993e --- /dev/null +++ b/webservice/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Enric Tobella diff --git a/webservice/readme/DESCRIPTION.rst b/webservice/readme/DESCRIPTION.rst new file mode 100644 index 00000000..db2c75a7 --- /dev/null +++ b/webservice/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module creates WebService frameworks to be used globally diff --git a/webservice/security/ir.model.access.csv b/webservice/security/ir.model.access.csv new file mode 100644 index 00000000..f8bb5166 --- /dev/null +++ b/webservice/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_webservice_backend_edit,webservice_backend edit,model_webservice_backend,base.group_system,1,1,1,1 diff --git a/webservice/static/description/icon.png b/webservice/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/webservice/static/description/index.html b/webservice/static/description/index.html new file mode 100644 index 00000000..04c5678b --- /dev/null +++ b/webservice/static/description/index.html @@ -0,0 +1,419 @@ + + + + + + +WebService + + + +
+

WebService

+ + +

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

+

This module creates WebService frameworks to be used globally

+

Table of contents

+ +
+

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

+
    +
  • Creu Blanca
  • +
+
+
+

Contributors

+ +
+
+

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/edi project on GitHub.

+

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

+
+
+
+ + diff --git a/webservice/tests/__init__.py b/webservice/tests/__init__.py new file mode 100644 index 00000000..c7c6b2c0 --- /dev/null +++ b/webservice/tests/__init__.py @@ -0,0 +1 @@ +from . import test_webservice diff --git a/webservice/tests/common.py b/webservice/tests/common.py new file mode 100644 index 00000000..545a73c7 --- /dev/null +++ b/webservice/tests/common.py @@ -0,0 +1,29 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests.common import tagged + +from odoo.addons.component.tests.common import SavepointComponentCase + + +@tagged("-at_install", "post_install") +class CommonWebService(SavepointComponentCase): + @classmethod + def _setup_context(cls): + return dict( + cls.env.context, tracking_disable=True, test_queue_job_no_delay=True + ) + + @classmethod + def _setup_env(cls): + cls.env = cls.env(context=cls._setup_context()) + + @classmethod + def _setup_records(cls): + pass + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls._setup_env() + cls._setup_records() diff --git a/webservice/tests/test_webservice.py b/webservice/tests/test_webservice.py new file mode 100644 index 00000000..7842e760 --- /dev/null +++ b/webservice/tests/test_webservice.py @@ -0,0 +1,94 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import responses +from requests import auth, exceptions + +from .common import CommonWebService + + +class TestWebService(CommonWebService): + @classmethod + def _setup_records(cls): + super()._setup_records() + cls.url = "http://localhost.demo.odoo/" + cls.webservice = cls.env["webservice.backend"].create( + { + "name": "WebService", + "protocol": "http", + "url": cls.url, + "content_type": "application/xml", + "tech_name": "demo_ws", + } + ) + + def test_web_service_not_found(self): + with self.assertRaises(exceptions.ConnectionError): + self.webservice.call("get") + + @responses.activate + def test_web_service_get(self): + responses.add(responses.GET, self.url, body="{}") + result = self.webservice.call("get") + self.assertEqual(result, b"{}") + self.assertEqual(1, len(responses.calls)) + self.assertEqual( + responses.calls[0].request.headers["Content-Type"], "application/xml" + ) + + @responses.activate + def test_web_service_post(self): + responses.add(responses.POST, self.url, body="{}") + result = self.webservice.call("post", data="demo_response") + self.assertEqual(result, b"{}") + self.assertEqual( + responses.calls[0].request.headers["Content-Type"], "application/xml" + ) + self.assertEqual(responses.calls[0].request.body, "demo_response") + + @responses.activate + def test_web_service_put(self): + responses.add(responses.PUT, self.url, body="{}") + result = self.webservice.call("put", data="demo_response") + self.assertEqual(result, b"{}") + self.assertEqual( + responses.calls[0].request.headers["Content-Type"], "application/xml" + ) + self.assertEqual(responses.calls[0].request.body, "demo_response") + + @responses.activate + def test_web_service_backend_username(self): + self.webservice.write({"username": "user", "password": "pass"}) + responses.add(responses.GET, self.url, body="{}") + result = self.webservice.call("get") + self.assertEqual(result, b"{}") + self.assertEqual(1, len(responses.calls)) + self.assertEqual( + responses.calls[0].request.headers["Content-Type"], "application/xml" + ) + data = auth._basic_auth_str("user", "pass") + self.assertEqual(responses.calls[0].request.headers["Authorization"], data) + + @responses.activate + def test_web_service_username(self): + self.webservice.write({"username": "user", "password": "pass"}) + responses.add(responses.GET, self.url, body="{}") + result = self.webservice.call("get", auth=("user2", "pass2")) + self.assertEqual(result, b"{}") + self.assertEqual(1, len(responses.calls)) + self.assertEqual( + responses.calls[0].request.headers["Content-Type"], "application/xml" + ) + data = auth._basic_auth_str("user2", "pass2") + self.assertEqual(responses.calls[0].request.headers["Authorization"], data) + + @responses.activate + def test_web_service_headers(self): + responses.add(responses.GET, self.url, body="{}") + result = self.webservice.call("get", headers={"demo_header": "HEADER"}) + self.assertEqual(result, b"{}") + self.assertEqual(1, len(responses.calls)) + self.assertEqual( + responses.calls[0].request.headers["Content-Type"], "application/xml" + ) + self.assertEqual(responses.calls[0].request.headers["demo_header"], "HEADER") diff --git a/webservice/views/webservice_backend.xml b/webservice/views/webservice_backend.xml new file mode 100644 index 00000000..4d32f5dd --- /dev/null +++ b/webservice/views/webservice_backend.xml @@ -0,0 +1,76 @@ + + + + + + webservice.backend.form (in webservice) + webservice.backend + +
+
+ +
+
+ + + + + + + +
+ + + + + + webservice.backend.search (in webservice) + webservice.backend + + + + + + + + + + + + webservice.backend.tree (in webservice) + webservice.backend + + + + + + + + + + + + WebService Backend + webservice.backend + tree,form + [] + {} + + + + WebService Backend + + + + + + From 2513526756e9c28a62e122219781ec52e605ca66 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Mon, 15 Mar 2021 15:15:42 +0000 Subject: [PATCH 03/71] [UPD] Update webservice.pot --- webservice/i18n/webservice.pot | 116 +++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 webservice/i18n/webservice.pot diff --git a/webservice/i18n/webservice.pot b/webservice/i18n/webservice.pot new file mode 100644 index 00000000..b50b2780 --- /dev/null +++ b/webservice/i18n/webservice.pot @@ -0,0 +1,116 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * webservice +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.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: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend__content_type +msgid "Content Type" +msgstr "" + +#. module: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend__create_uid +msgid "Created by" +msgstr "" + +#. module: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend__create_date +msgid "Created on" +msgstr "" + +#. module: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend__display_name +msgid "Display Name" +msgstr "" + +#. module: webservice +#: model:ir.model.fields.selection,name:webservice.selection__webservice_backend__content_type__application/x-www-form-urlencoded +msgid "Form" +msgstr "" + +#. module: webservice +#: model:ir.model.fields.selection,name:webservice.selection__webservice_backend__protocol__http +msgid "HTTP Request" +msgstr "" + +#. module: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend__id +msgid "ID" +msgstr "" + +#. module: webservice +#: model:ir.model.fields.selection,name:webservice.selection__webservice_backend__content_type__application/json +msgid "JSON" +msgstr "" + +#. module: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend____last_update +msgid "Last Modified on" +msgstr "" + +#. module: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend__write_date +msgid "Last Updated on" +msgstr "" + +#. module: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend__name +msgid "Name" +msgstr "" + +#. module: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend__password +msgid "Password" +msgstr "" + +#. module: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend__protocol +msgid "Protocol" +msgstr "" + +#. module: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend__tech_name +msgid "Tech Name" +msgstr "" + +#. module: webservice +#: model:ir.model.fields,help:webservice.field_webservice_backend__tech_name +msgid "Unique name for technical purposes. Eg: server env keys." +msgstr "" + +#. module: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend__url +msgid "Url" +msgstr "" + +#. module: webservice +#: model:ir.model.fields,field_description:webservice.field_webservice_backend__username +msgid "Username" +msgstr "" + +#. module: webservice +#: model:ir.actions.act_window,name:webservice.webservice_backend_act_window +#: model:ir.model,name:webservice.model_webservice_backend +#: model:ir.ui.menu,name:webservice.webservice_backend_menu +msgid "WebService Backend" +msgstr "" + +#. module: webservice +#: model:ir.model.fields.selection,name:webservice.selection__webservice_backend__content_type__application/xml +msgid "XML" +msgstr "" From 5f399510c1adcb72cbe507aeb475857d9009da24 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 15 Mar 2021 16:06:15 +0000 Subject: [PATCH 04/71] [UPD] README.rst --- webservice/README.rst | 9 +++++++-- webservice/static/description/index.html | 10 ++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/webservice/README.rst b/webservice/README.rst index 84d5bcc7..0b8dcf8b 100644 --- a/webservice/README.rst +++ b/webservice/README.rst @@ -7,9 +7,9 @@ WebService !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png :target: https://odoo-community.org/page/development-status - :alt: Beta + :alt: Alpha .. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 @@ -27,6 +27,11 @@ WebService This module creates WebService frameworks to be used globally +.. 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:: diff --git a/webservice/static/description/index.html b/webservice/static/description/index.html index 04c5678b..31588a6d 100644 --- a/webservice/static/description/index.html +++ b/webservice/static/description/index.html @@ -3,7 +3,7 @@ - + WebService -
-

WebService

+
+ + +Odoo Community Association + +
+

WebService

-

Production/Stable License: AGPL-3 OCA/web-api Translate me on Weblate Try me on Runboat

+

Production/Stable License: AGPL-3 OCA/web-api Translate me on Weblate Try me on Runboat

This module creates WebService frameworks to be used globally.

The module introduces support for HTTP Request protocol. The webservice HTTP call returns by default the content of the response. A context @@ -387,31 +392,31 @@

WebService

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Creu Blanca
  • Camptocamp
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -421,10 +426,11 @@

Maintainers

promote its widespread use.

Current maintainer:

etobella

-

This module is part of the OCA/web-api project on GitHub.

+

This module is part of the OCA/web-api project on GitHub.

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

+
From a5739f648ccfe09a270434f96c4e747af25c8fac Mon Sep 17 00:00:00 2001 From: AaronHForgeFlow Date: Tue, 24 Mar 2026 11:40:28 +0100 Subject: [PATCH 69/71] [IMP] webservice_server_env: pre-commit auto fixes --- requirements.txt | 4 +++ webservice_server_env/README.rst | 16 +++++++---- .../static/description/index.html | 28 +++++++++++-------- 3 files changed, 31 insertions(+), 17 deletions(-) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..45e2e80f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +# generated from manifests external_dependencies +oauthlib +requests-oauthlib +responses diff --git a/webservice_server_env/README.rst b/webservice_server_env/README.rst index 7026d4ae..ae87b88d 100644 --- a/webservice_server_env/README.rst +++ b/webservice_server_env/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ============================= WebService Server Environment ============================= @@ -13,17 +17,17 @@ WebService Server Environment .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png :target: https://odoo-community.org/page/development-status :alt: Production/Stable -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb--api-lightgray.png?logo=github - :target: https://github.com/OCA/web-api/tree/18.0/webservice_server_env + :target: https://github.com/OCA/web-api/tree/19.0/webservice_server_env :alt: OCA/web-api .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/web-api-18-0/web-api-18-0-webservice_server_env + :target: https://translation.odoo-community.org/projects/web-api-19-0/web-api-19-0-webservice_server_env :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/web-api&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/web-api&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -42,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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -82,6 +86,6 @@ Current `maintainer `__: |maintainer-etobella| -This module is part of the `OCA/web-api `_ project on GitHub. +This module is part of the `OCA/web-api `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/webservice_server_env/static/description/index.html b/webservice_server_env/static/description/index.html index 31674568..75e54b89 100644 --- a/webservice_server_env/static/description/index.html +++ b/webservice_server_env/static/description/index.html @@ -3,7 +3,7 @@ -WebService Server Environment +README.rst -
-

WebService Server Environment

+
+ + +Odoo Community Association + +
+

WebService Server Environment

-

Production/Stable License: AGPL-3 OCA/web-api Translate me on Weblate Try me on Runboat

+

Production/Stable License: AGPL-3 OCA/web-api Translate me on Weblate Try me on Runboat

Glue module to make Server Environment features available for the Webservice addon.

Table of contents

@@ -385,31 +390,31 @@

WebService Server Environment

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Creu Blanca
  • Camptocamp
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -419,10 +424,11 @@

Maintainers

promote its widespread use.

Current maintainer:

etobella

-

This module is part of the OCA/web-api project on GitHub.

+

This module is part of the OCA/web-api project on GitHub.

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

+
From 22a9a5e9405a765d7b59a94d2e2a53d9d462205f Mon Sep 17 00:00:00 2001 From: AaronHForgeFlow Date: Tue, 24 Mar 2026 11:51:51 +0100 Subject: [PATCH 70/71] [MIG] webservice: Migration to v19 --- webservice/__manifest__.py | 2 +- webservice/controllers/oauth2.py | 4 ++-- webservice/models/webservice_backend.py | 15 +++++++-------- webservice/views/webservice_backend.xml | 2 -- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/webservice/__manifest__.py b/webservice/__manifest__.py index 806e5264..720c9a8a 100644 --- a/webservice/__manifest__.py +++ b/webservice/__manifest__.py @@ -6,7 +6,7 @@ { "name": "WebService", "summary": """Defines webservice abstract definition to be used generally""", - "version": "18.0.1.1.0", + "version": "19.0.1.1.0", "license": "AGPL-3", "development_status": "Production/Stable", "maintainers": ["etobella"], diff --git a/webservice/controllers/oauth2.py b/webservice/controllers/oauth2.py index 1de890d8..c8a2eea1 100644 --- a/webservice/controllers/oauth2.py +++ b/webservice/controllers/oauth2.py @@ -3,9 +3,9 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). import json import logging +from urllib.parse import urlencode from oauthlib.oauth2.rfc6749 import errors -from werkzeug.urls import url_encode from odoo import http from odoo.http import request @@ -59,5 +59,5 @@ def redirect(self, backend_id, **params): if cids: url_params["cids"] = ",".join([str(cid) for cid in cids]) - url = f"/web?#{url_encode(url_params)}" + url = f"/web?#{urlencode(url_params)}" return request.redirect(url) diff --git a/webservice/models/webservice_backend.py b/webservice/models/webservice_backend.py index 740e729e..4116d618 100644 --- a/webservice/models/webservice_backend.py +++ b/webservice/models/webservice_backend.py @@ -5,7 +5,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). import logging -from odoo import _, api, exceptions, fields, models +from odoo import api, exceptions, fields, models from odoo.tools import config _logger = logging.getLogger(__name__) @@ -87,14 +87,13 @@ def _msg_missing_auth_param(self, missing_fields): def get_selection_value(fname): return self._fields.get(fname).convert_to_export(self[fname], self) - return _( + return self.env._( "Webservice '%(name)s' requires '%(auth_type)s' authentication. " - "However, the following field(s) are not valued: %(fields)s" - ) % { - "name": self.name, - "auth_type": get_selection_value("auth_type"), - "fields": ", ".join([f.string for f in missing_fields]), - } + "However, the following field(s) are not valued: %(fields)s", + name=self.name, + auth_type=get_selection_value("auth_type"), + fields=", ".join([f.string for f in missing_fields]), + ) def _valid_field_parameter(self, field, name): extra_params = ("auth_type",) diff --git a/webservice/views/webservice_backend.xml b/webservice/views/webservice_backend.xml index 71daebd1..e6391d36 100644 --- a/webservice/views/webservice_backend.xml +++ b/webservice/views/webservice_backend.xml @@ -17,11 +17,9 @@
-