diff --git a/news/404.bugfix b/news/404.bugfix new file mode 100644 index 000000000..26707eee0 --- /dev/null +++ b/news/404.bugfix @@ -0,0 +1,2 @@ +Fix date conversion between collection query and ``expand_events`` filtering. +[petschki] diff --git a/plone/app/event/browser/event_listing.py b/plone/app/event/browser/event_listing.py index 55c0f2e12..e01de7055 100644 --- a/plone/app/event/browser/event_listing.py +++ b/plone/app/event/browser/event_listing.py @@ -222,6 +222,13 @@ def _expand_events_start_end(self, start, end): # XXX: This actually fits most needs, but not all. Maybe someone # wants to come up with some edgecases! se = dict(start=None, end=None) + + def safe_dt(val): + # convert value from DateTime to datetime + if hasattr(val, "asdatetime"): + return val.asdatetime() + return val + if start: q = start.get("query") r = start.get("range") @@ -238,7 +245,7 @@ def _expand_events_start_end(self, start, end): r = end.get("range") if r == "min": se["start"] = q - return se["start"], se["end"] + return safe_dt(se["start"]), safe_dt(se["end"]) def formatted_date(self, occ): provider = getMultiAdapter( diff --git a/plone/app/event/tests/test_event_listing.py b/plone/app/event/tests/test_event_listing.py index 5eb94662a..db67bbd80 100644 --- a/plone/app/event/tests/test_event_listing.py +++ b/plone/app/event/tests/test_event_listing.py @@ -1,3 +1,4 @@ +from DateTime import DateTime from plone.app.event.base import localized_today from plone.app.event.testing import make_fake_response from plone.app.event.testing import PAEventDX_INTEGRATION_TESTING @@ -151,3 +152,30 @@ def test_no_date_filtering(self): "mode_day", ]: self.assertTrue(_class not in out) + + @mock.patch("plone.app.event.browser.event_listing.localized_now", new=PN) + @mock.patch("plone.app.event.base.localized_now", new=PN) + def test_end_date_filtering(self): + """Test date conversion between collection query and 'expand_events' + filtering. + """ + # plone.app.contenttypes ICollection type + self.portal.invokeFactory("Collection", "col_with_date_criterion", title="Col") + collection = self.portal.col_with_date_criterion + collection.query = [ + { + "i": "portal_type", + "o": "plone.app.querystring.operation.selection.any", + "v": ["Event", "plone.app.event.dx.event"], + }, + { + "i": "end", + "o": "plone.app.querystring.operation.date.largerThan", + "v": DateTime(PN()), + }, + ] + + view = self.portal.col_with_date_criterion.restrictedTraverse("@@event_listing") + view() + + self.assertIs(len(self.portal.col_with_date_criterion.results()), 3)