diff --git a/news/1674.bugfix b/news/1674.bugfix new file mode 100644 index 0000000000..ddfb6d133c --- /dev/null +++ b/news/1674.bugfix @@ -0,0 +1 @@ +Fixed `allow_discussion` serialization for the Plone Site, to return a boolean like other content types. @Akshat2Jain \ No newline at end of file diff --git a/src/plone/restapi/serializer/dxcontent.py b/src/plone/restapi/serializer/dxcontent.py index f3967e145b..0154f1c91f 100644 --- a/src/plone/restapi/serializer/dxcontent.py +++ b/src/plone/restapi/serializer/dxcontent.py @@ -21,6 +21,7 @@ from plone.supermodel.utils import mergedTaggedValueDict from Products.CMFCore.utils import getToolByName from Products.CMFPlone.utils import base_hasattr +from Products.CMFCore.interfaces import IContentish from zope.component import adapter from zope.component import getMultiAdapter from zope.component import queryMultiAdapter @@ -39,6 +40,18 @@ WorkingCopyInfo = None +def get_allow_discussion_value(context, request, result): + # This test is to handle the plone.app.discussion not being installed situation + if "allow_discussion" in result: + # Check if the content item implements the IContentish interface + if IContentish.providedBy(context): + result["allow_discussion"] = getMultiAdapter( + (context, request), name="conversation_view" + ).enabled() + else: + result["allow_discussion"] = False + + @implementer(ISerializeToJson) @adapter(IDexterityContent, Interface) class SerializeToJson: @@ -125,9 +138,7 @@ def __call__(self, version=None, include_items=True): if target_url: result["targetUrl"] = target_url - result["allow_discussion"] = getMultiAdapter( - (self.context, self.request), name="conversation_view" - ).enabled() + get_allow_discussion_value(self.context, self.request, result) return result diff --git a/src/plone/restapi/serializer/site.py b/src/plone/restapi/serializer/site.py index afb7786081..11c5a0a2a3 100644 --- a/src/plone/restapi/serializer/site.py +++ b/src/plone/restapi/serializer/site.py @@ -23,6 +23,7 @@ from zope.interface import Interface from zope.schema import getFields from zope.security.interfaces import IPermission +from plone.restapi.serializer.dxcontent import get_allow_discussion_value import json @@ -121,6 +122,8 @@ def __call__(self, version=None): for brain in batch ] + get_allow_discussion_value(self.context, self.request, result) + return result def check_permission(self, permission_name, obj): diff --git a/src/plone/restapi/tests/test_dxcontent_serializer.py b/src/plone/restapi/tests/test_dxcontent_serializer.py index c853766d37..18d41cb953 100644 --- a/src/plone/restapi/tests/test_dxcontent_serializer.py +++ b/src/plone/restapi/tests/test_dxcontent_serializer.py @@ -26,10 +26,15 @@ from zope.component import queryUtility from zope.interface import Interface from zope.publisher.interfaces.browser import IBrowserRequest +from importlib import import_module import json import unittest +HAS_PLONE_61 = getattr( + import_module("Products.CMFPlone.factory"), "PLONE61MARKER", False +) + class AdapterCM: """Context manager that will temporarily register an adapter""" @@ -498,6 +503,17 @@ def test_allow_discussion_obj_instance_allows_global_enabled(self): self.assertIn("allow_discussion", obj) self.assertEqual(True, obj["allow_discussion"]) + @unittest.skipUnless( + HAS_PLONE_61, "Skipping test for Plone versions earlier than 6.1" + ) + def test_allow_discussion_portal_default(self): + """Not globally addable, not fti enabled, not obj instance enabled""" + serializer = getMultiAdapter((self.portal, self.request), ISerializeToJson) + obj = serializer() + + self.assertIn("allow_discussion", obj) + self.assertEqual(False, obj["allow_discussion"]) + def test_allow_discussion_obj_instance_not_set_global_enabled(self): self.portal.invokeFactory("Document", id="doc2") registry = queryUtility(IRegistry)