Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
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
1 change: 1 addition & 0 deletions src/plone/volto/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<include package=".behaviors" />
<include package=".browser" />
<include package=".indexers" />
<include package=".services" />

<include file="profiles.zcml" />
<include file="patches.zcml" />
Expand Down
6 changes: 4 additions & 2 deletions src/plone/volto/indexers/indexers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
from plone.restapi.blocks import visit_blocks
from plone.volto.behaviors.preview import IPreview

import collections


@indexer(IPreview)
def hasPreviewImage(obj):
Expand Down Expand Up @@ -40,9 +42,9 @@ def image_field_indexer(obj):
def block_types_indexer(obj):
"""Indexer for all block types included in a page."""
obj = aq_base(obj)
block_types = set()
block_types = collections.Counter()
for block in visit_blocks(obj, obj.blocks):
block_type = block.get("@type")
if block_type:
block_types.add(block_type)
block_types[block_type] += 1
return block_types
1 change: 1 addition & 0 deletions src/plone/volto/profiles/default/catalog.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
<column value="head_title" />
<column value="hasPreviewImage" />
<column value="image_field" />
<column value="block_types" />
<index meta_type="KeywordIndex"
name="block_types"
>
Expand Down
Empty file.
Empty file.
15 changes: 15 additions & 0 deletions src/plone/volto/services/blocktypes/configure.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:plone="http://namespaces.plone.org/plone"
xmlns:zcml="http://namespaces.zope.org/zcml"
>

<plone:service
method="GET"
factory=".get.BlockTypesGet"
for="zope.interface.Interface"
permission="zope2.View"
name="@blocktypes"
/>

</configure>
44 changes: 44 additions & 0 deletions src/plone/volto/services/blocktypes/get.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from plone import api
from plone.restapi.behaviors import IBlocks
from plone.restapi.services import Service
from zope.interface import implementer
from zope.publisher.interfaces import IPublishTraverse


@implementer(IPublishTraverse)
class BlockTypesGet(Service):
def __init__(self, context, request):
super().__init__(context, request)
self.block_type = None

def publishTraverse(self, request, name):
self.block_type = name
return self

def reply(self):
catalog = api.portal.get_tool(name="portal_catalog")
request_body = self.request.form
result = {"items": []}
type = self.block_type

query = {
"object_provides": IBlocks.__identifier__,
"block_types": self.block_type,
}

if request_body.get("path"):
query["path"] = request_body["path"]

if type:
brains = catalog.unrestrictedSearchResults(**query)

for brain in brains:
result["items"].append(
{
"@id": brain.getURL(),
"title": brain.Title,
"count": brain.block_types[self.block_type],
}
)

return result
8 changes: 8 additions & 0 deletions src/plone/volto/services/configure.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:zcml="http://namespaces.zope.org/zcml"
>

<include package=".blocktypes" />

</configure>