Opa Dorneles,

Essa foi "caixa preta". Ia ser difícil para eu resolver sozinho esta. 
Funcionou corretamente com o teu pseudo-patch.

Muito obrigado
Fabiano



Dorneles Treméa escreveu:
> Opa Marcon,
>
> > Aqui no meu trabalho, criamos uma tool que herda a classe MembershipTool
> > e sobrepõe o método getMemberInfo, até aqui tudo bem.
> > Uma customização desta tool é fazer com que suas actions apareçam
> > somente para o Manager, para isso fizemos o seguinte no AppInstall.py:
> >
> > [snipped code]
> >
> > O código funciona quando se instala o produto, porém quando se reincia a
> > instância as configurações são perdidas e volta o default do
> > portal_membership. Eu acredito que o que está acontecendo é que quando
> > se reinicia a instância as actions são buscadas da classe pai e aí
> > carregadas,  mas como fazer para que isso não aconteça?
>
> está quase tudo certo... só faltou um detalhe... :-)
>
> Da forma como está, ele itera sobre as actions e altera elas. Só que
> elas estão armazenadas numa tupla, e como tu sabes, tuplas são objetos
> imutáveis. Então quando você altera um dos objetos (uma action) presente
> na tupla, o Zope 'não sabe' que a tupla foi alterada (na verdade não
> foi a tupla, mas sim um objeto presente nela), para fazer a persistência
> automática dos dados. É por isso que quando você reinicia o Zope, volta
> tudo ao normal...
>
> Falta agora indicar ao Zope que os dados do conteúdo da tupla foram
> alterados e que deve ser efetuado a persistência. Detalhe: esse enrosco
> todo só acontece quando se altera dados diretos em um tupla, para todo
> o resto, a persistência é automática e transparente.
>
> Segue um pseudo-patch para o teu código:
>
> def setupActions(self, out):
>       """Configura actions do portal."""
>       pm = self.portal_membership
>       id_actions = ['preferences',
>                     'addFavorite',
>                     'mystuff',
>                     'favorites',
>                     'manage_members']
> +     actions = pm._cloneActions()
> -     for action in pm.listActions():
> +     for action in actions:
>           if action.id in id_actions:
>                action.permissions=('Manage portal',)
>                out.write('[portal_membership] configurada permissao da 
> action "%s" para '
>                          '"Manage portal".\n' % action.id)
> +      pm._actions = actions
>
> Essa última linha é que diz ao Zope que o 'pm' foi alterado e precisa
> ser salvo.
>
> Outra possível saída seria apenas setar 'pm._p_changed = True', mas
> acredito que com com o _cloneActions o código fica mais legível.
>
> HTH,
>
> -- 
>
> Dorneles Treméa
> X3ng Web Technology
>  



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