Skip to content
1 change: 1 addition & 0 deletions news/1981.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Added a single Control Panel API endpoint exposing searchable text for global settings search. Fixes #1981.
Comment thread
davisagli marked this conversation as resolved.
Outdated
19 changes: 19 additions & 0 deletions src/plone/restapi/controlpanels/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from zope.interface import implementer
from zope.publisher.interfaces import NotFound

import zope
Comment thread
Manik-Khajuria-5 marked this conversation as resolved.
Outdated


@implementer(IControlpanel)
class RegistryConfigletPanel:
Expand Down Expand Up @@ -38,6 +40,23 @@ def __init__(self, context, request):
self.title = self.configlet["title"]
self.group = self._get_group_title()

def get_searchable_text(self):

text_parts = []

if self.title:
text_parts.append(self.title)

if self.group:
text_parts.append(self.group)

if self.schema is not None:
for name, field in zope.schema.getFields(self.schema).items():
if field.title:
text_parts.append(field.title)

return [text for text in text_parts if text]

def add(self, names):
raise NotFound(self.context, names, self.request)

Expand Down
7 changes: 7 additions & 0 deletions src/plone/restapi/controlpanels/interfaces.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ def update(names):
def delete(names):
"""Remove controlpanel children by names"""

def get_searchable_text():
"""Return searchable text for this controlpannel.
Comment thread
davisagli marked this conversation as resolved.
Outdated

Schema-based control panels return text from field titles and descriptions.
Other control panels can return custom text.
"""


class IDexterityTypesControlpanel(IControlpanel):
"""Dexterity Types Control panel"""
Expand Down
15 changes: 15 additions & 0 deletions src/plone/restapi/controlpanels/rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,21 @@ class ContentRulesControlpanel(RegistryConfigletPanel):
def publishTraverse(self, request, name):
return self.context.restrictedTraverse("++rule++" + name)

def get_searchable_text(self):
text_parts = super().get_searchable_text()

cpanel = queryMultiAdapter(
(self.context, self.request), name="rules-controlpanel"
)
if cpanel:
registered_rules = cpanel.registeredRules()
for rule in registered_rules:
if isinstance(rule, dict):
if rule.get("title"):
text_parts.append(rule["title"])

return text_parts

def add(self, names):
data = json_body(self.request)
rules = queryMultiAdapter((self.context, self.request), name="+rule")
Expand Down
13 changes: 13 additions & 0 deletions src/plone/restapi/controlpanels/types.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from plone.dexterity.interfaces import IDexterityFTI
from plone.i18n.normalizer import idnormalizer
from plone.restapi.controlpanels import RegistryConfigletPanel
from plone.restapi.controlpanels.interfaces import IDexterityTypesControlpanel
Expand All @@ -7,6 +8,7 @@
from plone.restapi.interfaces import ISerializeToJson
from zExceptions import BadRequest
from zope.component import adapter
from zope.component import getAllUtilitiesRegisteredFor
from zope.component import queryMultiAdapter
from zope.interface import alsoProvides
from zope.interface import implementer
Expand All @@ -22,6 +24,17 @@ class DexterityTypesControlpanel(RegistryConfigletPanel):
configlet_id = "dexterity-types"
configlet_category_id = "plone-content"

def get_searchable_text(self):

text_parts = super().get_searchable_text()

ftis = getAllUtilitiesRegisteredFor(IDexterityFTI)
for fti in ftis:
if fti.Title():
text_parts.append(fti.Title())

return text_parts

def add(self, names):
data = json_body(self.request)

Expand Down
13 changes: 12 additions & 1 deletion src/plone/restapi/serializer/controlpanels/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def __init__(self, controlpanel):
self.controlpanel = controlpanel

def __call__(self):
return {
result = {
"@id": "{}/{}/{}".format(
self.controlpanel.context.absolute_url(),
SERVICE_ID,
Expand All @@ -36,6 +36,17 @@ def __call__(self):
"group": self.controlpanel.group,
}

if hasattr(self.controlpanel, "get_searchable_text"):
result["searchable_text"] = self.controlpanel.get_searchable_text()
else:
if self.controlpanel.title:
result["searchable_text"] = [
self.controlpanel.title,
self.controlpanel.description,
]

return result


def get_jsonschema_for_controlpanel(controlpanel, context, request, form=None):
"""Build a complete JSON schema for the given controlpanel."""
Expand Down
Loading