The main feature of the CMF catalog is that it filters search results from the Zope 2 “catalog” based on the requesting user’s ability to view a particular cataloged object.
Pyramid itself has no cataloging facility, but an addon package named repoze.catalog offers similar functionality.
In CMF, a catalog index named getAllowedRolesAndUsers along with application indexing code allows for filtered search results. It’s reasonably easy to reproduce this pattern using some custom code.
Here’s some code which creates an allowed index for use in a repoze.catalog catalog:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from pyramid.security import principals_allowed_by_permission
from repoze.catalog.indexes.keyword import CatalogKeywordIndex
from repoze.catalog.catalog import Catalog
class Allowed:
def __init__(self, permission):
self.permission = permission
def __call__(self, context, default):
principals = principals_allowed_by_permission(context,
self.permission)
return principals
def make_allowed_index(permission='View'):
index = CatalogKeywordIndex(Allowed(permission))
return index
index = make_allowed_index()
catalog = Catalog()
catalog['allowed'] = index
|
When you index an item, the allowed index will be populated with all the principal ids which have the ‘View’ permission.
Here’s how you might use the allowed index within a query:
from pyramid.security import effective_principals
principals = effective_principals(request)
catalog.searchResults(allowed={'operator':'or', 'query':principals})
The above query will return all document ids that the current user has the ‘View’ permission against. Add other indexes to the query to get a useful result.
See the repoze.catalog package for more information.