From 849723aca7c48c1299919a5c2e8bd8f01d89c801 Mon Sep 17 00:00:00 2001 From: Mikel Larreategi Date: Thu, 12 Sep 2024 14:32:53 +0200 Subject: [PATCH 1/5] add a failing test --- .../restapi/tests/test_serializer_summary.py | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/plone/restapi/tests/test_serializer_summary.py b/src/plone/restapi/tests/test_serializer_summary.py index 16b54f7b0..fbc8862c1 100644 --- a/src/plone/restapi/tests/test_serializer_summary.py +++ b/src/plone/restapi/tests/test_serializer_summary.py @@ -1,16 +1,23 @@ +from datetime import datetime +from datetime import timedelta from DateTime import DateTime from plone.app.contentlisting.interfaces import IContentListingObject +from plone.app.event.dx.traverser import OccurrenceTraverser from plone.app.testing import popGlobalRegistry from plone.app.testing import pushGlobalRegistry from plone.dexterity.utils import createContentInContainer +from plone.event.interfaces import IEvent +from plone.event.interfaces import IEventRecurrence from plone.restapi.interfaces import ISerializeToJsonSummary from plone.restapi.testing import PLONE_RESTAPI_DX_INTEGRATION_TESTING from plone.restapi.testing import register_static_uuid_utility from Products.CMFCore.utils import getToolByName from zope.component import getMultiAdapter from zope.component.hooks import getSite +from zope.interface import alsoProvides import Missing +import transaction import unittest @@ -203,3 +210,43 @@ def test_dx_type_summary(self): }, summary, ) + +class TestSummarySerializerswithRecurrenceObjects(unittest.TestCase): + layer = PLONE_RESTAPI_DX_INTEGRATION_TESTING + + def setUp(self): + self.portal = self.layer["portal"] + self.request = self.layer["request"] + + pushGlobalRegistry(getSite()) + register_static_uuid_utility(prefix="c6dcbd55ab2746e199cd4ed458") + + behaviors = self.portal.portal_types.DXTestDocument.behaviors + behaviors = behaviors + ('plone.eventbasic', 'plone.eventrecurrence',) + self.portal.portal_types.DXTestDocument.behaviors = behaviors + + self.event = createContentInContainer( + self.portal, + "DXTestDocument", + id="doc1", + title="Lorem Ipsum event", + description="Description event", + start=datetime.now(), + end=datetime.now() + timedelta(hours=1), + recurrence="RRULE:FREQ=DAILY;COUNT=3" # see https://github.com/plone/plone.app.event/blob/master/plone/app/event/tests/base_setup.py + ) + + alsoProvides(self.event, IEvent) + alsoProvides(self.event, IEventRecurrence) + + def tearDown(self): + popGlobalRegistry(getSite()) + + def test_dx_event_with_recurrence(self): + tomorrow = datetime.now() + timedelta(days=1) + tomorrow_str = tomorrow.strftime('%Y-%m-%d') + ot = OccurrenceTraverser(self.event, self.request) + ocurrence = ot.publishTraverse(self.request, tomorrow_str) + summary = getMultiAdapter((ocurrence, self.request), ISerializeToJsonSummary)() + + self.assertEqual(summary, {}) From 709f8e41830a8dc80b72a09d7925df511e5bb5a7 Mon Sep 17 00:00:00 2001 From: Mikel Larreategi Date: Thu, 12 Sep 2024 14:33:35 +0200 Subject: [PATCH 2/5] add a check for objects that are not able to be adapted to IContentListing --- src/plone/restapi/serializer/summary.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/plone/restapi/serializer/summary.py b/src/plone/restapi/serializer/summary.py index a18ed98a8..8b8c36dc9 100644 --- a/src/plone/restapi/serializer/summary.py +++ b/src/plone/restapi/serializer/summary.py @@ -83,7 +83,10 @@ def __init__(self, context, request): self.blocklisted_attributes = metadata["blocklisted_attributes"] def __call__(self): - obj = IContentListingObject(self.context) + try: + obj = IContentListingObject(self.context) + except TypeError: + return {} summary = {} for field in self.metadata_fields(): From 631baff3045bfd7c0c8631414b055bab84652a2e Mon Sep 17 00:00:00 2001 From: Mikel Larreategi Date: Thu, 12 Sep 2024 14:34:50 +0200 Subject: [PATCH 3/5] changelog --- news/1810.bugfix | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 news/1810.bugfix diff --git a/news/1810.bugfix b/news/1810.bugfix new file mode 100644 index 000000000..af19b6105 --- /dev/null +++ b/news/1810.bugfix @@ -0,0 +1,2 @@ +Safely convert objects to IContentListingObject +[erral] From 921e4c3657359a68f75f42fd39ab8a11c9d907e7 Mon Sep 17 00:00:00 2001 From: Mikel Larreategi Date: Thu, 12 Sep 2024 14:37:18 +0200 Subject: [PATCH 4/5] run black --- .../restapi/tests/test_serializer_summary.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/plone/restapi/tests/test_serializer_summary.py b/src/plone/restapi/tests/test_serializer_summary.py index fbc8862c1..e0ad82355 100644 --- a/src/plone/restapi/tests/test_serializer_summary.py +++ b/src/plone/restapi/tests/test_serializer_summary.py @@ -211,8 +211,9 @@ def test_dx_type_summary(self): summary, ) + class TestSummarySerializerswithRecurrenceObjects(unittest.TestCase): - layer = PLONE_RESTAPI_DX_INTEGRATION_TESTING + layer = PLONE_RESTAPI_DX_INTEGRATION_TESTING def setUp(self): self.portal = self.layer["portal"] @@ -220,9 +221,12 @@ def setUp(self): pushGlobalRegistry(getSite()) register_static_uuid_utility(prefix="c6dcbd55ab2746e199cd4ed458") - + behaviors = self.portal.portal_types.DXTestDocument.behaviors - behaviors = behaviors + ('plone.eventbasic', 'plone.eventrecurrence',) + behaviors = behaviors + ( + "plone.eventbasic", + "plone.eventrecurrence", + ) self.portal.portal_types.DXTestDocument.behaviors = behaviors self.event = createContentInContainer( @@ -233,7 +237,7 @@ def setUp(self): description="Description event", start=datetime.now(), end=datetime.now() + timedelta(hours=1), - recurrence="RRULE:FREQ=DAILY;COUNT=3" # see https://github.com/plone/plone.app.event/blob/master/plone/app/event/tests/base_setup.py + recurrence="RRULE:FREQ=DAILY;COUNT=3", # see https://github.com/plone/plone.app.event/blob/master/plone/app/event/tests/base_setup.py ) alsoProvides(self.event, IEvent) @@ -244,9 +248,9 @@ def tearDown(self): def test_dx_event_with_recurrence(self): tomorrow = datetime.now() + timedelta(days=1) - tomorrow_str = tomorrow.strftime('%Y-%m-%d') + tomorrow_str = tomorrow.strftime("%Y-%m-%d") ot = OccurrenceTraverser(self.event, self.request) ocurrence = ot.publishTraverse(self.request, tomorrow_str) summary = getMultiAdapter((ocurrence, self.request), ISerializeToJsonSummary)() - + self.assertEqual(summary, {}) From 13a3c861cd6f1291967d026f4d508483c135a8e5 Mon Sep 17 00:00:00 2001 From: Mikel Larreategi Date: Thu, 12 Sep 2024 14:37:38 +0200 Subject: [PATCH 5/5] run flake8 --- src/plone/restapi/tests/test_serializer_summary.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plone/restapi/tests/test_serializer_summary.py b/src/plone/restapi/tests/test_serializer_summary.py index e0ad82355..36296d78c 100644 --- a/src/plone/restapi/tests/test_serializer_summary.py +++ b/src/plone/restapi/tests/test_serializer_summary.py @@ -17,7 +17,6 @@ from zope.interface import alsoProvides import Missing -import transaction import unittest