[Zope-CMF] Re: Tools as local utilities

Jens Vagelpohl jens at dataflake.org
Mon Nov 13 09:47:25 EST 2006


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


On 10 Sep 2006, at 16:08, Tres Seaver wrote:

> Rocky Burt wrote:
>> On Sat, 2006-09-09 at 21:57 +0100, Martin Aspeli wrote:
>>> Hi guys,
>>>
>>> philiKON pointed out something interesting to me the other day - we
>>> could actually register the existing tools as local utilities as  
>>> of Zope
>>> 2.10. That way, you could do this:
>>>
>>>    actions = getUtility(IActionsTool)
>>>
>>> as another spelling for
>>>
>>>    actions = getToolByName(context, 'portal_actions')
>>>
>>> But now we're being more consistent with Zope 3, we are using a  
>>> proper
>>> interface and not just a string to check, we don't have to worry  
>>> about
>>> passing a context parameter (though tests have to do a setSite()  
>>> call),
>>> and we can let the registration be overridden with the component
>>> registry operations.
>>
>> +10 on this idea from me.
>
> +1 here, too.  In fact, being able to make this switch is the *reason*
> 'getToolByName' was introduced in the first placey.

I am experimenting with that right now, but my z3/Five-Fu ran low  
again ;)  My problem: calls to zope.component.getUtility 
(interface_class) never return anything. Here's the top part (the  
bottom is just the old way) of my CMFCore.utils.getToolByName:

def getToolByName(obj, name, default=_marker):

     """ Get the tool, 'toolname', by acquiring it.
     """
     tool_iface = _tool_iface_registry.get(name)

     if tool_iface is not None:
         warn('getToolByName is deprecated, please use "getUtility(% 
s)"' % (
                tool_iface.__name__), DeprecationWarning, stacklevel=2)

         try:
             tool = getUtility(tool_iface, context=obj)
             return tool
         except ComponentLookupError:
             # behave in backwards-compatible way
             if default is _marker:
                 raise AttributeError, name

I have a simple registration going and have one ID -> interface  
registered (in "_tool_iface_registry"), 'portal_actions' is mapped to  
interface class CMFCore.interfaces._tools.IActionsTool. No matter how  
I try to call getUtility, I always get a ComponentLookupError.

I am probably missing some kind of component registration - I have  
not made any ZCML changes or changes to the code in  
CMFCore.ActionsTool, except for one line that causes the tool to be  
registered in the internal "_tool_iface_registry".

Help! :)

jens


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (Darwin)

iD8DBQFFWIV+RAx5nvEhZLIRAkpoAJ9TH7acz2//aWnjI3e+dGoTLnnHcwCfXAuH
t9KiABUMVqTdmlU6S5/knjo=
=2Qje
-----END PGP SIGNATURE-----


More information about the Zope-CMF mailing list