Plone 4 поиск пользователей с расширенными профилями - PullRequest
2 голосов
/ 01 апреля 2012

Существует необходимость расширить данные члена на Plone 4 с определенной схемой и в то же время обеспечить эффективный (то есть намного лучший, чем линейный) поиск среди этих профилей.

collect.examples.userdata, кажется, является примером того, как сделать userdata правильным способом, но как насчет поиска? Есть ли эффективные поисковые решения, например, по каталогу?

Существует такая вещь, как мембрана, которая может отображать пользователей на контент, но использует Архетипы и довольно старый продукт (возможно, у меня неправильное впечатление).

Тем не менее, например, отображение пользовательских данных в экземпляры типа Ловкость может быть в порядке.

Вопрос в том, есть ли какой-нибудь готовый код или понадобится нестандартное решение?

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

Нет, единственное готовое решение, как вы сказали, это мембрана .Но IMO - это сложный и специфический продукт, поэтому я не думаю, что он вам действительно нужен.Чтобы достичь своей цели, вам нужно немного развития.Примерно так:

0 голосов
/ 13 мая 2012

Это обзор (не подробное руководство) реализации:

Инструмент для каталогов выполнен аналогично 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 () сделало все это в сотни раз (!) медленнее.

Членство в группах обрабатывалось отдельно, потому что нет событий, которые обозначить изменения в группах, необходимые для переиндексации некоторых или всех членов.

...