Skip to content

Commit

Permalink
add query param to search registry records.
Browse files Browse the repository at this point in the history
  • Loading branch information
Faakhir30 committed Jan 19, 2025
1 parent 7214df3 commit 218e64d
Show file tree
Hide file tree
Showing 7 changed files with 95 additions and 7 deletions.
1 change: 1 addition & 0 deletions news/1859.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add search param to querystring for registry listing. @Faakhir30
12 changes: 6 additions & 6 deletions src/plone/restapi/serializer/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,19 @@
from zope.component import getMultiAdapter
from zope.interface import implementer
from zope.publisher.interfaces import IRequest
from zope.interface import Interface


@implementer(ISerializeToJson)
@adapter(IRegistry, IRequest)
@adapter(IRegistry, IRequest, Interface)
class SerializeRegistryToJson:
def __init__(self, registry, request):
def __init__(self, registry, request, records=None):
self.registry = registry
self.request = request
self.records = records or registry.records

def __call__(self):
records = self.registry.records
# Batch keys, because that is a simple BTree
batch = HypermediaBatch(self.request, list(records))
batch = HypermediaBatch(self.request, list(self.records.keys()))

results = {}
results["@id"] = batch.canonical_url
Expand All @@ -27,7 +27,7 @@ def __call__(self):
results["batching"] = batch.links

def make_item(key):
record = records[key]
record = self.records[key]
schema = getMultiAdapter(
(record.field, record, self.request), IJsonSchemaProvider
)
Expand Down
12 changes: 11 additions & 1 deletion src/plone/restapi/services/registry/get.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,15 @@ def reply(self):
value = registry[self._get_record_name]
return json_compatible(value)
else: # batched listing
serializer = getMultiAdapter((registry, self.request), ISerializeToJson)
records_dict = dict(**registry.records)
if q := self.request.form.get("q"):
filtered_records = {}
for key in records_dict.keys():
if key.startswith(q):
filtered_records[key] = records_dict[key]
records_dict = filtered_records
serializer = getMultiAdapter(
(registry, self.request, records_dict),
ISerializeToJson,
)
return serializer()
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
GET /plone/@registry?q=Products.CMFPlone HTTP/1.1
Accept: application/json
Authorization: Basic YWRtaW46c2VjcmV0
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
HTTP/1.1 200 OK
Content-Type: application/json

{
"@id": "http://localhost:55001/plone/@registry?q=Products.CMFPlone",
"items": [
{
"name": "Products.CMFPlone.i18nl10n.override_dateformat.Enabled",
"schema": {
"properties": {
"description": "Override the translation machinery",
"factory": "Yes/No",
"title": "Enabled",
"type": "boolean"
}
},
"value": false
},
{
"name": "Products.CMFPlone.i18nl10n.override_dateformat.date_format_long",
"schema": {
"properties": {
"description": "Default value: %Y-%m-%d %H:%M (2038-01-19 03:14)",
"factory": "Text line (String)",
"title": "old ZMI property: localLongTimeFormat",
"type": "string"
}
},
"value": "%Y-%m-%d %H:%M"
},
{
"name": "Products.CMFPlone.i18nl10n.override_dateformat.date_format_short",
"schema": {
"properties": {
"description": "Default value: %Y-%m-%d (2038-01-19)",
"factory": "Text line (String)",
"title": "old ZMI property: localTimeFormat",
"type": "string"
}
},
"value": "%Y-%m-%d"
},
{
"name": "Products.CMFPlone.i18nl10n.override_dateformat.time_format",
"schema": {
"properties": {
"description": "Default value: %H:%M (03:14)",
"factory": "Text line (String)",
"title": "old ZMI property: localTimeOnlyFormat",
"type": "string"
}
},
"value": "%H:%M"
}
],
"items_total": 4
}
4 changes: 4 additions & 0 deletions src/plone/restapi/tests/test_documentation.py
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,10 @@ def test_documentation_registry_get_list(self):
response = self.api_session.get("/@registry")
save_request_and_response_for_docs("registry_get_list", response)

def test_documentation_registry_get_list_filtered(self):
response = self.api_session.get("/@registry?q=Products.CMFPlone")
save_request_and_response_for_docs("registry_get_list_filtered", response)

def test_documentation_types(self):
response = self.api_session.get("/@types")
save_request_and_response_for_docs("types", response)
Expand Down
13 changes: 13 additions & 0 deletions src/plone/restapi/tests/test_registry_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,16 @@ def test_structure(self):
self.assertEqual(set(item["schema"]), {"properties"})
self.assertEqual(item["name"], "foo.bar")
self.assertEqual(item["value"], "Lorem Ipsum")

def test_filtered(self):
registry = Registry()
registry.records["foo.bar"] = Record(
field.TextLine(title="Foo Bar"), "Lorem Ipsum"
)
registry.records["foo.baz"] = Record(
field.TextLine(title="Foo Baz"), "Lorem Ipsum"
)
obj = self.serialize(registry, [registry.records["foo.bar"]])
self.assertEqual(len(obj["items"]), 1)
self.assertEqual(obj["items"][0]["name"], "foo.bar")
self.assertEqual(obj["items"][0]["value"], "Lorem Ipsum")

0 comments on commit 218e64d

Please sign in to comment.