From 109eb25bec395121df8a5fff1e0aa41aebf270ef Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Thu, 10 Dec 2020 16:06:38 +0100 Subject: [PATCH 01/67] [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 8341b8d7307f638f29a420dd9e1936f6aac77751 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Mon, 15 Mar 2021 15:15:42 +0000 Subject: [PATCH 02/67] [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 82cb593d8549e9abc952425adfac54a4dad12219 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 15 Mar 2021 16:06:15 +0000 Subject: [PATCH 03/67] [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.

+