Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,16 @@ Changelog

- Fix rss feed image selection, now it uses the correct field for preview_image.
[mamico]

- Fix issue with event search in @querystring-search override:
converting a timezone-aware DateTime to utcdatetime causes a problem when searching for
"today", as it shifts start=day x at 00:00 to start=day x-1 at 22:00 in GMT+2 timezone.
[lucabel]
- Handle sort_on also when using AdvancedQuery.
[cekk]
- Remove z3c.jbot compatibility and customize templates in standard-way.
[cekk]
- Force indexing subjects in SearchableText with ICategorization to keep the old Plone functionality (remove this when the official pr is merged).
[cekk]


5.8.0 (2025-03-20)
Expand Down
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@
"plone.restapi>=9.6.0",
"Products.PortalTransforms>=3.2.0",
"collective.volto.sitesettings",
"z3c.jbot",
"experimental.noacquisition",
],
extras_require={
Expand Down
5 changes: 5 additions & 0 deletions src/redturtle/volto/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
# -*- coding: utf-8 -*-
from plone.app.dexterity.behaviors.metadata import ICategorization
from plone.app.dexterity.textindexer import utils
from redturtle.volto import patches # noqa
from zope.i18nmessageid import MessageFactory


_ = MessageFactory("redturtle.volto")

# Index also subjects in SearchableText.
utils.searchable(ICategorization, "subjects")
36 changes: 27 additions & 9 deletions src/redturtle/volto/browser/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,6 @@
i18n_domain="redturtle.volto"
>

<include
package="z3c.jbot"
file="meta.zcml"
/>
<browser:jbot
directory="overrides"
layer="redturtle.volto.interfaces.IRedturtleVoltoLayer"
/>

<!-- overrides to default dexterity view -->
<browser:page
name="newsitem_view"
Expand Down Expand Up @@ -80,4 +71,31 @@
permission="zope2.View"
layer="redturtle.volto.interfaces.IRedturtleVoltoLayer"
/>

<browser:page
name="document_view"
template="templates/document.pt"
permission="zope2.View"
layer="redturtle.volto.interfaces.IRedturtleVoltoLayer"
menu="plone_displayviews"
title="View Document"
/>
<browser:page
name="RSS"
for="plone.base.interfaces.syndication.ISyndicatable"
class="Products.CMFPlone.browser.syndication.views.FeedView"
template="templates/RSS.pt"
permission="zope2.View"
layer="redturtle.volto.interfaces.IRedturtleVoltoLayer"
/>

<browser:viewlet
name="voltobackendwarning"
for="*"
manager="plone.app.layout.viewlets.interfaces.IGlobalStatusMessage"
template="templates/voltobackendwarning.pt"
permission="zope2.View"
layer="redturtle.volto.interfaces.IRedturtleVoltoLayer"
condition="have plone-60"
/>
</configure>
3 changes: 2 additions & 1 deletion src/redturtle/volto/interfaces.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
)
from plone.dexterity.interfaces import IDexterityContent
from plone.restapi.controlpanels.interfaces import IControlpanel
from plone.volto.interfaces import IPloneVoltoCoreLayer
from redturtle.volto import _
from zope.interface import Interface
from zope.schema import Bool


class IRedturtleVoltoLayer(IDefaultBrowserLayer):
class IRedturtleVoltoLayer(IDefaultBrowserLayer, IPloneVoltoCoreLayer):
"""Marker interface that defines a browser layer."""


Expand Down
26 changes: 19 additions & 7 deletions src/redturtle/volto/restapi/services/search/get.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@ def get_indexes_mapping(self):
def is_advanced_query(self, query):
if not query:
return False
if query.get("sort_on", None):
return False
if query.get("SimpleQuery", None):
return False
custom_ranking_enabled = api.portal.get_registry_record(
Expand Down Expand Up @@ -79,11 +77,25 @@ def search(self, query=None):
# TODO: mettere i parametri di ranking in registry
# XXX: il default sul subject ha senso ? (probabilmente no), rivedere eventualmente anche i test
term = query.get("SearchableText")
rs = RankByQueries_Sum(
(Eq("Subject", term), 16),
(Eq("Title", term), 8),
(Eq("Description", term), 6),
)

sort_on = query.get("sort_on", "")
if sort_on:
sort_order = query.get("sort_order", "")
if not sort_order:
if sort_on in ["Date", "effective"]:
sort_order = "desc"
else:
sort_order = "asc"
if sort_order == "reverse":
sort_order = "desc"
rs = (query["sort_on"], sort_order)
else:
# use custom ranking
rs = RankByQueries_Sum(
(Eq("Subject", term), 16),
(Eq("Title", term), 8),
(Eq("Description", term), 6),
)
lazy_resultset = self.catalog.evalAdvancedQuery(
# Eq("SearchableText", term), (rs,), **query
And(*queries),
Expand Down
34 changes: 29 additions & 5 deletions src/redturtle/volto/tests/test_advancedsearch.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def setUp(self):
type="Document",
id="d1",
title="document",
description="Foo document",
description="Document with subject",
subject=["foo", "bar"],
)
# 3rd for "Foo" (title + searchableText)
Expand Down Expand Up @@ -84,7 +84,7 @@ def test_simplesearch(self):
self.assertEqual(result["items_total"], 3)
# explain why the order is different from the one in the test above
self.assertEqual(
["f1", "d1", "e1"], [item["@id"].split("/")[-1] for item in result["items"]]
["f1", "e1", "d1"], [item["@id"].split("/")[-1] for item in result["items"]]
)

def test_search_foo(self):
Expand Down Expand Up @@ -163,7 +163,7 @@ def test_search_by_not_handled_index_type_return_standard_order(self):
result = response.json()
self.assertEqual(result["items_total"], 3)
self.assertEqual(
["f1", "d1", "e1"], [item["@id"].split("/")[-1] for item in result["items"]]
["f1", "e1", "d1"], [item["@id"].split("/")[-1] for item in result["items"]]
)

def test_search_no_query(self):
Expand Down Expand Up @@ -195,7 +195,31 @@ def test_search_ignore_non_existent_indexes_and_return_custom_order_if_possible(
result = response.json()
self.assertEqual(result["items_total"], 3)
self.assertEqual(
["f1", "d1", "e1"], [item["@id"].split("/")[-1] for item in result["items"]]
["f1", "e1", "d1"], [item["@id"].split("/")[-1] for item in result["items"]]
)

def test_search_use_sort_on_if_in_query_and_ignore_custom_order(
self,
):
response = self.api_session.get(
"/@search", params={"SearchableText": "foo", "sort_on": "sortable_title"}
)
result = response.json()
self.assertEqual(result["items_total"], 3)
self.assertEqual(
["d1", "e1", "f1"],
[item["@id"].split("/")[-1] for item in result["items"]],
)

# now repeat query with no sort_on and have custom order
response = self.api_session.get(
"/@search",
params={"SearchableText": "foo"},
)
result = response.json()
self.assertEqual(result["items_total"], 3)
self.assertEqual(
["d1", "f1", "e1"], [item["@id"].split("/")[-1] for item in result["items"]]
)


Expand All @@ -207,7 +231,7 @@ def test_by_default_flag_is_disabled(self):
self.assertEqual(result["items_total"], 3)
# explain why the order is different from the one in the test above
self.assertEqual(
["f1", "d1", "e1"], [item["@id"].split("/")[-1] for item in result["items"]]
["f1", "e1", "d1"], [item["@id"].split("/")[-1] for item in result["items"]]
)

def test_enabling_flag_return_custom_order(self):
Expand Down