Skip to content

Instantly share code, notes, and snippets.

@thomasmassmann
Last active July 8, 2020 07:54
Show Gist options
  • Save thomasmassmann/96e8844d7b93ea3774237c0b6faae3f8 to your computer and use it in GitHub Desktop.
Save thomasmassmann/96e8844d7b93ea3774237c0b6faae3f8 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
"""Collection tiles."""
from Acquisition import aq_inner
from plone.app.contenttypes.behaviors.collection import ICollection
from plone.app.standardtiles import PloneMessageFactory as PMF # noqa: N814
from plone.app.standardtiles.contentlisting import IContentListingTileLayer
from plone.subrequest.interfaces import ISubRequest
from plone.supermodel.model import Schema
from plone.tiles import Tile
from plone.tiles.interfaces import ITile
from zope import schema
from zope.component import getMultiAdapter
from zope.interface import alsoProvides
from zope.interface import implementer
class ICollectionResultsTile(Schema):
"""Collection resutls tile schema."""
title = schema.TextLine(
required=False,
title=PMF(u'label_title', default=u'Title'),
)
description = schema.Text(
description=PMF(
u'help_description',
default=u'Used in item listings and search results.'
),
missing_value=u'',
required=False,
title=PMF(u'label_description', default=u'Summary'),
)
view_template = schema.Choice(
required=True,
source='Available Listing Views',
title=PMF(u'Display mode'),
)
@implementer(ITile)
class CollectionResultsTile(Tile):
"""Collection results tile."""
@property
def title(self):
return self.data.get('title')
@property
def description(self):
return self.data.get('description')
@property
def view_template(self):
return self.data.get('view_template')
def contents(self):
"""Search results"""
view = self.view_template or 'listing_view'
view = view.encode('utf-8')
options = dict(original_context=self.context)
alsoProvides(self.request, IContentListingTileLayer)
return getMultiAdapter(
(self.results(), self.request),
name=view)(**options)
@property
def collection_behavior(self):
return ICollection(aq_inner(self.context))
@property
def b_size(self):
return getattr(self, '_b_size', self.collection_behavior.item_count)
@property
def b_start(self):
request = self.request
if ISubRequest.providedBy(request):
request = request.PARENT_REQUEST
b_start = getattr(request, 'b_start', None) or 0
return int(b_start)
def results(self, **kwargs):
"""Return a content listing based result set with results from the
collection query.
:param **kwargs: Any keyword argument, which can be used for catalog
queries.
:type **kwargs: keyword argument
:returns: plone.app.contentlisting based result set.
:rtype: ``plone.app.contentlisting.interfaces.IContentListing`` based
sequence.
"""
# Extra filter
request = self.request
if ISubRequest.providedBy(request):
request = request.PARENT_REQUEST
content_filter = dict(request.get('contentFilter', {}))
content_filter.update(kwargs.get('contentFilter', {}))
kwargs.setdefault('custom_query', content_filter)
kwargs.setdefault('batch', True)
kwargs.setdefault('b_size', self.b_size)
kwargs.setdefault('b_start', self.b_start)
results = self.collection_behavior.results(**kwargs)
return results
def batch(self):
# collection is already batched.
return self.results()
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xml:lang="en"
lang="en"
xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
i18n:domain="Plone">
<body>
<h2 class="tileHeader"
tal:condition="view/title"
tal:content="view/title">Title</h2>
<div class="documentDescription"
tal:condition="view/description"
tal:content="view/description">Description</div>
<div id="content-core" tal:define="batch view/batch" tal:condition="batch">
<tal:contents tal:replace="structure python:view.contents()">Listing</tal:contents>
<div metal:use-macro="context/batch_macros/macros/navigation" />
</div>
</body>
</html>
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
xmlns:plone="http://namespaces.plone.org/plone">
<include package="plone.tiles" />
<include package="plone.tiles" file="meta.zcml"/>
<plone:tile
add_permission="cmf.ModifyPortalContent"
class=".collection.CollectionResultsTile"
description='Display the results of a saved search of the site content'
for="plone.app.contenttypes.interfaces.ICollection"
name="plone.tiles.collection_results"
permission="zope2.View"
schema=".collection.ICollectionResultsTile"
template="templates/collection_results.pt"
title="Collection results"
/>
</configure>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment