Это обзор (не подробное руководство) реализации:
Инструмент для каталогов выполнен аналогично reference_catalog от Archetypes. Наиболее важные части:
from Products.ZCatalog.ZCatalog import ZCatalog
class MemberdataCatalog(UniqueObject, ZCatalog):
implements(IMemberdataCatalog)
...
security.declareProtected(ManageZCatalogEntries, 'catalog_object')
def catalog_object(self, obj, uid=None, idxs=[],
update_metadata=1, pghandler=None):
w = obj
if not IIndexableObject.providedBy(obj):
wrapper = component.queryMultiAdapter((obj, self), IIndexableObject)
if wrapper is not None:
w = wrapper
ZCatalog.catalog_object(self, w, w and str("/".join(w.getPhysicalPath())), idxs,
update_metadata, pghandler=pghandler)
(со всеми вещами GenericSetup также можно сделать аналогично архетипам)
Подписчики для IPrincipalCreatedEvent, IPrincipalDeletedEvent, IConfigurationChangedEvent
(последний требует event.context. class ._ name _ in ('UserDataConfiglet', 'PersonalPreferencesPanel', 'UserDataPanel') для обработки - к сожалению, Plone не имеет конкретного события для изменения данных профиля). Смотрите PAS о том, как эти функции и какие параметры
обработчики событий получают.
Представление / memberdata / username для каталога для адресации и переиндексации этих пользователей. Имя пользователя, созданное bobo traverse и возвращающее пользователя со свойствами,
необходим для индексов и метаданных.
http://plone.org/products/collective.examples.userdata - хорошее руководство по расширению профиля пользователя.
Кроме этого необходим адаптер
class IndexableAdapter(EnhancedUserDataPanelAdapter):
implements(IIndexableObject)
adapts(IMemberData, IMemberdataCatalog)
def __init__(self, context, catalog):
self.context = context
self.userid = context.getId()
self.catalog = catalog
def getPhysicalPath(self):
return make_physical_path(self.userid) # path to the view, which "fakes" an object
def __getattr__(self, name):
""" Proxing attribute accesses. """
return getattr(self.context, name)
# Specific indexer
def SearchableTextIntra(self):
...
Здесь EnhancedUserDataPanelAdapter был получен и расширен из UserDataPanelAdapter.
IMemberdataCatalog - это интерфейс каталога.
Важно поместить все в метаданные, даже ширину / высоту портрета,
потому что использование .getObject () сделало все это в сотни раз (!) медленнее.
Членство в группах обрабатывалось отдельно, потому что нет событий, которые
обозначить изменения в группах, необходимые для переиндексации некоторых или всех членов.