[Grok-dev] getUtility() fails from IApplicationInitializedEvent function

Àlex Magaz Graça rivaldi8 at gmail.com
Sat Dec 24 19:28:33 UTC 2011


Thanks Souheil, I solved the problem setting the site:

from zope.component.hooks import setSite

@grok.subscribe(Helpdesk, grok.IApplicationInitializedEvent)
def setUpTestUsers(obj, event):
     setSite(obj)
     authPlugin = getUtility(IAuthenticatorPlugin, "users")
     authPlugin.addTestingUsers()

Still, it seems the application isn't entirely initialised yet, because 
now I get an exception when the Account object is added to userFolder 
(just a container):

NotYet: <helpdesk.auth.Account object at 0x41ffb10>

The code is like this:

class UserAuthenticatorPlugin(grok.LocalUtility):
     grok.provides(IAuthenticatorPlugin)
     grok.name("users")

     def __init__(self):
         self.userFolder = UserFolder()

     def addTestingUsers(self):
         roleManager = IPrincipalRoleManager( grok.getSite() )
         self.userFolder["tech"] = Account("tech", "tech", "Technician", 
"helpdesk.Tech")

I just want to add some test users to the application. Should I take 
another approach to do this? Before trying with the event, I called the 
method from the plugin's __init__, but this made functional tests fail:

[...]
File "/home/alex/uni/projecte/repo/trunk/HelpDesk/src/helpdesk/auth.py", 
line 36, in __init__
     self.addTestingUsers()
   File 
"/home/alex/uni/projecte/repo/trunk/HelpDesk/src/helpdesk/auth.py", line 
41, in addTestingUsers
     roleManager = IPrincipalRoleManager( grok.getSite() )
TypeError: ('Could not adapt', None, <InterfaceClass 
zope.securitypolicy.interfaces.IPrincipalRoleManager>)

Thanks,
Àlex

El 22/12/11 11:32, Souheil CHELFOUH escribió:
> My guess : your IAuthenticatorPlugin is supposed to be a local utility
> The site manager is not yet set in the event.
> Therefore, your getUtility will only query the global registry.
> Try to set the site manager in the event or use directly the SM from
> the application object you get
>
> - Souheil
>
> 2011/12/21 Àlex Magaz Graça<rivaldi8 at gmail.com>:
>> Hi,
>>
>> I'm getting a ComponentLookupError when getUtility() is called in the
>> following function:
>>
>> @grok.subscribe(Helpdesk, grok.IApplicationInitializedEvent)
>> def setUpTestUsers(obj, event):
>>      authPlugin = getUtility(IAuthenticatorPlugin, "users")
>>
>> According to Grok documentation [1]:
>>
>> "This event can be used to trigger the creation of contents or other tasks
>> that require the application to be fully operational : utilities installed
>> and indexes created in the catalog."
>>
>> I understand utilities should be ready. In fact, I have a print statement in
>> the utility's __init__() which is executed before getUtility() fails. I've
>> also checked the getUtility() call in the function is the same that is used
>> in other places and working just fine.
>>
>> Any idea why this fails?
>>
>> [1]
>> http://grok.zope.org/doc/current/reference/events.html#iapplicationinitializedevent
>>
>> Thanks,
>> Àlex
>>
>> _______________________________________________
>> Grok-dev mailing list
>> Grok-dev at zope.org
>> https://mail.zope.org/mailman/listinfo/grok-dev
>>


More information about the Grok-dev mailing list