On 6/10/06, xiru <[EMAIL PROTECTED]> wrote:
> Interessante. Se voce conseguir pensar num patch, tenho certeza que ele seria 
> bem vindo.
>Bastaria mandar para a Plone Developers e pedir para alguem revisar e
dar commit.

O caso é que ainda não entendi como a BTreeFolder2 armazena as
informações de meta_types internamente, pois somente assim, seria
possível filtrar os itens da pasta que são tipos de conteúdo sem
acordar os objetos...

Ai é que rola o problema..

# Esse ó o método contentIds e _filteredItems:

   security.declarePublic('contentIds')
    def contentIds( self, spec=None, filter=None):
        # List IDs of contentish and folderish sub-objects.
        # (method is without docstring to disable publishing)
        #
        #Aqui ele existe um bug, pois ele não verfica o valor de
filter antes de retornar
        #objectIds()
        if spec is None:
            ids = self.objectIds()
        else:
            # spec is deprecated, use filter instead!
            spec = self._morphSpec(spec)
            ids = self.objectIds(spec)

        #Aqui ele chama filteredItems em e acorda todos os objetos e
para cada um instancia
       #uma classe ContentFilter
        return  map( lambda item: item[0],
                      self._filteredItems( ids, filter ) )

### Segue _filteredItems(): ####
    def _filteredItems( self, ids, filt ):
        """
            Apply filter, a mapping, to child objects indicated by 'ids',
            returning a sequence of ( id, obj ) tuples.
        """
        # Restrict allowed content types
        if filt is None:
            filt = {}
        else:
            # We'll modify it, work on a copy.
            filt = filt.copy()
        pt = filt.get('portal_type', [])
        if type(pt) is type(''):
            pt = [pt]
        types_tool = getToolByName(self, 'portal_types')
        allowed_types = types_tool.listContentTypes()
        if not pt:
            pt = allowed_types
        else:
            pt = [t for t in pt if t in allowed_types]
        if not pt:
            # After filtering, no types remain, so nothing should be
            # returned.
            return []
        filt['portal_type'] = pt

        query = ContentFilter(**filt)
        result = []
        append = result.append
        get = self._getOb
        for id in ids:
#####################
            #Acorda os objetos
            obj = get( id )
            #Executa uma busca em cada objeto para filtrar os items
            if query(obj):
                append( (id, obj) )
        return result
####################



O problema todo é que a API de contentIds() suporta o envio de um
dicionário com valores de metadados para filtrar os itens usando a
Classe ContentFilter. Essa pesquisa não depende do catálogo e por isso
precisa acordar os objetos.

Ou seja, o patch para Plone2.1(2.5) teria que se apoiar justamente
nisso, aceitar o mesmo filtro e usar o catálogo para localizar os
objetos usando um indice de path também para limitar ao container
(excluindo sub-pastas) e assim manter a API com uma implementação que
não acorde os objetos.. mas que precisa do portal_catalog.

Preciso agora fazer uma implementação e garantir que nenhum novo
índice ou metadado precisará ser criado para filtrar os items..

Vou fazer um find com grep para descobrir em quanto código existe que
usa contentIds() e o benefício que essa mudança acarretaria..

Afinal, BaseFolder e BaseBtreeFolder herdam essa implementação de
CMFCore.PortalFolder.
Nesse caso o patch seria para o Archetypes mesmo.. em BaseFolder.

--
Rudá Porto Filgueiras
Empresa Livre
http://www.empresalivre.com.br


Para enviar uma mensagem: zope-pt@yahoogrupos.com.br
Para desistir envie uma mensagem em branco para: [EMAIL PROTECTED] 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/zope-pt/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 

Responder a