Skip to content

Commit

Permalink
Merge branch 'main' into contextnavigation_file_icon
Browse files Browse the repository at this point in the history
  • Loading branch information
davisagli authored Jan 22, 2025
2 parents eb50d95 + 88f2bc9 commit 1a6297b
Show file tree
Hide file tree
Showing 16 changed files with 115 additions and 31 deletions.
2 changes: 0 additions & 2 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ jobs:
include:
- python-version: "3.8"
plone-version: "5.2"
- python-version: "3.8"
plone-version: "6.0"
- python-version: "3.9"
plone-version: "6.0"
- python-version: "3.10"
Expand Down
19 changes: 19 additions & 0 deletions docs/source/endpoints/registry.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,25 @@ Example response:
:language: http
```

## Filter list of registry records

```{versionadded} plone.restapi 9.10.0
```

You can filter a list of registry records and batch the results.
To do so, append a query string to the listing endpoint with a `q` parameter and its value set to the prefix of the desired record name.
See {doc}`../usage/batching` for details of how to work with batched results.

```{eval-rst}
.. http:example:: curl httpie python-requests
:request: ../../../src/plone/restapi/tests/http-examples/registry_get_list_filtered.req
```

Example response:

```{literalinclude} ../../../src/plone/restapi/tests/http-examples/registry_get_list_filtered.resp
:language: http
```

## Updating registry records

Expand Down
1 change: 1 addition & 0 deletions news/1685.internal
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Update CI. @davisagli
1 change: 1 addition & 0 deletions news/1861.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
In the `@registry` endpoint, added support for filtering the list of registry records. @Faakhir30
3 changes: 2 additions & 1 deletion plone-6.0.x-python3.8.cfg
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[buildout]
extends =
https://dist.plone.org/release/6.0.12/versions.cfg
https://dist.plone.org/release/6.0.14/versions.cfg
base.cfg

[instance]
Expand All @@ -15,3 +15,4 @@ robotframework-assertion-engine = 2.0.0
robotframework-debuglibrary = 2.3.0
robotframework-pythonlibcore = 4.2.0
grpcio-tools = 1.59.0
twine = 5.1.1
17 changes: 2 additions & 15 deletions plone-6.0.x.cfg
Original file line number Diff line number Diff line change
@@ -1,24 +1,11 @@
[buildout]
extends =
https://dist.plone.org/release/6.0.12/versions.cfg
https://dist.plone.org/release/6.0.14/versions.cfg
base.cfg

[buildout:python37]
parts =
test
code-analysis

[instance]
recipe = plone.recipe.zope2instance
zodb-temporary-storage = off

[versions]
# Override pin from Zope. https://github.com/zopefoundation/Zope/issues/1220
docutils = 0.21.2
pygments = 2.14.0
plone.app.linkintegrity = 4.0.3
robotframework-browser = 17.5.2
robotframework-assertion-engine = 2.0.0
robotframework-debuglibrary = 2.3.0
robotframework-pythonlibcore = 4.2.0
grpcio-tools = 1.59.0
twine = 5.1.1
9 changes: 1 addition & 8 deletions plone-6.1.x.cfg
Original file line number Diff line number Diff line change
@@ -1,17 +1,10 @@
[buildout]
extends =
https://dist.plone.org/release/6.1.0a3/versions.cfg
https://dist.plone.org/release/6.1.0b2/versions.cfg
base.cfg

[buildout:python37]
parts =
test
code-analysis

[instance]
recipe = plone.recipe.zope2instance
zodb-temporary-storage = off

[versions]
# Override pin from Zope. https://github.com/zopefoundation/Zope/issues/1220
docutils = 0.21.2
2 changes: 1 addition & 1 deletion requirements-6.0.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
-r https://dist.plone.org/release/6.0.12/requirements.txt
-r https://dist.plone.org/release/6.0.14/requirements.txt
2 changes: 1 addition & 1 deletion requirements-6.1.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
-r https://dist.plone.org/release/6.1.0a3/requirements.txt
-r https://dist.plone.org/release/6.1.0b2/requirements.txt
13 changes: 12 additions & 1 deletion src/plone/restapi/services/registry/get.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from plone.registry import Registry
from plone.registry.interfaces import IRegistry
from plone.restapi.interfaces import ISerializeToJson
from plone.restapi.serializer.converters import json_compatible
Expand Down Expand Up @@ -35,5 +36,15 @@ def reply(self):
value = registry[self._get_record_name]
return json_compatible(value)
else: # batched listing
serializer = getMultiAdapter((registry, self.request), ISerializeToJson)
if q := self.request.form.get("q"):

tmp_registry = Registry()
for key in registry.records.keys():
if key.startswith(q):
tmp_registry.records[key] = registry.records[key]
registry = tmp_registry
serializer = getMultiAdapter(
(registry, self.request),
ISerializeToJson,
)
return serializer()
Original file line number Diff line number Diff line change
Expand Up @@ -423,5 +423,5 @@ Content-Type: application/json
"value": "The person that created an item"
}
],
"items_total": 2973
"items_total": 2974
}
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
}
2 changes: 1 addition & 1 deletion src/plone/restapi/tests/http-examples/site_get.resp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Content-Type: application/json
{
"@id": "http://localhost:55001/plone/@site",
"features": {
"filter_aliases_by_date": false
"filter_aliases_by_date": true
},
"plone.allowed_sizes": [
"huge 1600:65536",
Expand Down
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 @@ -549,6 +549,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
9 changes: 9 additions & 0 deletions src/plone/restapi/tests/test_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,12 @@ def test_get_listing(self):
self.assertIn("items", response)
self.assertIn("batching", response)
self.assertIn("next", response["batching"])

def test_get_filtered_listing(self):
response = self.api_session.get("/@registry?q=foo.bar1")
self.assertEqual(response.status_code, 200)
response = response.json()
# 10 records from foo.bar10 to foo.bar19 and 1 record foo.bar1
self.assertEqual(len(response["items"]), 11)
self.assertEqual(response["items"][0]["name"], "foo.bar1")
self.assertEqual(response["items"][0]["value"], "Lorem Ipsum")

0 comments on commit 1a6297b

Please sign in to comment.