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
43 changes: 43 additions & 0 deletions src/plone/restapi/controlpanels/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
from plone.dexterity.interfaces import IDexterityFTI
from plone.restapi.controlpanels.interfaces import IContentRulesControlpanel
from plone.restapi.controlpanels.interfaces import IControlpanel
from plone.restapi.controlpanels.interfaces import IDexterityTypesControlpanel
from Products.CMFCore.utils import getToolByName
from zope.component import getAllUtilitiesRegisteredFor
from zope.component import queryMultiAdapter
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 +45,42 @@ 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.schema is not None:
for name, field in zope.schema.getFields(self.schema).items():
if field.title:
text_parts.append(field.title)
else:
types_list = []

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

elif IContentRulesControlpanel.providedBy(self):
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"])
Comment thread
davisagli marked this conversation as resolved.
Outdated

if types_list:
text_parts.extend(types_list)

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
1 change: 1 addition & 0 deletions src/plone/restapi/serializer/controlpanels/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ def __call__(self):
),
"title": self.controlpanel.title,
"group": self.controlpanel.group,
"searchable_text": self.controlpanel.get_searchable_text(),
Comment thread
davisagli marked this conversation as resolved.
Outdated
}


Expand Down
Loading