Log message for revision 77681: Merge r71222 from old branch: Allow assignment to a wrapper's __parent__.
Changed: U Zope/branches/philikon-aq/lib/python/Acquisition/_Acquisition.c U Zope/branches/philikon-aq/lib/python/Acquisition/tests.py -=- Modified: Zope/branches/philikon-aq/lib/python/Acquisition/_Acquisition.c =================================================================== --- Zope/branches/philikon-aq/lib/python/Acquisition/_Acquisition.c 2007-07-10 15:49:42 UTC (rev 77680) +++ Zope/branches/philikon-aq/lib/python/Acquisition/_Acquisition.c 2007-07-10 15:58:32 UTC (rev 77681) @@ -627,8 +627,8 @@ /* Allow assignment to parent, to change context. */ if (PyString_Check(oname)) name=PyString_AS_STRING(oname); - if (*name=='a' && name[1]=='q' && name[2]=='_' - && strcmp(name+3,"parent")==0) + if ((*name=='a' && name[1]=='q' && name[2]=='_' + && strcmp(name+3,"parent")==0) || (strcmp(name, "__parent__")==0)) { Py_XINCREF(v); ASSIGN(self->container, v); Modified: Zope/branches/philikon-aq/lib/python/Acquisition/tests.py =================================================================== --- Zope/branches/philikon-aq/lib/python/Acquisition/tests.py 2007-07-10 15:49:42 UTC (rev 77680) +++ Zope/branches/philikon-aq/lib/python/Acquisition/tests.py 2007-07-10 15:58:32 UTC (rev 77681) @@ -1401,7 +1401,7 @@ ... TypeError: __init__() takes exactly 2 arguments (1 given) - We can reassign aq_parent + We can reassign aq_parent / __parent__ on a wrapper: >>> x = B() >>> x.color = 'green' @@ -1409,6 +1409,20 @@ >>> w.color 'green' + >>> y = B() + >>> y.color = 'blue' + >>> w.__parent__ = y + >>> w.color + 'blue' + + Note that messing with the wrapper won't in any way affect the + wrapped object: + + >>> Acquisition.aq_base(w).__parent__ + Traceback (most recent call last): + ... + AttributeError: __parent__ + >>> w = ImplicitAcquisitionWrapper() Traceback (most recent call last): ... _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins