From c3e14f74517514b607a6dfc86dbd01963b95ef6b Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Tue, 20 Jun 2023 14:43:48 +0200 Subject: [PATCH 1/4] [ADD] connector_extension_wordpress --- connector_extension_wordpress/README.rst | 64 +++ connector_extension_wordpress/__init__.py | 1 + connector_extension_wordpress/__manifest__.py | 15 + .../components/__init__.py | 1 + .../components/adapter.py | 215 +++++++++ connector_extension_wordpress/i18n/ca.po | 64 +++ connector_extension_wordpress/i18n/es.po | 64 +++ .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 1 + .../static/description/icon.png | Bin 0 -> 6342 bytes .../static/description/index.html | 421 ++++++++++++++++++ .../odoo/addons/connector_extension_wordpress | 1 + setup/connector_extension_wordpress/setup.py | 6 + 13 files changed, 857 insertions(+) create mode 100644 connector_extension_wordpress/README.rst create mode 100644 connector_extension_wordpress/__init__.py create mode 100644 connector_extension_wordpress/__manifest__.py create mode 100644 connector_extension_wordpress/components/__init__.py create mode 100644 connector_extension_wordpress/components/adapter.py create mode 100644 connector_extension_wordpress/i18n/ca.po create mode 100644 connector_extension_wordpress/i18n/es.po create mode 100644 connector_extension_wordpress/readme/CONTRIBUTORS.rst create mode 100644 connector_extension_wordpress/readme/DESCRIPTION.rst create mode 100644 connector_extension_wordpress/static/description/icon.png create mode 100644 connector_extension_wordpress/static/description/index.html create mode 120000 setup/connector_extension_wordpress/odoo/addons/connector_extension_wordpress create mode 100644 setup/connector_extension_wordpress/setup.py diff --git a/connector_extension_wordpress/README.rst b/connector_extension_wordpress/README.rst new file mode 100644 index 000000000..22f6167de --- /dev/null +++ b/connector_extension_wordpress/README.rst @@ -0,0 +1,64 @@ +============================= +Connector Extension Wordpress +============================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:5acc311916374a5c8b68547091798eb4307996ed461862d35d5563b1c1b6bdd1 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-NuoBiT%2Fodoo--addons-lightgray.png?logo=github + :target: https://github.com/NuoBiT/odoo-addons/tree/14.0/connector_extension_wordpress + :alt: NuoBiT/odoo-addons + +|badge1| |badge2| |badge3| + +This module extends the connector extension module to add support for Wordpress + +**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 +~~~~~~~ + +* NuoBiT Solutions +* SL + +Contributors +~~~~~~~~~~~~ + +* `NuoBiT `__: + + * Kilian Niubo + * Eric Antones + +Maintainers +~~~~~~~~~~~ + +This module is part of the `NuoBiT/odoo-addons `_ project on GitHub. + +You are welcome to contribute. diff --git a/connector_extension_wordpress/__init__.py b/connector_extension_wordpress/__init__.py new file mode 100644 index 000000000..1377f57f5 --- /dev/null +++ b/connector_extension_wordpress/__init__.py @@ -0,0 +1 @@ +from . import components diff --git a/connector_extension_wordpress/__manifest__.py b/connector_extension_wordpress/__manifest__.py new file mode 100644 index 000000000..d49a162a8 --- /dev/null +++ b/connector_extension_wordpress/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright NuoBiT Solutions - Kilian Niubo +# Copyright NuoBiT Solutions - Eric Antones +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html) + +{ + "name": "Connector Extension Wordpress", + "summary": "This module extends the connector extension module " + "to add support for Wordpress", + "version": "14.0.1.0.0", + "author": "NuoBiT Solutions, SL", + "license": "LGPL-3", + "category": "Connector", + "website": "https://github.com/nuobit/odoo-addons", + "depends": ["connector_extension"], +} diff --git a/connector_extension_wordpress/components/__init__.py b/connector_extension_wordpress/components/__init__.py new file mode 100644 index 000000000..f502287fe --- /dev/null +++ b/connector_extension_wordpress/components/__init__.py @@ -0,0 +1 @@ +from . import adapter diff --git a/connector_extension_wordpress/components/adapter.py b/connector_extension_wordpress/components/adapter.py new file mode 100644 index 000000000..613dee64b --- /dev/null +++ b/connector_extension_wordpress/components/adapter.py @@ -0,0 +1,215 @@ +# Copyright NuoBiT Solutions - Kilian Niubo +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html) + +import json +import logging + +import requests + +from odoo import _ +from odoo.exceptions import ValidationError + +from odoo.addons.component.core import AbstractComponent +from odoo.addons.connector.exception import RetryableJobError + +_logger = logging.getLogger(__name__) + + +class ConnectorExtensionWordpressAdapterCRUD(AbstractComponent): + _name = "connector.extension.wordpress.adapter.crud" + _inherit = "connector.extension.adapter.crud" + + def _exec(self, op, resource, *args, **kwargs): + func = getattr(self, "_exec_%s" % op) + return func(resource, *args, **kwargs) + + def _manage_error_codes( + self, res_data, res, resource, raise_on_error=True, **kwargs + ): + if not res.ok: + error_message = None + if res.status_code == 404: + if res_data.get("code") == "rest_post_invalid_id": + error_message = _( + "Error: '%s'. Probably the %s has been " + "removed from WordPress. " + "If it's the case, try to remove the binding of the %s." + % (res_data.get("message"), resource, self.model._name) + ) + elif res.status_code == 500: + if res_data.get("code") == "rest_upload_sideload_error": + error_message = _( + "Error: '%s'. Probably the image or document " + "is uploaded with bad format. " + "Please, review on database: %s" + % (res_data["message"], kwargs["headers"]) + ) + if not error_message: + error_message = _("Error: %s, Resource: %s" % (res_data, resource)) + if raise_on_error: + raise ValidationError(error_message) + return error_message + return res_data + + def _exec_wp_call(self, op, resource, *args, **kwargs): + url = self.backend_record.url + "/wp-json/wp/v2/" + resource + func = getattr(requests, op) + try: + res = func(url, *args, **kwargs) + res_data = res.json() + res_data = self._manage_error_codes(res_data, res, resource, **kwargs) + result = { + "ok": res.ok, + "status_code": res.status_code, + "headers": res.headers, + "data": res_data, + } + except requests.exceptions.ConnectionError as e: + raise RetryableJobError(_("Error connecting to WordPress: %s") % e) from e + except json.JSONDecodeError as e: + raise ValidationError( + _("Error decoding json WordPress response: %s\n%s") % (e, res.text) + ) from e + return result + + def _get_search_fields(self): + return ["modified_after", "offset", "per_page", "page"] + + def get_total_items(self, resource, domain=None): + filters_values = self._get_search_fields() + real_domain, common_domain = self._extract_domain_clauses( + domain, filters_values + ) + params = self._domain_to_normalized_dict(real_domain) + # TODO: make an optimization to get the total items and use the result + params["per_page"] = 1 + result = self._exec_wp_call( + "get", + resource, + auth=( + self.backend_record.username, + self.backend_record.application_password, + ), + params=params, + verify=self.backend_record.verify_ssl, + ) + + total_items_header = result["headers"]._store.get("x-wp-total") + if total_items_header: + total_items_header = int(total_items_header[1]) + else: + # WordPress returns a dict if the response is a single item + if not isinstance(result["data"], list): + result["data"] = [result["data"]] + total_items_header = len(result["data"]) + return total_items_header + + # TODO: REVIEW: Unify with connector_extension_woocommerce + def _exec_get(self, resource, *args, **kwargs): + if resource == "system_status": + return self._exec_wp_call( + "get", + resource, + auth=( + self.backend_record.username, + self.backend_record.application_password, + ), + verify=self.backend_record.verify_ssl, + *args, + **kwargs + ) + # WooCommerce has the parameter next on the response headers + # to get the next page but we can't use it because if we use + # the offset, the next page will have the same items as the first page. + # It looks like a bug in WooCommerce API. + domain = [] + if "domain" in kwargs: + domain = kwargs.pop("domain") + search_fields = self._get_search_fields() + real_domain, common_domain = self._extract_domain_clauses(domain, search_fields) + params = self._domain_to_normalized_dict(real_domain) + if "limit" in kwargs: + limit = kwargs.pop("limit") + else: + limit = self.get_total_items(resource, domain) + params["offset"] = ( + kwargs.pop("offset") if "offset" in kwargs and "offset" not in params else 0 + ) + page_size = self.backend_record.page_size + params["per_page"] = page_size if page_size > 0 else 100 + data = [] + while len(data) < limit: + if page_size > limit - len(data): + params["per_page"] = limit - len(data) + res = self._exec_wp_call( + "get", + resource, + params=params, + auth=( + self.backend_record.username, + self.backend_record.application_password, + ), + verify=self.backend_record.verify_ssl, + *args, + **kwargs + ) + # WooCommerce returns a dict if the response is a single item + if not isinstance(res["data"], list): + res["data"] = [res["data"]] + data += res["data"] + params["offset"] += len(res["data"]) + return self._filter(data, common_domain) + + def _exec_post(self, resource, *args, **kwargs): + auth = (self.backend_record.username, self.backend_record.application_password) + if "wordpress_backend_id" in self.backend_record: + backend = self.backend_record.wordpress_backend_id + auth = (backend.username, backend.application_password) + data_aux = kwargs.pop("data", {}) + headers = data_aux.pop("headers", {}) + data = data_aux.pop("data", {}) + res = self._exec_wp_call( + "post", + resource, + data=data, + params=data_aux, + headers=headers, + auth=auth, + verify=self.backend_record.verify_ssl, + ) + + return res["data"] + + def _exec_put(self, resource, *args, **kwargs): + auth = (self.backend_record.username, self.backend_record.application_password) + if "wordpress_backend_id" in self.backend_record: + backend = self.backend_record.wordpress_backend_id + auth = (backend.username, backend.application_password) + data_aux = kwargs.pop("data", {}) + headers = data_aux.pop("headers", {}) + data = data_aux.pop("data", {}) + res = self._exec_wp_call( + "put", + resource, + data=data, + params=data_aux, + headers=headers, + auth=auth, + verify=self.backend_record.verify_ssl, + *args, + **kwargs + ) + return res["data"] + + def _exec_delete(self, resource, *args, **kwargs): + raise NotImplementedError() + + def _exec_options(self, resource, *args, **kwargs): + raise NotImplementedError() + + def get_version(self): + settings = self._exec("get", "settings") + if settings and settings[0].get("title"): + return "Wordpress '%s' connected" % settings[0].get("title") + else: + raise ValidationError(_("Wordpress not connected")) diff --git a/connector_extension_wordpress/i18n/ca.po b/connector_extension_wordpress/i18n/ca.po new file mode 100644 index 000000000..c7e5ad4ca --- /dev/null +++ b/connector_extension_wordpress/i18n/ca.po @@ -0,0 +1,64 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * connector_extension_wordpress +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-10-22 12:56+0000\n" +"PO-Revision-Date: 2024-10-22 12:56+0000\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: connector_extension_wordpress +#: code:addons/connector_extension_wordpress/components/adapter.py:0 +#, python-format +msgid "Error connecting to WordPress: %s" +msgstr "Error al conectar amb WordPress: %s" + +#. module: connector_extension_wordpress +#: code:addons/connector_extension_wordpress/components/adapter.py:0 +#, python-format +msgid "" +"Error decoding json WordPress response: %s\n" +"%s" +msgstr "" +"Error al descodificar la resposta json de WordPress: %s\n" +"%s" + +#. module: connector_extension_wordpress +#: code:addons/connector_extension_wordpress/components/adapter.py:0 +#, python-format +msgid "Error: %s, Resource: %s" +msgstr "Error: %s, Recurs: %s" + +#. module: connector_extension_wordpress +#: code:addons/connector_extension_wordpress/components/adapter.py:0 +#, python-format +msgid "" +"Error: '%s'. Probably the %s has been removed from WordPress. If it's the " +"case, try to remove the binding of the %s." +msgstr "" +"Error: '%s'. Probablement el %s ha estat eliminat de WordPress. Si és el " +"cas, intenta eliminar la vinculació del %s." + +#. module: connector_extension_wordpress +#: code:addons/connector_extension_wordpress/components/adapter.py:0 +#, python-format +msgid "" +"Error: '%s'. Probably the image or document is uploaded with bad format. " +"Please, review on database: %s" +msgstr "" +"Error: '%s'. Probablement la imatge o el document s'ha pujat amb un format " +"incorrecte. Si us plau, revisa a la base de dades: %s" + +#. module: connector_extension_wordpress +#: code:addons/connector_extension_wordpress/components/adapter.py:0 +#, python-format +msgid "Wordpress not connected" +msgstr "WordPress no connectat" diff --git a/connector_extension_wordpress/i18n/es.po b/connector_extension_wordpress/i18n/es.po new file mode 100644 index 000000000..3e0c209a5 --- /dev/null +++ b/connector_extension_wordpress/i18n/es.po @@ -0,0 +1,64 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * connector_extension_wordpress +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-10-22 12:54+0000\n" +"PO-Revision-Date: 2024-10-22 12:54+0000\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: connector_extension_wordpress +#: code:addons/connector_extension_wordpress/components/adapter.py:0 +#, python-format +msgid "Error connecting to WordPress: %s" +msgstr "Error al conectar con WordPress: %s" + +#. module: connector_extension_wordpress +#: code:addons/connector_extension_wordpress/components/adapter.py:0 +#, python-format +msgid "" +"Error decoding json WordPress response: %s\n" +"%s" +msgstr "" +"Error al decodificar la respuesta json de WordPress: %s\n" +"%s" + +#. module: connector_extension_wordpress +#: code:addons/connector_extension_wordpress/components/adapter.py:0 +#, python-format +msgid "Error: %s, Resource: %s" +msgstr "Error: %s, Recurso: %s" + +#. module: connector_extension_wordpress +#: code:addons/connector_extension_wordpress/components/adapter.py:0 +#, python-format +msgid "" +"Error: '%s'. Probably the %s has been removed from WordPress. If it's the " +"case, try to remove the binding of the %s." +msgstr "" +"Error: '%s'. Probablemente el %s ha sido eliminado de WordPress. Si es el " +"caso, intente eliminar la vinculación del %s." + +#. module: connector_extension_wordpress +#: code:addons/connector_extension_wordpress/components/adapter.py:0 +#, python-format +msgid "" +"Error: '%s'. Probably the image or document is uploaded with bad format. " +"Please, review on database: %s" +msgstr "" +"Error: '%s'. Probablemente la imagen o el documento se ha subido con un " +"formato incorrecto. Por favor, revise en la base de datos: %s" + +#. module: connector_extension_wordpress +#: code:addons/connector_extension_wordpress/components/adapter.py:0 +#, python-format +msgid "Wordpress not connected" +msgstr "WordPress no conectado" diff --git a/connector_extension_wordpress/readme/CONTRIBUTORS.rst b/connector_extension_wordpress/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..e468d95a0 --- /dev/null +++ b/connector_extension_wordpress/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* `NuoBiT `__: + + * Kilian Niubo + * Eric Antones diff --git a/connector_extension_wordpress/readme/DESCRIPTION.rst b/connector_extension_wordpress/readme/DESCRIPTION.rst new file mode 100644 index 000000000..84d9866b2 --- /dev/null +++ b/connector_extension_wordpress/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module extends the connector extension module to add support for Wordpress diff --git a/connector_extension_wordpress/static/description/icon.png b/connector_extension_wordpress/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd641e792c30455187ca30940bc0f329ce8bbb0 GIT binary patch literal 6342 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 literal 0 HcmV?d00001 diff --git a/connector_extension_wordpress/static/description/index.html b/connector_extension_wordpress/static/description/index.html new file mode 100644 index 000000000..2c905bb70 --- /dev/null +++ b/connector_extension_wordpress/static/description/index.html @@ -0,0 +1,421 @@ + + + + + + +Connector Extension Wordpress + + + +
+

Connector Extension Wordpress

+ + +

Beta License: LGPL-3 NuoBiT/odoo-addons

+

This module extends the connector extension module to add support for Wordpress

+

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

+
    +
  • NuoBiT Solutions
  • +
  • SL
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is part of the NuoBiT/odoo-addons project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/setup/connector_extension_wordpress/odoo/addons/connector_extension_wordpress b/setup/connector_extension_wordpress/odoo/addons/connector_extension_wordpress new file mode 120000 index 000000000..aa5befdcc --- /dev/null +++ b/setup/connector_extension_wordpress/odoo/addons/connector_extension_wordpress @@ -0,0 +1 @@ +../../../../connector_extension_wordpress \ No newline at end of file diff --git a/setup/connector_extension_wordpress/setup.py b/setup/connector_extension_wordpress/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/connector_extension_wordpress/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From 4ddd7eb4170a41b882606c999585d8c58819f25e Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Tue, 2 Dec 2025 13:22:21 +0100 Subject: [PATCH 2/4] [IMP+FIX+REF] connector_extension_wordpress --- connector_extension_wordpress/components/adapter.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/connector_extension_wordpress/components/adapter.py b/connector_extension_wordpress/components/adapter.py index 613dee64b..7ce1b3793 100644 --- a/connector_extension_wordpress/components/adapter.py +++ b/connector_extension_wordpress/components/adapter.py @@ -24,7 +24,7 @@ def _exec(self, op, resource, *args, **kwargs): return func(resource, *args, **kwargs) def _manage_error_codes( - self, res_data, res, resource, raise_on_error=True, **kwargs + self, op, res_data, res, resource, *args, raise_on_error=True, **kwargs ): if not res.ok: error_message = None @@ -57,7 +57,9 @@ def _exec_wp_call(self, op, resource, *args, **kwargs): try: res = func(url, *args, **kwargs) res_data = res.json() - res_data = self._manage_error_codes(res_data, res, resource, **kwargs) + res_data = self._manage_error_codes( + op, res_data, res, resource, *args, **kwargs + ) result = { "ok": res.ok, "status_code": res.status_code, From cccda95e06b636c1b9ad09ff46eac408cfda9cc0 Mon Sep 17 00:00:00 2001 From: ??? Date: Mon, 30 Mar 2026 09:46:19 +0200 Subject: [PATCH 3/4] [IMP] connector_extension_wordpress: pre-commit auto fixes --- connector_extension_wordpress/README.rst | 21 ++++++++++--------- connector_extension_wordpress/__manifest__.py | 2 +- .../components/adapter.py | 6 +++--- connector_extension_wordpress/pyproject.toml | 3 +++ .../readme/CONTRIBUTORS.md | 3 +++ .../readme/CONTRIBUTORS.rst | 4 ---- .../{DESCRIPTION.rst => DESCRIPTION.md} | 3 ++- .../static/description/index.html | 17 ++++++++------- 8 files changed, 32 insertions(+), 27 deletions(-) create mode 100644 connector_extension_wordpress/pyproject.toml create mode 100644 connector_extension_wordpress/readme/CONTRIBUTORS.md delete mode 100644 connector_extension_wordpress/readme/CONTRIBUTORS.rst rename connector_extension_wordpress/readme/{DESCRIPTION.rst => DESCRIPTION.md} (80%) diff --git a/connector_extension_wordpress/README.rst b/connector_extension_wordpress/README.rst index 22f6167de..e8f342293 100644 --- a/connector_extension_wordpress/README.rst +++ b/connector_extension_wordpress/README.rst @@ -17,12 +17,13 @@ Connector Extension Wordpress :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-NuoBiT%2Fodoo--addons-lightgray.png?logo=github - :target: https://github.com/NuoBiT/odoo-addons/tree/14.0/connector_extension_wordpress + :target: https://github.com/NuoBiT/odoo-addons/tree/18.0/connector_extension_wordpress :alt: NuoBiT/odoo-addons |badge1| |badge2| |badge3| -This module extends the connector extension module to add support for Wordpress +This module extends the connector extension module to add support for +Wordpress **Table of contents** @@ -35,7 +36,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. @@ -43,22 +44,22 @@ Credits ======= Authors -~~~~~~~ +------- * NuoBiT Solutions * SL Contributors -~~~~~~~~~~~~ +------------ -* `NuoBiT `__: +- `NuoBiT `__: - * Kilian Niubo - * Eric Antones + - Kilian Niubo + - Eric Antones Maintainers -~~~~~~~~~~~ +----------- -This module is part of the `NuoBiT/odoo-addons `_ project on GitHub. +This module is part of the `NuoBiT/odoo-addons `_ project on GitHub. You are welcome to contribute. diff --git a/connector_extension_wordpress/__manifest__.py b/connector_extension_wordpress/__manifest__.py index d49a162a8..b9b95fbab 100644 --- a/connector_extension_wordpress/__manifest__.py +++ b/connector_extension_wordpress/__manifest__.py @@ -10,6 +10,6 @@ "author": "NuoBiT Solutions, SL", "license": "LGPL-3", "category": "Connector", - "website": "https://github.com/nuobit/odoo-addons", + "website": "https://github.com/NuoBiT/odoo-addons", "depends": ["connector_extension"], } diff --git a/connector_extension_wordpress/components/adapter.py b/connector_extension_wordpress/components/adapter.py index 7ce1b3793..5861634f0 100644 --- a/connector_extension_wordpress/components/adapter.py +++ b/connector_extension_wordpress/components/adapter.py @@ -118,7 +118,7 @@ def _exec_get(self, resource, *args, **kwargs): ), verify=self.backend_record.verify_ssl, *args, - **kwargs + **kwargs, ) # WooCommerce has the parameter next on the response headers # to get the next page but we can't use it because if we use @@ -153,7 +153,7 @@ def _exec_get(self, resource, *args, **kwargs): ), verify=self.backend_record.verify_ssl, *args, - **kwargs + **kwargs, ) # WooCommerce returns a dict if the response is a single item if not isinstance(res["data"], list): @@ -199,7 +199,7 @@ def _exec_put(self, resource, *args, **kwargs): auth=auth, verify=self.backend_record.verify_ssl, *args, - **kwargs + **kwargs, ) return res["data"] diff --git a/connector_extension_wordpress/pyproject.toml b/connector_extension_wordpress/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/connector_extension_wordpress/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/connector_extension_wordpress/readme/CONTRIBUTORS.md b/connector_extension_wordpress/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..e861d9e77 --- /dev/null +++ b/connector_extension_wordpress/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [NuoBiT](https://www.nuobit.com): + - Kilian Niubo \ + - Eric Antones \ diff --git a/connector_extension_wordpress/readme/CONTRIBUTORS.rst b/connector_extension_wordpress/readme/CONTRIBUTORS.rst deleted file mode 100644 index e468d95a0..000000000 --- a/connector_extension_wordpress/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1,4 +0,0 @@ -* `NuoBiT `__: - - * Kilian Niubo - * Eric Antones diff --git a/connector_extension_wordpress/readme/DESCRIPTION.rst b/connector_extension_wordpress/readme/DESCRIPTION.md similarity index 80% rename from connector_extension_wordpress/readme/DESCRIPTION.rst rename to connector_extension_wordpress/readme/DESCRIPTION.md index 84d9866b2..6340d617e 100644 --- a/connector_extension_wordpress/readme/DESCRIPTION.rst +++ b/connector_extension_wordpress/readme/DESCRIPTION.md @@ -1 +1,2 @@ -This module extends the connector extension module to add support for Wordpress +This module extends the connector extension module to add support for +Wordpress diff --git a/connector_extension_wordpress/static/description/index.html b/connector_extension_wordpress/static/description/index.html index 2c905bb70..cec230736 100644 --- a/connector_extension_wordpress/static/description/index.html +++ b/connector_extension_wordpress/static/description/index.html @@ -1,4 +1,3 @@ - @@ -9,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -275,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -301,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -369,8 +369,9 @@

Connector Extension Wordpress

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:5acc311916374a5c8b68547091798eb4307996ed461862d35d5563b1c1b6bdd1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: LGPL-3 NuoBiT/odoo-addons

-

This module extends the connector extension module to add support for Wordpress

+

Beta License: LGPL-3 NuoBiT/odoo-addons

+

This module extends the connector extension module to add support for +Wordpress

Table of contents

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

@@ -412,7 +413,7 @@

Contributors

Maintainers

-

This module is part of the NuoBiT/odoo-addons project on GitHub.

+

This module is part of the NuoBiT/odoo-addons project on GitHub.

You are welcome to contribute.

From 0c960c38025f71f8d7810ecba856dabbfc540738 Mon Sep 17 00:00:00 2001 From: ??? Date: Mon, 30 Mar 2026 10:20:05 +0200 Subject: [PATCH 4/4] [MIG] connector_extension_wordpress: Migration to 18.0 --- connector_extension_wordpress/README.rst | 8 ++-- connector_extension_wordpress/__manifest__.py | 5 ++- .../components/adapter.py | 43 ++++++++++++------- .../readme/CONTRIBUTORS.md | 5 ++- .../static/description/index.html | 8 ++-- 5 files changed, 42 insertions(+), 27 deletions(-) diff --git a/connector_extension_wordpress/README.rst b/connector_extension_wordpress/README.rst index e8f342293..16ccce2ee 100644 --- a/connector_extension_wordpress/README.rst +++ b/connector_extension_wordpress/README.rst @@ -46,16 +46,16 @@ Credits Authors ------- -* NuoBiT Solutions -* SL +* NuoBiT Solutions SL Contributors ------------ - `NuoBiT `__: - - Kilian Niubo - - Eric Antones + - Kilian Niubo kniubo@nuobit.com + - Eric Antones eantones@nuobit.com + - Deniz Gallo dgallo@nuobit.com Maintainers ----------- diff --git a/connector_extension_wordpress/__manifest__.py b/connector_extension_wordpress/__manifest__.py index b9b95fbab..6c14616af 100644 --- a/connector_extension_wordpress/__manifest__.py +++ b/connector_extension_wordpress/__manifest__.py @@ -1,13 +1,14 @@ # Copyright NuoBiT Solutions - Kilian Niubo # Copyright NuoBiT Solutions - Eric Antones +# Copyright 2026 NuoBiT Solutions SL - Deniz Gallo # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html) { "name": "Connector Extension Wordpress", "summary": "This module extends the connector extension module " "to add support for Wordpress", - "version": "14.0.1.0.0", - "author": "NuoBiT Solutions, SL", + "version": "18.0.1.0.0", + "author": "NuoBiT Solutions SL", "license": "LGPL-3", "category": "Connector", "website": "https://github.com/NuoBiT/odoo-addons", diff --git a/connector_extension_wordpress/components/adapter.py b/connector_extension_wordpress/components/adapter.py index 5861634f0..add68ec98 100644 --- a/connector_extension_wordpress/components/adapter.py +++ b/connector_extension_wordpress/components/adapter.py @@ -1,4 +1,5 @@ # Copyright NuoBiT Solutions - Kilian Niubo +# Copyright 2026 NuoBiT Solutions SL - Deniz Gallo # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html) import json @@ -20,7 +21,7 @@ class ConnectorExtensionWordpressAdapterCRUD(AbstractComponent): _inherit = "connector.extension.adapter.crud" def _exec(self, op, resource, *args, **kwargs): - func = getattr(self, "_exec_%s" % op) + func = getattr(self, f"_exec_{op}") return func(resource, *args, **kwargs) def _manage_error_codes( @@ -31,21 +32,29 @@ def _manage_error_codes( if res.status_code == 404: if res_data.get("code") == "rest_post_invalid_id": error_message = _( - "Error: '%s'. Probably the %s has been " + "Error: '%(message)s'. Probably the %(resource)s has been " "removed from WordPress. " - "If it's the case, try to remove the binding of the %s." - % (res_data.get("message"), resource, self.model._name) - ) + "If it's the case, try to remove the binding of the %(model)s." + ) % { + "message": res_data.get("message"), + "resource": resource, + "model": self.model._name, + } elif res.status_code == 500: if res_data.get("code") == "rest_upload_sideload_error": error_message = _( - "Error: '%s'. Probably the image or document " + "Error: '%(message)s'. Probably the image or document " "is uploaded with bad format. " - "Please, review on database: %s" - % (res_data["message"], kwargs["headers"]) - ) + "Please, review on database: %(resource)s" + ) % { + "message": res_data["message"], + "resource": kwargs["headers"], + } if not error_message: - error_message = _("Error: %s, Resource: %s" % (res_data, resource)) + error_message = _("Error: %(message)s, Resource: %(resource)s") % { + "message": res_data, + "resource": resource, + } if raise_on_error: raise ValidationError(error_message) return error_message @@ -70,7 +79,11 @@ def _exec_wp_call(self, op, resource, *args, **kwargs): raise RetryableJobError(_("Error connecting to WordPress: %s") % e) from e except json.JSONDecodeError as e: raise ValidationError( - _("Error decoding json WordPress response: %s\n%s") % (e, res.text) + _("Error decoding json WordPress response: %(message)s\n%(response)s") + % { + "message": e, + "response": res.text if res else _("No response"), + } ) from e return result @@ -112,12 +125,12 @@ def _exec_get(self, resource, *args, **kwargs): return self._exec_wp_call( "get", resource, + *args, auth=( self.backend_record.username, self.backend_record.application_password, ), verify=self.backend_record.verify_ssl, - *args, **kwargs, ) # WooCommerce has the parameter next on the response headers @@ -146,13 +159,13 @@ def _exec_get(self, resource, *args, **kwargs): res = self._exec_wp_call( "get", resource, + *args, params=params, auth=( self.backend_record.username, self.backend_record.application_password, ), verify=self.backend_record.verify_ssl, - *args, **kwargs, ) # WooCommerce returns a dict if the response is a single item @@ -193,12 +206,12 @@ def _exec_put(self, resource, *args, **kwargs): res = self._exec_wp_call( "put", resource, + *args, data=data, params=data_aux, headers=headers, auth=auth, verify=self.backend_record.verify_ssl, - *args, **kwargs, ) return res["data"] @@ -212,6 +225,6 @@ def _exec_options(self, resource, *args, **kwargs): def get_version(self): settings = self._exec("get", "settings") if settings and settings[0].get("title"): - return "Wordpress '%s' connected" % settings[0].get("title") + return "Wordpress '{}' connected".format(settings[0].get("title")) else: raise ValidationError(_("Wordpress not connected")) diff --git a/connector_extension_wordpress/readme/CONTRIBUTORS.md b/connector_extension_wordpress/readme/CONTRIBUTORS.md index e861d9e77..0355cecbc 100644 --- a/connector_extension_wordpress/readme/CONTRIBUTORS.md +++ b/connector_extension_wordpress/readme/CONTRIBUTORS.md @@ -1,3 +1,4 @@ - [NuoBiT](https://www.nuobit.com): - - Kilian Niubo \ - - Eric Antones \ + - Kilian Niubo + - Eric Antones + - Deniz Gallo diff --git a/connector_extension_wordpress/static/description/index.html b/connector_extension_wordpress/static/description/index.html index cec230736..5b4765460 100644 --- a/connector_extension_wordpress/static/description/index.html +++ b/connector_extension_wordpress/static/description/index.html @@ -397,16 +397,16 @@

Credits

Authors

    -
  • NuoBiT Solutions
  • -
  • SL
  • +
  • NuoBiT Solutions SL

Contributors