[Zope-CMF] Re: [CMF 2.1] FSPageTemplate & Unicode
Hanno Schlichting
plone at hannosch.info
Sat Jan 6 15:28:19 EST 2007
Martin Aspeli wrote:
> Jens Vagelpohl wrote:
>
> My concern is just that we need a robust solution that doesn't put too
> much onus on the end developer. If I have to do this it's pretty
> horrendous:
>
> >>> mtool = getUtility(IMembershipTool)
> >>> mtool = mtool.__of__(context)
> >>> # now use mtool
>
> especially since the errors I get will likely be confusing. I have
> learned the hard way that having to understand how acquisition interacts
> with your code fully can be painful, and that sometimes the Zope2/Zope3
> divide still forces this on developers. In this case, we need to make it
> as hard as possible to make mistakes, or the learning curve will just
> shoot up again.
>
> In fact, I'm not quite sure I understand the full extent of the problem
> here, which is why I'm not being more pro-active in offering suggestions.
>
> Now, I assume we still create the tool objects as
> portal['portal_membership'] or whatever, i.e. they are still
> SimpleItem's or whatever, so they still have acquisition mixed in.
> Presumably, they should also have an aq_parent always, no?
>
> Then, I assume that on portal setup, we do
> registerUtility(provides=IMembershipTool,
> component=portal.portal_membership) - that is, we are telling the
> persistent local utility registry that we are using the same physical
> object (in the ZODB), rather than giving it a factory from which to
> create its own object.
>
> This is what leads to believe there ought to be an aq_parent by
> containment, but I guess I may be wrong?
Yep, you are wrong ;)
A sample session from my local zopectl debug:
>>> from Products.CMFPlone.interfaces import ITranslationServiceTool
>>> from zope.component import getUtility
>>> getUtility(ITranslationServiceTool, context=app.test)
<TranslationServiceTool at translation_service>
>>> getUtility(ITranslationServiceTool, context=app.test).aq_parent
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: aq_parent
>>> from Products.CMFCore.utils import getToolByName
>>> getToolByName(app.test, 'translation_service')
<TranslationServiceTool at /test/translation_service>
>>> getToolByName(app.test, 'translation_service').aq_chain
[<TranslationServiceTool at /test/translation_service>, <PloneSite at
/test>, <Application at >]
You currently don't get any Acquisition context for utilities if you
don't wrap them explicitly:
>>> getUtility(ITranslationServiceTool,
context=app.test).__of__(app.test).aq_chain
[<TranslationServiceTool at /test/translation_service>, <PloneSite at
/test>, <Application at >]
Hanno
More information about the Zope-CMF
mailing list