From 8faaea9b1e0f17c4e25042b5256ce7ed306fe5f8 Mon Sep 17 00:00:00 2001 From: Victor Fernandez de Alba Date: Sat, 8 Mar 2025 12:32:26 +0100 Subject: [PATCH 1/3] Add is_multilingual to @site endpoint --- src/plone/restapi/services/site/get.py | 10 +++++++ src/plone/restapi/tests/test_services_site.py | 29 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/plone/restapi/services/site/get.py b/src/plone/restapi/services/site/get.py index b6f0c5a803..5c31d437d4 100644 --- a/src/plone/restapi/services/site/get.py +++ b/src/plone/restapi/services/site/get.py @@ -5,6 +5,7 @@ from plone.event.utils import validated_timezone from plone.i18n.interfaces import ILanguageSchema from plone.registry.interfaces import IRegistry +from plone.restapi import HAS_MULTILINGUAL from plone.restapi.bbb import IImagingSchema from plone.restapi.bbb import ISiteSchema from plone.restapi.interfaces import IExpandableElement @@ -18,6 +19,10 @@ from zope.interface import Interface +if HAS_MULTILINGUAL: + from plone.app.multilingual.interfaces import IPloneAppMultilingualInstalled + + @implementer(IExpandableElement) @adapter(Interface, Interface) class Site: @@ -54,6 +59,11 @@ def __call__(self, expand=False): } ) + if HAS_MULTILINGUAL and IPloneAppMultilingualInstalled.providedBy(self.request): + result["site"]["plone.is_multilingual"] = True + else: + result["site"]["plone.is_multilingual"] = False + return result def plone_timezone(self): diff --git a/src/plone/restapi/tests/test_services_site.py b/src/plone/restapi/tests/test_services_site.py index 37d764088a..f9a7814bd7 100644 --- a/src/plone/restapi/tests/test_services_site.py +++ b/src/plone/restapi/tests/test_services_site.py @@ -1,9 +1,12 @@ # -*- coding: utf-8 -*- +from plone.app.multilingual.interfaces import IPloneAppMultilingualInstalled from plone.app.testing import setRoles from plone.app.testing import TEST_USER_ID from plone.restapi.testing import PLONE_RESTAPI_DX_FUNCTIONAL_TESTING +from plone.restapi.testing import PLONE_RESTAPI_DX_PAM_FUNCTIONAL_TESTING from plone.restapi.testing import RelativeSession from zope.component import getMultiAdapter +from zope.interface import alsoProvides import unittest @@ -38,3 +41,29 @@ def test_get_site(self): self.assertIn("plone.available_languages", response.json()) self.assertIn("plone.default_language", response.json()) self.assertEqual(response.json()["plone.portal_timezone"], "UTC") + self.assertEqual(response.json()["plone.is_multilingual"], False) + + +class TestServicesSiteMultilingual(unittest.TestCase): + + layer = PLONE_RESTAPI_DX_PAM_FUNCTIONAL_TESTING + + def setUp(self): + self.portal = self.layer["portal"] + self.portal_url = self.portal.absolute_url() + self.request = self.layer["request"] + + self.api_session = RelativeSession(self.portal_url, test=self) + self.api_session.headers.update({"Accept": "application/json"}) + + alsoProvides(self.layer["request"], IPloneAppMultilingualInstalled) + + def tearDown(self): + self.api_session.close() + + def test_site_is_multilingual(self): + response = self.api_session.get("/@site") + + self.assertEqual(response.status_code, 200) + self.assertIn("plone.is_multilingual", response.json()) + self.assertEqual(response.json()["plone.is_multilingual"], True) From c2fc9506adfccdd0f10beac2c3a36a7ba6285881 Mon Sep 17 00:00:00 2001 From: Victor Fernandez de Alba Date: Sat, 8 Mar 2025 12:33:58 +0100 Subject: [PATCH 2/3] Changelog --- news/1884.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 news/1884.feature diff --git a/news/1884.feature b/news/1884.feature new file mode 100644 index 0000000000..c1b033ba04 --- /dev/null +++ b/news/1884.feature @@ -0,0 +1 @@ +Added `is_multilingual` to @site endpoint. @sneridagh From 8381954c1e3ed7c5214d4dd3597104067f557340 Mon Sep 17 00:00:00 2001 From: David Glick Date: Sun, 9 Mar 2025 15:24:40 -0700 Subject: [PATCH 3/3] Use feature instead of plone.is_multilingual --- news/1884.feature | 2 +- src/plone/restapi/services/site/get.py | 7 ++----- src/plone/restapi/tests/http-examples/site_get.resp | 3 ++- src/plone/restapi/tests/test_services_site.py | 5 ++--- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/news/1884.feature b/news/1884.feature index c1b033ba04..fe0ed9c9fe 100644 --- a/news/1884.feature +++ b/news/1884.feature @@ -1 +1 @@ -Added `is_multilingual` to @site endpoint. @sneridagh +Added `multilingual` feature to @site endpoint. @sneridagh diff --git a/src/plone/restapi/services/site/get.py b/src/plone/restapi/services/site/get.py index 7d31ada3f8..d919e326b9 100644 --- a/src/plone/restapi/services/site/get.py +++ b/src/plone/restapi/services/site/get.py @@ -58,11 +58,6 @@ def __call__(self, expand=False): } ) - if HAS_MULTILINGUAL and IPloneAppMultilingualInstalled.providedBy(self.request): - result["site"]["plone.is_multilingual"] = True - else: - result["site"]["plone.is_multilingual"] = False - return result def plone_timezone(self): @@ -93,6 +88,8 @@ def features(self): "filter_aliases_by_date": hasattr( RedirectionSet, "supports_date_range_filtering" ), + "multilingual": HAS_MULTILINGUAL + and IPloneAppMultilingualInstalled.providedBy(self.request), } return result diff --git a/src/plone/restapi/tests/http-examples/site_get.resp b/src/plone/restapi/tests/http-examples/site_get.resp index 417c0cbf83..a304ab1dbf 100644 --- a/src/plone/restapi/tests/http-examples/site_get.resp +++ b/src/plone/restapi/tests/http-examples/site_get.resp @@ -4,7 +4,8 @@ Content-Type: application/json { "@id": "http://localhost:55001/plone/@site", "features": { - "filter_aliases_by_date": true + "filter_aliases_by_date": true, + "multilingual": false }, "plone.allowed_sizes": [ "huge 1600:65536", diff --git a/src/plone/restapi/tests/test_services_site.py b/src/plone/restapi/tests/test_services_site.py index d10c9f98d2..2f94e04823 100644 --- a/src/plone/restapi/tests/test_services_site.py +++ b/src/plone/restapi/tests/test_services_site.py @@ -40,7 +40,7 @@ def test_get_site(self): self.assertIn("plone.available_languages", response.json()) self.assertIn("plone.default_language", response.json()) self.assertEqual(response.json()["plone.portal_timezone"], "UTC") - self.assertEqual(response.json()["plone.is_multilingual"], False) + self.assertEqual(response.json()["features"]["multilingual"], False) class TestServicesSiteMultilingual(unittest.TestCase): @@ -64,5 +64,4 @@ def test_site_is_multilingual(self): response = self.api_session.get("/@site") self.assertEqual(response.status_code, 200) - self.assertIn("plone.is_multilingual", response.json()) - self.assertEqual(response.json()["plone.is_multilingual"], True) + self.assertEqual(response.json()["features"]["multilingual"], True)