• Remember Mailing List

Re: user.getRoles() and rolemanager.getRolesForPrincipal()

from Rob Miller on Jan 04, 2007 01:51 PM
Tim Hicks wrote:
> Hi,
> 
> I wonder if someone with more PAS/Membrane zen can help me out...
> 
> I have an event listener that looks like::
> 
> def premiumMembershipFeePaid(event):
>     member = event.member
>     # Upgrade the Member to the 'PremiumMember' role
>     acl_users = getToolByName(member, 'acl_users')
>     user_plugins = acl_users._getOb('plugins')
>     rmanagers = user_plugins.listPlugins(IRoleAssignerPlugin)
>     if not (rmanagers):
>         raise NotImplementedError("There is no plugin that can modify
> roles")
>     for rid, rmanager in rmanagers:
>         rmanager.assignRoleToPrincipal(config.PREMIUM_ROLE,
>                                        member.getUserName(), )
>     member.reindexObject()
> 
> 
> My event gets fired and the listener gets called.  Using
> pdb.set_trace(), I have been able to ascertain that after the 'for' loop
> above, the following is true::
> 
> (Pdb) rmanagers[0][1].getRolesForPrincipal(member)
> ('PremiumMember',)
> (Pdb) member.getRoles()
> ('Member',)
> (Pdb) member.reindexObject()
> (Pdb) member.getRoles()
> ('Member',)
> (Pdb) member.roles
> (u'Member',)
> 
> 
> So, it seems that the member role change is only partially successful.
> getRolesForPrincipal knows about the change, but the getRoles method on
> the member does not.

are you sure that you've got the right plug-in?  the membrane roles plugin 
doesn't yet implement IRoleAssignerPlugin.  while i agree that going through 
acl_users _should_ work (and it eventually will), for now you're probably 
better off explicitly setting the roles field on the member object.

-r
Return to date view: threaded or flat