In my case I'm trying to index a memberdata property added to users:
from plone.indexer.decorator import indexer
@indexer(IMemberData)
def getCustomValue(obj):
return obj.getProperty("custom_user_field")
The magic expected to happen here:
def catalog_rebuild(context):
portal_catalog = api.portal.get_tool('portal_catalog')
my_catalog = get_catalog()
md = api.portal.get_tool("portal_memberdata")
_members = md._members
_properties = api.portal.get()[
'acl_users']['mutable_properties']._storage
for idx, user_id in enumerate(_members.iterkeys()):
print "{0}: {1}".format(idx, user_id)
user_member_data = _members.get(user_id)
user_properties = _properties.get(user_id, dict())
if user_member_data is not None:
values = user_properties.get('custom_user_field', [])
if len(values) > 0:
user = api.user.get(user_id)
my_catalog.catalog_object(
user,
idxs=('getCustomValue',),
update_metadata=1
)
The problem is memberdata is not an real indexable object (I think). My getCustomValue is created but no value is indexed.
So my question is: how to index any simple data in a (z)catalog? Let's say I have an json containing users and their preferred colors like:
{
'Alice': ['blue', 'red'],
'Bob': ['yellow', 'blue']
}
and for some reason I want to index these values in a catalog (KeywordIndex). In order to have queries like:
>>> my_catalog.searchResults(color="blue")
>>> ["Alice", "Bob"]
I found something here: https://stackoverflow.com/questions/9962458/plone-4-search-members-with-extended-profiles (but contains broken link...)
Also on github (I use to search code...): https://github.com/Blaastolen/intranett/blob/7df5801545116672617f9a916fc88f4ccd4e6694/src/intranett.policy/intranett/policy/tools.py#L102
Is there any simple tutorial on this? Or can you provide an example?