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