[Zope-dev] Soft links again
Ibaņez Palomar Juan David
al028823@alumail.uji.es
Tue, 26 Sep 2000 19:24:04 +0200 (DFT)
Hi all,
First, I'm using Zope 2.2.1 (Debian package).
I've been trying to implement zope objects that behave like unix soft
links. The message
http://lists.zope.org/pipermail/zope-dev/2000-July/005963.html
by Shane proposes an implementation based in the __of__ method:
class SoftLink (SimpleItem):
def __init__(self, path):
self.path = path
def __of__(self, parent):
ob = self.restrictedTraverse(self.path)
return getattr(ob, 'aq_base', ob).__of__(parent)
but it fails when I try to create an instance:
Traceback (innermost last):
File /usr/lib/zope/lib/python/ZPublisher/Publish.py, line 171, in publish
File /usr/lib/zope/lib/python/ZPublisher/mapply.py, line 160, in mapply
(Object: manage_addImportedSubject)
File /usr/lib/zope/lib/python/ZPublisher/Publish.py, line 112, in call_object
(Object: manage_addImportedSubject)
File /var/lib/zope/Products/LLEU/subjects.py, line 1129, in manage_addImportedSubject
(Object: Traversable)
File /usr/lib/zope/lib/python/OFS/ObjectManager.py, line 250, in _setObject
(Object: Traversable)
File /usr/lib/zope/lib/python/OFS/ObjectManager.py, line 236, in _getOb
(Object: Traversable)
AttributeError: A00
A little of debug shows that the object has been added (line 249, see below),
the exception raises when it tries to get the object (line 250). The hasattr
function (line 234) returns false but the object has been added (it's in the
__dict__) attribute and its __off__ method is called when the hasattr function
is called.
What I'm doing wrong?
Thanks,
david
ObjectManager.py:
class ObjectManager(
...
def _setOb(self, id, object): setattr(self, id, object)
def _delOb(self, id): delattr(self, id)
def _getOb(self, id, default=_marker):
234 if not hasattr(aq_base(self), id):
if default is _marker:
236 raise AttributeError, id
return default
return getattr(self, id)
def _setObject(self,id,object,roles=None,user=None, set_owner=1):
v=self._checkId(id)
if v is not None: id=v
try: t=object.meta_type
except: t=None
self._objects=self._objects+({'id':id,'meta_type':t},)
# Prepare the _p_jar attribute immediately. _getCopy() may need it.
if hasattr(object, '_p_jar'):
object._p_jar = self._p_jar
249 self._setOb(id,object)
250 object=self._getOb(id)