From 204ee166a12cb7d4d05e0f4c35f02a2c3798de5b Mon Sep 17 00:00:00 2001 From: Mauro Amico Date: Sat, 3 Feb 2024 01:19:27 +1030 Subject: [PATCH 01/29] Fix: occurrences indexing (#93) --- CHANGES.rst | 3 ++- src/redturtle/volto/monkey.py | 24 ++++++++++++------- .../volto/profiles/default/metadata.xml | 2 +- src/redturtle/volto/upgrades.py | 9 +++++++ src/redturtle/volto/upgrades.zcml | 11 ++++++++- 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 5dc8595..eef83e0 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,8 @@ Changelog 5.4.4 (unreleased) ------------------ -- Nothing changed yet. +- Fix: occurrences indexing + [mamico] 5.4.3 (2024-01-30) diff --git a/src/redturtle/volto/monkey.py b/src/redturtle/volto/monkey.py index 1cf7b78..609aa18 100644 --- a/src/redturtle/volto/monkey.py +++ b/src/redturtle/volto/monkey.py @@ -8,7 +8,8 @@ from plone.event.interfaces import IEventAccessor from plone.event.interfaces import IRecurrenceSupport from plone.event.recurrence import recurrence_sequence_ical -from plone.event.utils import pydt + +# from plone.event.utils import pydt from Products.CMFPlone.interfaces import IConstrainTypes from zope.globalrequest import getRequest @@ -75,13 +76,20 @@ def occurrences(self, range_start=None, range_end=None): # but doing it for backwards compatibility as views/templates # still rely on acquisition-wrapped objects. def get_obj(start): - if pydt(event_start.replace(microsecond=0)) == start: - # If the occurrence date is the same as the event object, the - # occurrence is the event itself. return it as such. - # Dates from recurrence_sequence_ical are explicitly without - # microseconds, while event.start may contain it. So we have to - # remove it for a valid comparison. - return self.context + # THIS IS THE PATCH + # + # -- questa parte รจ stata commentata, altrtimenti se lo start date coincide con la data di inizio dell'evento + # -- la funzione ritorna l'evento stesso, invece che la sua occorrenza e l'indice end non contiene + # -- tutte le date di end, ma solo quella dell'evento stesso + # + # if pydt(event_start.replace(microsecond=0)) == start: + # # If the occurrence date is the same as the event object, the + # # occurrence is the event itself. return it as such. + # # Dates from recurrence_sequence_ical are explicitly without + # # microseconds, while event.start may contain it. So we have to + # # remove it for a valid comparison. + # return self.context + # END OF PATCH return Occurrence( id=str(start.date()), start=start, end=start + duration ).__of__(self.context) diff --git a/src/redturtle/volto/profiles/default/metadata.xml b/src/redturtle/volto/profiles/default/metadata.xml index 64ffdf4..f40d93d 100644 --- a/src/redturtle/volto/profiles/default/metadata.xml +++ b/src/redturtle/volto/profiles/default/metadata.xml @@ -1,6 +1,6 @@ - 4302 + 4303 profile-plone.volto:default profile-plone.app.caching:with-caching-proxy diff --git a/src/redturtle/volto/upgrades.py b/src/redturtle/volto/upgrades.py index 0ab3a2e..ff45e9d 100644 --- a/src/redturtle/volto/upgrades.py +++ b/src/redturtle/volto/upgrades.py @@ -485,3 +485,12 @@ def to_4302(context): for brain in brains: event = brain.getObject() event.reindexObject(idxs=["start", "end"]) + + +def to_4303(context): + brains = api.content.find(portal_type="Event") + logger.info("Reindexing {} Events".format(len(brains))) + + for brain in brains: + event = brain.getObject() + event.reindexObject(idxs=["start", "end"]) diff --git a/src/redturtle/volto/upgrades.zcml b/src/redturtle/volto/upgrades.zcml index c4f1267..ff5d3b2 100644 --- a/src/redturtle/volto/upgrades.zcml +++ b/src/redturtle/volto/upgrades.zcml @@ -199,7 +199,7 @@ /> + + From ce4bece868307d3e0d9117a5fb8d7446ed5f79be Mon Sep 17 00:00:00 2001 From: Andrea Cecchi Date: Tue, 20 Feb 2024 11:13:35 +0100 Subject: [PATCH 02/29] Add adapters to handle internal references in BlocksFields (#91) * Add adapters for link integrity for content-types with BlocksField fields --- CHANGES.rst | 2 + .../volto/adapters/blocks_linkintegrity.py | 102 ++++++++++++++++++ src/redturtle/volto/adapters/configure.zcml | 20 ++++ 3 files changed, 124 insertions(+) create mode 100644 src/redturtle/volto/adapters/blocks_linkintegrity.py diff --git a/CHANGES.rst b/CHANGES.rst index eef83e0..f213afe 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,8 @@ Changelog 5.4.4 (unreleased) ------------------ +- Add adapters for link integrity for content-types with BlocksField fields. + [cekk] - Fix: occurrences indexing [mamico] diff --git a/src/redturtle/volto/adapters/blocks_linkintegrity.py b/src/redturtle/volto/adapters/blocks_linkintegrity.py new file mode 100644 index 0000000..b6ab2da --- /dev/null +++ b/src/redturtle/volto/adapters/blocks_linkintegrity.py @@ -0,0 +1,102 @@ +from collective.volto.blocksfield.field import BlocksField +from plone.app.linkintegrity.interfaces import IRetriever +from plone.app.linkintegrity.parser import extractLinks +from plone.app.textfield import RichText +from plone.dexterity.interfaces import IDexterityContainer +from plone.dexterity.interfaces import IDexterityContent +from plone.dexterity.interfaces import IDexterityFTI +from plone.dexterity.interfaces import IDexterityItem +from plone.dexterity.utils import getAdditionalSchemata +from plone.restapi.blocks import iter_block_transform_handlers +from plone.restapi.blocks import visit_blocks +from plone.restapi.blocks_linkintegrity import BlocksRetriever as BaseBlocksRetriever +from plone.restapi.blocks_linkintegrity import ( + GenericBlockLinksRetriever as BaseGenericBlockLinksRetriever, +) +from plone.restapi.blocks_linkintegrity import ( + SlateBlockLinksRetriever as BaseSlateBlockLinksRetriever, +) +from plone.restapi.blocks_linkintegrity import ( + TextBlockLinksRetriever as BaseTextBlockLinksRetriever, +) +from plone.restapi.interfaces import IBlockFieldLinkIntegrityRetriever +from redturtle.volto.interfaces import IRedturtleVoltoLayer +from zope.component import adapter +from zope.component import getUtility +from zope.interface import implementer +from zope.schema import getFieldsInOrder + + +class BaseRTRetriever(BaseBlocksRetriever): + def retrieveLinks(self): + """ + Check links in: + - blocks field + - text fields + - BlocksField fields + """ + # first do plone.restapi links generation + links = super().retrieveLinks() + + # then iterate over content schema and check for other references + fti = getUtility(IDexterityFTI, name=self.context.portal_type) + schema = fti.lookupSchema() + additional_schema = getAdditionalSchemata( + context=self.context, portal_type=self.context.portal_type + ) + schemas = [i for i in additional_schema] + [schema] + links = set() + for schema in schemas: + for name, field in getFieldsInOrder(schema): + if isinstance(field, RichText): + value = getattr(schema(self.context), name) + if not value or not getattr(value, "raw", None): + continue + links |= set(extractLinks(value.raw)) + elif isinstance(field, BlocksField): + value = field.get(self.context) + blocks = value.get("blocks", {}) + if not blocks: + continue + for block in visit_blocks(self.context, blocks): + for handler in iter_block_transform_handlers( + self.context, block, IBlockFieldLinkIntegrityRetriever + ): + links |= set(handler(block)) + return links + + +@implementer(IRetriever) +@adapter(IDexterityItem) +class BlocksRetrieverItem(BaseRTRetriever): + """ + Retriever for Item contents. + Needed a more specific than IDexterityContent because it's already registered. + """ + + +@implementer(IRetriever) +@adapter(IDexterityContainer) +class BlocksRetrieverContainer(BaseRTRetriever): + """ + Retriever for Container contents. + Needed a more specific than IDexterityContent because it's already registered. + """ + + +@adapter(IDexterityContent, IRedturtleVoltoLayer) +@implementer(IBlockFieldLinkIntegrityRetriever) +class TextBlockLinksRetriever(BaseTextBlockLinksRetriever): + """Retriever for text blocks""" + + +@adapter(IDexterityContent, IRedturtleVoltoLayer) +@implementer(IBlockFieldLinkIntegrityRetriever) +class SlateBlockLinksRetriever(BaseSlateBlockLinksRetriever): + """Retriever for slate blocks""" + + +@adapter(IDexterityContent, IRedturtleVoltoLayer) +@implementer(IBlockFieldLinkIntegrityRetriever) +class GenericBlockLinksRetriever(BaseGenericBlockLinksRetriever): + """Retriever for generic blocks""" diff --git a/src/redturtle/volto/adapters/configure.zcml b/src/redturtle/volto/adapters/configure.zcml index 2a1b1a6..9d54aa3 100644 --- a/src/redturtle/volto/adapters/configure.zcml +++ b/src/redturtle/volto/adapters/configure.zcml @@ -1,6 +1,7 @@ + + + + + + + + + + From cc07b8347c1df17b0012e7835ce4ee7e1dc0a7cf Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Tue, 20 Feb 2024 11:27:58 +0100 Subject: [PATCH 03/29] Preparing release 5.4.4 --- CHANGES.rst | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index f213afe..01b5030 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,7 +1,7 @@ Changelog ========= -5.4.4 (unreleased) +5.4.4 (2024-02-20) ------------------ - Add adapters for link integrity for content-types with BlocksField fields. diff --git a/setup.py b/setup.py index e272b2f..8d22dfb 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup( name="redturtle.volto", - version="5.4.4.dev0", + version="5.4.4", description="Helper package to setup a RedTurtle's Plone site ready to work with Volto.", long_description=long_description, # Get more from https://pypi.org/classifiers/ From 6dbf073fda54dd0b923b445649273444c06f673e Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Tue, 20 Feb 2024 11:28:16 +0100 Subject: [PATCH 04/29] Back to development: 5.4.5 --- CHANGES.rst | 6 ++++++ setup.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 01b5030..bf22117 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,12 @@ Changelog ========= +5.4.5 (unreleased) +------------------ + +- Nothing changed yet. + + 5.4.4 (2024-02-20) ------------------ diff --git a/setup.py b/setup.py index 8d22dfb..a9bd4ca 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup( name="redturtle.volto", - version="5.4.4", + version="5.4.5.dev0", description="Helper package to setup a RedTurtle's Plone site ready to work with Volto.", long_description=long_description, # Get more from https://pypi.org/classifiers/ From ac8e304a3bd87946439add5f9233ca92ceda0d8d Mon Sep 17 00:00:00 2001 From: Roman <72063601+folix-01@users.noreply.github.com> Date: Tue, 5 Mar 2024 11:00:20 +0100 Subject: [PATCH 05/29] Update plone.restapi to 9.6.0 (#94) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update plone.restapi to 9.6.0 * Use the newer plone.restapi version for ci buildout * Versions release * buildout * buildout * Remove monkeypatch ๐Ÿ’€ * Formatting * Isort * Update changelog --- CHANGES.rst | 4 +-- setup.py | 2 +- src/redturtle/volto/__init__.py | 5 --- test_plone52.cfg | 10 +----- test_plone60.cfg | 57 +-------------------------------- 5 files changed, 5 insertions(+), 73 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index bf22117..db22753 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,8 +4,8 @@ Changelog 5.4.5 (unreleased) ------------------ -- Nothing changed yet. - +- Update plone.restapi requirement to 9.6.0 version. + [folix-01] 5.4.4 (2024-02-20) ------------------ diff --git a/setup.py b/setup.py index a9bd4ca..5317bcf 100644 --- a/setup.py +++ b/setup.py @@ -59,7 +59,7 @@ "collective.purgebyid", "kitconcept.seo>=2.0.0", "plone.volto>=4.0.0", - "plone.restapi>=8.36.0", + "plone.restapi>=9.6.0", "Products.PortalTransforms>=3.2.0", ], extras_require={ diff --git a/src/redturtle/volto/__init__.py b/src/redturtle/volto/__init__.py index 4768b30..86397e0 100644 --- a/src/redturtle/volto/__init__.py +++ b/src/redturtle/volto/__init__.py @@ -2,7 +2,6 @@ """Init and utils.""" from plone.app.content.browser.vocabulary import PERMISSIONS from plone.folder.nogopip import GopipIndex -from plone.restapi.serializer import utils from Products.ZCatalog.Catalog import Catalog from redturtle.volto.catalogplan import Catalog_sorted_search_indexes from zope.i18nmessageid import MessageFactory @@ -10,7 +9,6 @@ from ZTUtils.Lazy import LazyMap import logging -import re logger = logging.getLogger(__name__) @@ -77,6 +75,3 @@ def Catalog_sortResults( logger.info("install monkey patch for Products.ZCatalog.Catalog.Catalog.sortResults") Catalog._orig_sortResults = Catalog.sortResults Catalog.sortResults = Catalog_sortResults - -# patch plone.restapi regexp to catch also other -utils.RESOLVEUID_RE = re.compile("^(?:|.*/)resolve[Uu]id/([^/]*)/?(.*)$") diff --git a/test_plone52.cfg b/test_plone52.cfg index 977c6d4..146d479 100644 --- a/test_plone52.cfg +++ b/test_plone52.cfg @@ -14,7 +14,7 @@ plone.app.versioningbehavior = 1.4.6 plone.app.vocabularies = 4.3.0 plone.patternslib = 1.1.1 plone.rest = 2.0.0 -plone.restapi = 8.42.0 +plone.restapi = >=9.6.0 plone.volto = 4.0.0 pycountry = 19.8.18 collective.purgebyid = 1.1.1 @@ -31,11 +31,3 @@ pyflakes = 2.3.1 createcoverage = 1.5 mccabe = 0.6.1 plone.recipe.codeanalysis = 3.0.1 - - -# Added by buildout at 2023-03-11 19:27:39.625210 -kitconcept.seo = 2.0.1 - -# Required by: -# redturtle.volto==4.1.4.dev0 -collective.volto.cookieconsent = 1.1.1 diff --git a/test_plone60.cfg b/test_plone60.cfg index 1c1f021..241cc1e 100644 --- a/test_plone60.cfg +++ b/test_plone60.cfg @@ -5,8 +5,6 @@ extends = https://raw.githubusercontent.com/collective/buildout.plonetest/master/qa.cfg base.cfg -update-versions-file = test_plone60.cfg - [versions] # Added by buildout at 2023-03-10 11:55:21.122842 @@ -19,57 +17,4 @@ plone.recipe.codeanalysis = 3.0.1 pycodestyle = 2.10.0 pyflakes = 3.0.1 plone.stringinterp = 2.0.0 - -# Added by buildout at 2023-03-11 19:16:55.437411 -bleach = 6.0.0 -build = 0.1.0 -coverage = 7.2.1 -i18ndude = 5.5.0 -keyring = 23.13.1 -kitconcept.seo = 2.0.1 -markdown-it-py = 2.2.0 -mdurl = 0.1.2 -pep517 = 0.9.1 -pkginfo = 1.9.6 -readme-renderer = 37.3 -requests-toolbelt = 0.10.1 -rfc3986 = 2.0.0 -rich = 13.3.2 -twine = 4.0.2 -zest.releaser = 7.3.0 - -# Required by: -# plone.recipe.codeanalysis==3.0.1 -check-manifest = 0.49 - -# Required by: -# redturtle.volto==4.1.4.dev0 -collective.purgebyid = 1.2.1 - -# Required by: -# redturtle.volto==4.1.4.dev0 -collective.volto.cookieconsent = 1.1.1 - -# Required by: -# zest.releaser==7.3.0 -colorama = 0.4.6 - -# Required by: -# keyring==23.13.1 -jaraco.classes = 3.2.3 - -# Required by: -# jaraco.classes==3.2.3 -more-itertools = 9.1.0 - -# Required by: -# check-manifest==0.49 -tomli = 2.0.1 - -# Required by: -# bleach==6.0.0 -webencodings = 0.5.1 - -# Required by: -# kitconcept.seo==2.0.1 -z3c.jbot = 1.1.1 +plone.restapi = >=9.6.0 From 6befdca08d54102cffbdf36fe6acefb3e52e4a96 Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 5 Mar 2024 11:48:34 +0100 Subject: [PATCH 06/29] Preparing release 5.4.5 --- CHANGES.rst | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index db22753..ab48aaf 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,7 +1,7 @@ Changelog ========= -5.4.5 (unreleased) +5.4.5 (2024-03-05) ------------------ - Update plone.restapi requirement to 9.6.0 version. diff --git a/setup.py b/setup.py index 5317bcf..8cfc806 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup( name="redturtle.volto", - version="5.4.5.dev0", + version="5.4.5", description="Helper package to setup a RedTurtle's Plone site ready to work with Volto.", long_description=long_description, # Get more from https://pypi.org/classifiers/ From cea0c2f34ea365e2b34ac791ee39d92efb3279c0 Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 5 Mar 2024 11:48:56 +0100 Subject: [PATCH 07/29] Back to development: 5.4.6 --- CHANGES.rst | 6 ++++++ setup.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index ab48aaf..c085f20 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,12 @@ Changelog ========= +5.4.6 (unreleased) +------------------ + +- Nothing changed yet. + + 5.4.5 (2024-03-05) ------------------ diff --git a/setup.py b/setup.py index 8cfc806..84d4bbe 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup( name="redturtle.volto", - version="5.4.5", + version="5.4.6.dev0", description="Helper package to setup a RedTurtle's Plone site ready to work with Volto.", long_description=long_description, # Get more from https://pypi.org/classifiers/ From 4c1833a2afbf7d7136f5b8a1709ebc86338f3420 Mon Sep 17 00:00:00 2001 From: Roman <72063601+folix-01@users.noreply.github.com> Date: Tue, 5 Mar 2024 14:29:53 +0100 Subject: [PATCH 08/29] Update CHANGES.rst --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index c085f20..f99d88b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -10,7 +10,7 @@ Changelog 5.4.5 (2024-03-05) ------------------ -- Update plone.restapi requirement to 9.6.0 version. +- Update plone.restapi requirement to 9.6.0 version. Also removed monkeypatch for plone.restartpi.serializer.utils.RESOLVEUID_RE [folix-01] 5.4.4 (2024-02-20) From 74afe0b2ca4246672c7707971800f42ca209912b Mon Sep 17 00:00:00 2001 From: Roman <72063601+folix-01@users.noreply.github.com> Date: Tue, 5 Mar 2024 14:31:19 +0100 Subject: [PATCH 09/29] Update CHANGES.rst --- CHANGES.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index f99d88b..ffd9597 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -10,7 +10,9 @@ Changelog 5.4.5 (2024-03-05) ------------------ -- Update plone.restapi requirement to 9.6.0 version. Also removed monkeypatch for plone.restartpi.serializer.utils.RESOLVEUID_RE +- Update plone.restapi requirement to 9.6.0 version + [folix-01] +- Removed monkeypatch for plone.restartpi.serializer.utils.RESOLVEUID_RE [folix-01] 5.4.4 (2024-02-20) From 1d1d9bb1ca98eef9cf25dd8957cf06f7bb6fdac8 Mon Sep 17 00:00:00 2001 From: Filippo Campi Date: Wed, 6 Mar 2024 11:31:54 +0100 Subject: [PATCH 10/29] updated CHANGES + added check (#95) --- CHANGES.rst | 3 ++- src/redturtle/volto/adapters/blocks_linkintegrity.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index ffd9597..657c3f0 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,8 @@ Changelog 5.4.6 (unreleased) ------------------ -- Nothing changed yet. +- Added check if value is a dict before using get method. + [eikichi18] 5.4.5 (2024-03-05) diff --git a/src/redturtle/volto/adapters/blocks_linkintegrity.py b/src/redturtle/volto/adapters/blocks_linkintegrity.py index b6ab2da..e0a06ad 100644 --- a/src/redturtle/volto/adapters/blocks_linkintegrity.py +++ b/src/redturtle/volto/adapters/blocks_linkintegrity.py @@ -55,6 +55,8 @@ def retrieveLinks(self): links |= set(extractLinks(value.raw)) elif isinstance(field, BlocksField): value = field.get(self.context) + if not isinstance(value, dict): + continue blocks = value.get("blocks", {}) if not blocks: continue From aa08a5cee16f9c04b9cc768b7919bc5efc89eefa Mon Sep 17 00:00:00 2001 From: Filippo Campi Date: Wed, 6 Mar 2024 11:33:11 +0100 Subject: [PATCH 11/29] Preparing release 5.4.6 --- CHANGES.rst | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 657c3f0..8104ad8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,7 +1,7 @@ Changelog ========= -5.4.6 (unreleased) +5.4.6 (2024-03-06) ------------------ - Added check if value is a dict before using get method. diff --git a/setup.py b/setup.py index 84d4bbe..0d5c798 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup( name="redturtle.volto", - version="5.4.6.dev0", + version="5.4.6", description="Helper package to setup a RedTurtle's Plone site ready to work with Volto.", long_description=long_description, # Get more from https://pypi.org/classifiers/ From d450d67fb7a59549139a32bd59997575f8d8e08e Mon Sep 17 00:00:00 2001 From: Filippo Campi Date: Wed, 6 Mar 2024 11:33:23 +0100 Subject: [PATCH 12/29] Back to development: 5.4.7 --- CHANGES.rst | 6 ++++++ setup.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 8104ad8..2c535ee 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,12 @@ Changelog ========= +5.4.7 (unreleased) +------------------ + +- Nothing changed yet. + + 5.4.6 (2024-03-06) ------------------ diff --git a/setup.py b/setup.py index 0d5c798..4e9aff9 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup( name="redturtle.volto", - version="5.4.6", + version="5.4.7.dev0", description="Helper package to setup a RedTurtle's Plone site ready to work with Volto.", long_description=long_description, # Get more from https://pypi.org/classifiers/ From c91ffdb6b2eaa3a0fb00e57c1ed61c9f4e4ba5d4 Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Thu, 7 Mar 2024 13:06:41 +0100 Subject: [PATCH 13/29] add adapter for rss event item --- src/redturtle/volto/adapters/configure.zcml | 7 +++++++ src/redturtle/volto/adapters/rss.py | 19 +++++++++++++++++++ ...Plone.browser.syndication.templates.RSS.pt | 2 +- 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/redturtle/volto/adapters/rss.py diff --git a/src/redturtle/volto/adapters/configure.zcml b/src/redturtle/volto/adapters/configure.zcml index 9d54aa3..7887b46 100644 --- a/src/redturtle/volto/adapters/configure.zcml +++ b/src/redturtle/volto/adapters/configure.zcml @@ -37,4 +37,11 @@ provides="plone.restapi.interfaces.IBlockFieldLinkIntegrityRetriever" /> + + diff --git a/src/redturtle/volto/adapters/rss.py b/src/redturtle/volto/adapters/rss.py new file mode 100644 index 0000000..535570f --- /dev/null +++ b/src/redturtle/volto/adapters/rss.py @@ -0,0 +1,19 @@ +from plone.base.interfaces.syndication import IFeed +from plone.app.contenttypes.interfaces import IEvent +from Products.CMFPlone.browser.syndication.adapters import DexterityItem +from zope.component import adapter +from DateTime import DateTime + + +@adapter(IEvent, IFeed) +class EventItem(DexterityItem): + + @property + def startdate(self): + """ + Same format as other dates in + Products.CMFPlone.browser.syndication.adapters + """ + date = self.context.start.isoformat() + if date: + return DateTime(date) diff --git a/src/redturtle/volto/browser/overrides/Products.CMFPlone.browser.syndication.templates.RSS.pt b/src/redturtle/volto/browser/overrides/Products.CMFPlone.browser.syndication.templates.RSS.pt index b62afb5..eb2bbdd 100644 --- a/src/redturtle/volto/browser/overrides/Products.CMFPlone.browser.syndication.templates.RSS.pt +++ b/src/redturtle/volto/browser/overrides/Products.CMFPlone.browser.syndication.templates.RSS.pt @@ -56,7 +56,7 @@ Item - Published or last modified date if no published date + Published or last modified date if no published date Type From 493500d519812b336de0cb6d614f08ebda45b4c1 Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Thu, 7 Mar 2024 13:07:50 +0100 Subject: [PATCH 14/29] black and flake8 --- src/redturtle/volto/adapters/rss.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/redturtle/volto/adapters/rss.py b/src/redturtle/volto/adapters/rss.py index 535570f..9a0b4d1 100644 --- a/src/redturtle/volto/adapters/rss.py +++ b/src/redturtle/volto/adapters/rss.py @@ -7,11 +7,10 @@ @adapter(IEvent, IFeed) class EventItem(DexterityItem): - @property def startdate(self): """ - Same format as other dates in + Same format as other dates in Products.CMFPlone.browser.syndication.adapters """ date = self.context.start.isoformat() From de6ac5da5a54e6c0817dfaefd2a589f86db12545 Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Thu, 7 Mar 2024 13:09:14 +0100 Subject: [PATCH 15/29] isort --- src/redturtle/volto/adapters/rss.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/redturtle/volto/adapters/rss.py b/src/redturtle/volto/adapters/rss.py index 9a0b4d1..e8e6db5 100644 --- a/src/redturtle/volto/adapters/rss.py +++ b/src/redturtle/volto/adapters/rss.py @@ -1,8 +1,8 @@ -from plone.base.interfaces.syndication import IFeed +from DateTime import DateTime from plone.app.contenttypes.interfaces import IEvent +from plone.base.interfaces.syndication import IFeed from Products.CMFPlone.browser.syndication.adapters import DexterityItem from zope.component import adapter -from DateTime import DateTime @adapter(IEvent, IFeed) From 6c06108f237dc3542f204522ce06a883ffb2c903 Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Thu, 7 Mar 2024 13:56:21 +0100 Subject: [PATCH 16/29] fix retrocompatibility --- src/redturtle/volto/adapters/rss.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/redturtle/volto/adapters/rss.py b/src/redturtle/volto/adapters/rss.py index e8e6db5..dd5b247 100644 --- a/src/redturtle/volto/adapters/rss.py +++ b/src/redturtle/volto/adapters/rss.py @@ -1,6 +1,10 @@ from DateTime import DateTime from plone.app.contenttypes.interfaces import IEvent -from plone.base.interfaces.syndication import IFeed +try: + from plone.base.interfaces.syndication import IFeed +except ModuleNotFoundError: + from Products.CMFPlone.interfaces.syndication import IFeed + from Products.CMFPlone.browser.syndication.adapters import DexterityItem from zope.component import adapter From 03c66b54b22ef500e1a996c04cecc3abd8a123df Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Thu, 7 Mar 2024 13:57:34 +0100 Subject: [PATCH 17/29] black --- src/redturtle/volto/adapters/rss.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/redturtle/volto/adapters/rss.py b/src/redturtle/volto/adapters/rss.py index dd5b247..2082542 100644 --- a/src/redturtle/volto/adapters/rss.py +++ b/src/redturtle/volto/adapters/rss.py @@ -1,5 +1,6 @@ from DateTime import DateTime from plone.app.contenttypes.interfaces import IEvent + try: from plone.base.interfaces.syndication import IFeed except ModuleNotFoundError: From de1da97f2a77694f17c27ddfa1ed18a4bfeff456 Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Thu, 7 Mar 2024 14:22:55 +0100 Subject: [PATCH 18/29] fix zcml conditions and import --- src/redturtle/volto/adapters/configure.zcml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/redturtle/volto/adapters/configure.zcml b/src/redturtle/volto/adapters/configure.zcml index 7887b46..4b119e1 100644 --- a/src/redturtle/volto/adapters/configure.zcml +++ b/src/redturtle/volto/adapters/configure.zcml @@ -38,10 +38,18 @@ /> - + + + From 5531dced8634108248df351cd937c6fc21959c1a Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Thu, 7 Mar 2024 14:24:49 +0100 Subject: [PATCH 19/29] isort --- src/redturtle/volto/adapters/rss.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/redturtle/volto/adapters/rss.py b/src/redturtle/volto/adapters/rss.py index 2082542..6517f0b 100644 --- a/src/redturtle/volto/adapters/rss.py +++ b/src/redturtle/volto/adapters/rss.py @@ -1,6 +1,7 @@ from DateTime import DateTime from plone.app.contenttypes.interfaces import IEvent + try: from plone.base.interfaces.syndication import IFeed except ModuleNotFoundError: From 50006e76e23f96b147b9d8384eee1becaf49fa6c Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Thu, 7 Mar 2024 14:26:12 +0100 Subject: [PATCH 20/29] zpretty --- src/redturtle/volto/adapters/configure.zcml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/redturtle/volto/adapters/configure.zcml b/src/redturtle/volto/adapters/configure.zcml index 4b119e1..a235cb5 100644 --- a/src/redturtle/volto/adapters/configure.zcml +++ b/src/redturtle/volto/adapters/configure.zcml @@ -38,18 +38,20 @@ /> - - From da20b0d5b0f41c7e682892eaa7001ca97c04f899 Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Thu, 7 Mar 2024 14:40:10 +0100 Subject: [PATCH 21/29] fix condition maybe --- src/redturtle/volto/adapters/configure.zcml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/redturtle/volto/adapters/configure.zcml b/src/redturtle/volto/adapters/configure.zcml index a235cb5..ec23944 100644 --- a/src/redturtle/volto/adapters/configure.zcml +++ b/src/redturtle/volto/adapters/configure.zcml @@ -38,6 +38,7 @@ /> + From 93e46c1624fc62dc413306be443181709935bae8 Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Thu, 7 Mar 2024 14:51:16 +0100 Subject: [PATCH 22/29] update changes --- CHANGES.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 2c535ee..db4b35d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,9 @@ Changelog 5.4.7 (unreleased) ------------------ -- Nothing changed yet. +- Add adapter handler for event in rss feed to export + start date instead of publication date + [lucabel] 5.4.6 (2024-03-06) From caabed42caeb6988374b4257261fefe26ecdeabe Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Mon, 11 Mar 2024 11:39:00 +0100 Subject: [PATCH 23/29] Preparing release 5.4.7 --- CHANGES.rst | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index db4b35d..fcd3a24 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,7 +1,7 @@ Changelog ========= -5.4.7 (unreleased) +5.4.7 (2024-03-11) ------------------ - Add adapter handler for event in rss feed to export diff --git a/setup.py b/setup.py index 4e9aff9..1040981 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup( name="redturtle.volto", - version="5.4.7.dev0", + version="5.4.7", description="Helper package to setup a RedTurtle's Plone site ready to work with Volto.", long_description=long_description, # Get more from https://pypi.org/classifiers/ From 779b021af02a399909c7e038fac078fca00797c3 Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Mon, 11 Mar 2024 11:39:21 +0100 Subject: [PATCH 24/29] Back to development: 5.4.8 --- CHANGES.rst | 6 ++++++ setup.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index fcd3a24..bbd4147 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,12 @@ Changelog ========= +5.4.8 (unreleased) +------------------ + +- Nothing changed yet. + + 5.4.7 (2024-03-11) ------------------ diff --git a/setup.py b/setup.py index 1040981..4f8994a 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup( name="redturtle.volto", - version="5.4.7", + version="5.4.8.dev0", description="Helper package to setup a RedTurtle's Plone site ready to work with Volto.", long_description=long_description, # Get more from https://pypi.org/classifiers/ From 9c97b44b34f43257dd08db4bad2a1a6d22cbbe9e Mon Sep 17 00:00:00 2001 From: Andrea Cecchi Date: Tue, 19 Mar 2024 09:27:22 +0100 Subject: [PATCH 25/29] Querystringsearch patch for missing absolutePath (#99) * Patch in @querystring-search that avoid to search through all the site if there is an absolutePath criteria with non existing UID and b_size==1 * Patch in @querystring-search that avoid to search through all the site if there is an absolutePath criteria with non existing UID and b_size==1 * Patch in @querystring-search that avoid to search through all the site if there is an absolutePath criteria with non existing UID and b_size==1 * update changelog * fix typo --- CHANGES.rst | 4 +- .../restapi/services/querystringsearch/get.py | 38 +++++++++ .../volto/tests/test_querystringsearch.py | 81 +++++++++++++++++++ 3 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 src/redturtle/volto/tests/test_querystringsearch.py diff --git a/CHANGES.rst b/CHANGES.rst index bbd4147..2b07b60 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,9 @@ Changelog 5.4.8 (unreleased) ------------------ -- Nothing changed yet. +- Patch in @querystring-search that avoid to search through all the site if there is an absolutePath criteria with non existing UID and b_size==1. + See #99 for more details. + [cekk] 5.4.7 (2024-03-11) diff --git a/src/redturtle/volto/restapi/services/querystringsearch/get.py b/src/redturtle/volto/restapi/services/querystringsearch/get.py index fa1948c..49a5b1e 100644 --- a/src/redturtle/volto/restapi/services/querystringsearch/get.py +++ b/src/redturtle/volto/restapi/services/querystringsearch/get.py @@ -34,6 +34,7 @@ def __call__(self): raise BadRequest(str(err)) query = data.get("query", None) + if self.is_event_search(query=query): return self.reply_events() @@ -50,6 +51,8 @@ def __call__(self): sort_on = data.get("sort_on", None) sort_order = data.get("sort_order", None) + query = self.cleanup_query(query=query, b_size=b_size) + # LIMIT PATCH if not query: self.request.response.setStatus(400) @@ -97,6 +100,41 @@ def __call__(self): ) return results + def cleanup_query(self, query, b_size): + """ + If b_size == 1 and there is an absolutePath in query that points to a non + existing content, reeturn empty query. + This is the case where absolutePath points to an UID that is not present on the site. + A call with b_size == 1 usually is made in objectbrowser to draw the reference, but with a + wrong UID, Plone by default return all site contents and the first one will be returned. + If you then save the blocks, you'll have that random content as new absolutePath value. + """ + if b_size != 1: + return query + fixed_query = [] + for criteria in query: + index = criteria.get("i", "") + operation = criteria.get("o", "") + if ( + index == "path" + and operation # noqa + == "plone.app.querystring.operation.string.absolutePath" # noqa + ): + criteria_value = criteria.get("v", "").split("::") + value = criteria_value[0] + + if "/" not in value: + # It must be a UID + item = api.content.get(UID=value) + if not item: + continue + else: + item = api.content.get(value) + if not item: + continue + fixed_query.append(criteria) + return fixed_query + def get_limit(self, data): """ If limit is <= 0 or higher than MAX_LIMIT, set it to MAX_LIMIT diff --git a/src/redturtle/volto/tests/test_querystringsearch.py b/src/redturtle/volto/tests/test_querystringsearch.py new file mode 100644 index 0000000..03ab0e0 --- /dev/null +++ b/src/redturtle/volto/tests/test_querystringsearch.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +from plone import api +from plone.app.testing import setRoles +from plone.app.testing import SITE_OWNER_NAME +from plone.app.testing import SITE_OWNER_PASSWORD +from plone.app.testing import TEST_USER_ID +from plone.restapi.testing import RelativeSession +from redturtle.volto.testing import REDTURTLE_VOLTO_API_FUNCTIONAL_TESTING +from transaction import commit + +import unittest + + +class TestQuerystringSearch(unittest.TestCase): + layer = REDTURTLE_VOLTO_API_FUNCTIONAL_TESTING + + def setUp(self): + self.app = self.layer["app"] + self.portal = self.layer["portal"] + self.portal_url = self.portal.absolute_url() + + setRoles(self.portal, TEST_USER_ID, ["Manager"]) + + api.content.create(container=self.portal, type="Document", title="First") + api.content.create(container=self.portal, type="Document", title="Second") + commit() + + self.api_session = RelativeSession(self.portal_url) + self.api_session.headers.update({"Accept": "application/json"}) + self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD) + + def tearDown(self): + self.api_session.close() + + def test_do_not_return_random_item_in_objectbrowser_call_if_absolutePath_is_invalid( + self, + ): + """ + objectbrowser calls always ask for an absolutePath adn b_size == 1. + absolutePath is the uid of the referenced object + """ + response = self.api_session.post( + "/@querystring-search", + json={ + "query": [ + { + "i": "path", + "o": "plone.app.querystring.operation.string.absolutePath", + "v": "xxx::1", + } + ], + "b_size": 1, + }, + ) + result = response.json() + self.assertEqual(response.status_code, 400) + self.assertEqual(result["error"]["message"], "No query supplied") + + def test_if_absolutePath_is_invalid_and_is_not_a_objectbrowser_call_do_not_filter_by_path( + self, + ): + """ + objectbrowser calls always ask for an absolutePath adn b_size == 1. + absolutePath is the uid of the referenced object. + By default Plone (querystringsearch) set /Plone as query path if absolutePath is invalid + """ + response = self.api_session.post( + "/@querystring-search", + json={ + "query": [ + { + "i": "path", + "o": "plone.app.querystring.operation.string.absolutePath", + "v": "xxx::1", + } + ], + }, + ) + result = response.json() + self.assertEqual(response.status_code, 200) + self.assertEqual(result["items_total"], 2) From 40e29c708568152cd208c18e18a3d658b17b4644 Mon Sep 17 00:00:00 2001 From: Andrea Cecchi Date: Tue, 19 Mar 2024 09:27:58 +0100 Subject: [PATCH 26/29] Handle None values in link integrity blocks adapter. (#98) --- CHANGES.rst | 2 ++ src/redturtle/volto/adapters/blocks_linkintegrity.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 2b07b60..68ceaa0 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,8 @@ Changelog 5.4.8 (unreleased) ------------------ + +- Handle None values in link integrity blocks adapter. - Patch in @querystring-search that avoid to search through all the site if there is an absolutePath criteria with non existing UID and b_size==1. See #99 for more details. [cekk] diff --git a/src/redturtle/volto/adapters/blocks_linkintegrity.py b/src/redturtle/volto/adapters/blocks_linkintegrity.py index e0a06ad..7fd9a86 100644 --- a/src/redturtle/volto/adapters/blocks_linkintegrity.py +++ b/src/redturtle/volto/adapters/blocks_linkintegrity.py @@ -55,6 +55,8 @@ def retrieveLinks(self): links |= set(extractLinks(value.raw)) elif isinstance(field, BlocksField): value = field.get(self.context) + if not value: + continue if not isinstance(value, dict): continue blocks = value.get("blocks", {}) From 7ee38962b52724b0a9576ea3364a278b43105f82 Mon Sep 17 00:00:00 2001 From: Andrea Cecchi Date: Tue, 19 Mar 2024 09:28:37 +0100 Subject: [PATCH 27/29] Do not try to convert strings in internal paths for *form* blocks (#97) --- CHANGES.rst | 2 +- src/redturtle/volto/restapi/deserializer/blocks.py | 2 +- src/redturtle/volto/restapi/serializer/blocks.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 68ceaa0..1154fd2 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,7 @@ Changelog 5.4.8 (unreleased) ------------------ - +- Do not try to convert strings in internal paths for *form* blocks. - Handle None values in link integrity blocks adapter. - Patch in @querystring-search that avoid to search through all the site if there is an absolutePath criteria with non existing UID and b_size==1. See #99 for more details. diff --git a/src/redturtle/volto/restapi/deserializer/blocks.py b/src/redturtle/volto/restapi/deserializer/blocks.py index ed19fef..da3d4a9 100644 --- a/src/redturtle/volto/restapi/deserializer/blocks.py +++ b/src/redturtle/volto/restapi/deserializer/blocks.py @@ -10,7 +10,7 @@ EXCLUDE_KEYS = ["@type", "token", "value", "@id", "query"] -EXCLUDE_TYPES = ["title", "listing", "calendar", "searchEvents"] +EXCLUDE_TYPES = ["title", "listing", "calendar", "searchEvents", "form"] class GenericResolveUIDDeserializer(object): diff --git a/src/redturtle/volto/restapi/serializer/blocks.py b/src/redturtle/volto/restapi/serializer/blocks.py index f32fb0a..c026526 100644 --- a/src/redturtle/volto/restapi/serializer/blocks.py +++ b/src/redturtle/volto/restapi/serializer/blocks.py @@ -14,7 +14,7 @@ EXCLUDE_KEYS = ["@type"] -EXCLUDE_TYPES = ["title", "listing"] +EXCLUDE_TYPES = ["title", "listing", "form"] class GenericResolveUIDSerializer(object): From 6de497472633ad5901059c355771723e87395afb Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Tue, 19 Mar 2024 09:36:56 +0100 Subject: [PATCH 28/29] Preparing release 5.4.8 --- CHANGES.rst | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 1154fd2..f1eb711 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,7 +1,7 @@ Changelog ========= -5.4.8 (unreleased) +5.4.8 (2024-03-19) ------------------ - Do not try to convert strings in internal paths for *form* blocks. diff --git a/setup.py b/setup.py index 4f8994a..1665c73 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup( name="redturtle.volto", - version="5.4.8.dev0", + version="5.4.8", description="Helper package to setup a RedTurtle's Plone site ready to work with Volto.", long_description=long_description, # Get more from https://pypi.org/classifiers/ From 0bd25bd2210f1142b25382856524ddaaf5c4fe81 Mon Sep 17 00:00:00 2001 From: Luca Bellenghi Date: Tue, 19 Mar 2024 09:38:30 +0100 Subject: [PATCH 29/29] Back to development: 5.4.9 --- CHANGES.rst | 6 ++++++ setup.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index f1eb711..5b013fe 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,12 @@ Changelog ========= +5.4.9 (unreleased) +------------------ + +- Nothing changed yet. + + 5.4.8 (2024-03-19) ------------------ diff --git a/setup.py b/setup.py index 1665c73..b2c6853 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup( name="redturtle.volto", - version="5.4.8", + version="5.4.9.dev0", description="Helper package to setup a RedTurtle's Plone site ready to work with Volto.", long_description=long_description, # Get more from https://pypi.org/classifiers/