[Zope-dev] ZPatterns bug with patch

Steve Alexander steve@cat-box.net
Sun, 27 Aug 2000 10:22:13 +0100


Zope 2.2.1, ZPatterns 0-4-1snap1

I can't add a Dataskin-derived ZClass beneath a Customizer Folder any
more.

I think the order of something in the initialization of ZClasses has
changed
in Zope. It appears that the DataSkin's datamanager isn't being found
before __set_attr__ is called for the first time.

__set_attr__ is being called with name="id" val="id_of_object"

Interestingly, __init__ in DataSkins.py is also being called with the
value id.

This is because in ZClass.py:createInObjectManager, the id is given to
__init__ in the first statement, and set as an attribute in the second.

    def createInObjectManager(self, id, REQUEST, RESPONSE=None):
        """
        Create Z instance. If called with a RESPONSE,
        the RESPONSE will be redirected to the management
        screen of the new instance's parent Folder. Otherwise,
        the instance will be returned.
        """
        i=mapply(self._zclass_, (), REQUEST)
        i._setId(id)


I've fixed this by adding a test to the start of __set_attr__ of
DataSkins.py:

    def __set_attr__(self,name,val,_v_dm_=_v_dm_):
+       if name=='id' and val==self.__dict__['id']:
+           return
        dm = self.__dict__[_v_dm_]



Here's the traceback before I applied the patch:

Error Type: KeyError
          Error Value: _v_dm_

Traceback (innermost last):
  File lib/python/ZPublisher/Publish.py, line 222, in publish_module
  File lib/python/ZPublisher/Publish.py, line 187, in publish
  File lib/python/Zope/__init__.py, line 221, in
zpublisher_exception_hook
    (Object: RoleManager)
  File lib/python/ZPublisher/Publish.py, line 171, in publish
  File lib/python/ZPublisher/mapply.py, line 160, in mapply
    (Object: Drug_add)
  File lib/python/ZPublisher/Publish.py, line 112, in call_object
    (Object: Drug_add)
  File lib/python/OFS/DTMLMethod.py, line 172, in __call__
    (Object: Drug_add)
  File lib/python/DocumentTemplate/DT_String.py, line 528, in __call__
    (Object: Drug_add)
  File lib/python/DocumentTemplate/DT_With.py, line 133, in render
    (Object: Drug.createInObjectManager(REQUEST['id'], REQUEST))
  File lib/python/DocumentTemplate/DT_Util.py, line 337, in eval
    (Object: Drug.createInObjectManager(REQUEST['id'], REQUEST))
    (Info: REQUEST)
  File <string>, line 0, in ?
  File lib/python/ZClasses/ZClass.py, line 452, in createInObjectManager
    (Object: Drug)
  File lib/python/OFS/CopySupport.py, line 442, in _setId
    (Object: asdasd)
  File lib/python/Products/ZPatterns/DataSkins.py, line 208, in
__set_attr__
    (Object: asdasd)
KeyError: (see above)

--
Steve Alexander
Software Engineer
Cat-Box limited
http://www.cat-box.net