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