[Zope-dev] Interaction between new (2.2) ZCatalog and Renderable

Jeff Sasmor jeff@janix.com
Thu, 27 Jul 2000 12:43:01 -0400


Hi Zdevs,

I posted a message to Zope@Zope.org and then later
figured out the problem and now feel that the issue
belongs in Zope-Dev, so here it goes.

Submitted for your approval...


I think that I have found an interaction between changes made in
manage_addZCatalog (lib/python/Products/ZCatalog/ZCatalog/py)
and the Renderable ZClass product.  It's also possible that this
interaction will affect other things as well.

The new version of method 'manage_addZCatalog' has calls to str()
near its beginning.  The older (2.1.6) does not.  The Renderable
product overrides str to do its work.  This gets _very_ messy
when you initialize a catalog in the xxx_add dtml method for a
ZClass (that is, if you create an instance of the ZClass and the _add
method instantiates a ZCatalog instance.) and the ZClass itself is
renderable.

The manage_addZCatalog method ends up invoking the str() method
that's in the Renderable product.  This code attempts to publish(?) the
a dtml method named render (this is what it does by default).
In my case, the dtml method tries to query the created ZCatalog instance.

This does not work! since the ZC instance isn't actually created since the
_add method has not completed(?).
So the render dtml method borks with an attribute error.
Correct me if I have reverse-engineered these conclusions from looking
at the traceback and made a logic error....

As one can see from the traceback attached to the end of this email,
the manage_add methof (I put XXXXX near where this mess begins)
warps into the render dtml method at line 112 of manage_addZCatalog,
which is the first str() (can be seen in the src).  This ends up in
an External Method, rendercal.py (last line of traceback).  If you were
to look there you'd se that it's doing a Catalog.searchResults().

**SO** it appears as if you cannot instantiate a ZCatalog in the _add
dtml method of a ZClass IFF the ZClass inherits from Renderable AND
if the render dtml method of the class (required by Renderable) uses
the ZCatalog.

This interaction may very well affect other products as well. But right now
my brain hurts.  Excuse me if someone else reported this, but I haven't
seen mention of it so far.

This should be easy to reproduce.  On a 2.2 system that has the Renderable
ZClass product installed, install EventFolder (it's on Zope.org, there's a .zexp
and some External Methods in the tgz file, just untar it in the Zope root and
copy the .zexp to the import dir and import it).  Try to create an
instance and you should get this error.

It seems to me the only solution is to recreate the class without the
Renderable inheritance.  Not a big deal to lose....  But what other
schizoZopia is waiting in the future.....


Jeff Sasmor
jeff@janix.com


Traceback (innermost last):
  File /usr/local/Zope220/lib/python/ZPublisher/Publish.py, line 222, in publish_module
  File /usr/local/Zope220/lib/python/ZPublisher/Publish.py, line 187, in publish
  File /usr/local/Zope220/lib/python/Zope/__init__.py, line 221, in zpublisher_exception_hook
    (Object: RoleManager)
  File /usr/local/Zope220/lib/python/ZPublisher/Publish.py, line 171, in publish
  File /usr/local/Zope220/lib/python/ZPublisher/mapply.py, line 160, in mapply
    (Object: EventFolder_add)
  File /usr/local/Zope220/lib/python/ZPublisher/Publish.py, line 112, in call_object
    (Object: EventFolder_add)
  File /usr/local/Zope220/lib/python/OFS/DTMLMethod.py, line 167, in __call__
    (Object: EventFolder_add)
  File /usr/local/Zope220/lib/python/DocumentTemplate/DT_String.py, line 502, in __call__
    (Object: EventFolder_add)
  File /usr/local/Zope220/lib/python/DocumentTemplate/DT_Let.py, line 147, in render
    (Object: folder="EventFolder.createInObjectManager(REQUEST['id'], REQUEST)")
  File /usr/local/Zope220/lib/python/DocumentTemplate/DT_With.py, line 146, in render
    (Object: folder)
  File /usr/local/Zope220/lib/python/DocumentTemplate/DT_Util.py, line 337, in eval
    (Object: manage_addProduct['ZCatalog'].manage_addZCatalog(this(),'Catalog','EventCatalog' ))
    (Info: this)
  File <string>, line 0, in ?
XXXXXXXXXXXXXXXX it begins
  File /usr/local/Zope220/lib/python/Products/ZCatalog/ZCatalog.py, line 112, in manage_addZCatalog
????????????how did we get here vvvvvvvv
  File /usr/local/Zope220/lib/python/Products/Renderable/Renderable.py, line 17, in __str__
    (Object: Renderable)
  File /usr/local/Zope220/lib/python/OFS/DTMLMethod.py, line 167, in __call__
    (Object: render)
  File /usr/local/Zope220/lib/python/DocumentTemplate/DT_String.py, line 502, in __call__
    (Object: render)
  File /usr/local/Zope220/lib/python/DocumentTemplate/DT_With.py, line 146, in render
    (Object: ZopeTime)
  File /usr/local/Zope220/lib/python/DocumentTemplate/DT_Let.py, line 147, in render
    (Object: tdate="'%s/%s/1' % (tyear,tmonth) "
          this_month="'%s/%s' % (tyear,tmonth) "
          ddate="_.DateTime(tdate)")
  File /usr/local/Zope220/lib/python/DocumentTemplate/DT_Let.py, line 147, in render
    (Object: smeth="dateSearch.absolute_url()")
  File /usr/local/Zope220/lib/python/DocumentTemplate/DT_Util.py, line 337, in eval
    (Object: renderMonth(ddate,smeth,bodyFgColor,bodyBgColor,headingFgColor,headingBgColor, 'showyear' , moderated))
    (Info: smeth)
  File <string>, line 0, in ?
  File /usr/local/Zope220/lib/python/Products/ExternalMethod/ExternalMethod.py, line 270, in __call__
    (Object: renderMonth)
    (Info: ((DateTime('2000/07/01'), 'http://www.ptang.com/test/sss/dateSearch', '#000000', '#ffffff', '#ffffff',
'#000000', 'showyear', 'on'), {}, None))

XXXXXXXXXXXXXXX Arrgh!

  File /usr/local/Zope220/lib/python/Products/EventFolder/Extensions/rendercal.py, line 97, in renderMonth
    (Object: Renderable)
AttributeError: (see above)

Zope Error
Zope has encountered an error while publishing this resource.
Error Type: AttributeError
Error Value: Catalog