Получить список доступных для поиска типов контента в Plone 4

Я использую Products.AdvancedQuery для создания замены механизма LiveSearch для моего сайта. Пока все работает отлично, но стандартный запрос выполняет поиск по всем доступным типам контента, в том числе помеченным как недоступный для поиска в @@search-controlpanel.

Я бы хотел, чтобы AdvancedQuery динамически отфильтровывал те, которые не доступны для поиска, в соответствии с тем, что указано в @@search-controlpanel. Как я могу это сделать?

Если AQ не может этого сделать, я могу отфильтровать результаты сразу после запроса каталога. Мне нужен список имен типов контента (или интерфейсов), помеченных как доступные для поиска. Как я могу получить такой список?


person Rigel Di Scala    schedule 23.05.2012    source источник


Ответы (2)


Предполагая, что вы можете получить кортеж или список типов, которые панель управления заносит в черный список программно, это может быть так же просто, как (импорт опущен):

>>> query = myquery & AdvancedQuery.Not(AdvancedQuery.In(MY_TYPE_BLACKLIST_HERE)) 
>>> result = getToolByName(context, 'portal_catalog').evalAdvancedQuery(query)
person sdupton    schedule 23.05.2012
comment
Спасибо за указатели. Вы помогли мне понять, что нужно сделать, чтобы заставить его работать. Я добавляю ответ, описывающий мое решение. - person Rigel Di Scala; 24.05.2012

Хорошо, благодаря предложению sdupton я нашел способ заставить его работать.

Это решение (очевидный импорт опущен):

from Products.AdvancedQuery import (Eq, Not, In, 
                                    RankByQueries_Sum, MatchGlob)

from my.product.interfaces import IQuery


class CatalogQuery(object):

    implements(IQuery)

    ...

    def _search(self, q, limit):
        """Perform the Catalog search on the 'SearchableText' index
        using phrase 'q', and filter any content types 
        blacklisted as 'unsearchable' in the '@@search-controlpanel'.
        """

        # ask the portal_properties tool for a list of names of
        # unsearchable content types
        ptool = getToolByName(self.context, 'portal_properties')
        types_not_searched = ptool.site_properties.types_not_searched

        # define the search ranking strategy
        rs = RankByQueries_Sum(
                (Eq('Title', q), 16),
                (Eq('Description', q), 8)
             )

        # tune the normalizer
        norm = 1 + rs.getQueryValueSum()

        # prepare the search glob
        glob = "".join((q, "*"))

        # build the query statement, filter using unsearchable list
        query = MatchGlob('SearchableText', glob) & Not(
                    In('portal_type', types_not_searched)
                )

        # perform the search using the portal catalog tool
        brains = self._ctool.evalAdvancedQuery(query, (rs,))

        return brains[:limit], norm
person Rigel Di Scala    schedule 24.05.2012