Re: [Zope-dev] zpatterns: rackmountables must be of-wrapped
"Phillip J. Eby" a écrit :
So: retrieveItem, createItem use vanilla objects retrieveItem and createItem are not intended to be public methods; the only reason they don't begin with an "_" is that I wanted to make it possible for them to be implemented as DTMLMethods or PythonMethods. you missed the point. I wasn't that clear neither ;-)
I know that retrieveItem and createItem are not public API, and are meant to be overidable. I believe that telling the rackmountable what rack it belongs to in getItem and newItem it not sufficient. It has to be wrapped in the context of the rack with something like: # this works for me item = self.retrieveItem(key) if item is not None: item._setRack(self.aq_inner) return item.__of__(self) # keep other acquisition wrappers, # no need to get aq_inner or: # untested item = self.retrieveItem(key) if item is not None: rack = self.aq_inner item._setRack(rack) return item.__of__(rack) When I don't wrap items like this, I get strange unauthorized errors. Only the super user can use the items. All the other users (Managers or not) can't. Remember that I use python classes as rack-mountables, and they don't get the fancy acquisition wrapping that zclasses get. regards, jephte clain minf7@educ.univ-reunion.fr
At 01:56 PM 5/25/00 +0400, Jephte CLAIN wrote:
When I don't wrap items like this, I get strange unauthorized errors. Only the super user can use the items. All the other users (Managers or not) can't.
In normal usage, one only accesses a rack from or in a Specialist. Specialists wrap the objects in the context of the specialist for you. I've just checked the code, however, and notice that Specialist.__bobo_traverse__ does this wrapping, not Specialist.getItem, so I will fix this in the next release. That way, calling getItem on the Specialist will ensure you have proper context. Patch follows... Index: Specialists.py =================================================================== RCS file: /u/idsuser/REPOSITORY/ZProducts/ZPatterns/Specialists.py,v retrieving revision 1.7 diff -u -r1.7 Specialists.py --- Specialists.py 2000/05/18 05:24:49 1.7 +++ Specialists.py 2000/05/25 12:57:35 @@ -1,7 +1,6 @@ from PlugIns import PlugInGroup from DataManagers import DataManager from Globals import HTMLFile, default__class_init__ - _marker = [] @@ -23,7 +22,7 @@ if ob is _marker: ob = self.getItem(name) if ob is not None: - return getattr(ob,'aq_base',ob).__of__(self) + return ob raise 'NotFound' return ob @@ -32,7 +31,8 @@ return self.retrieveItem(key) # XXX need DTML check? for rack in self.rackList: item = rack.__of__(self).getItem(key) - if item is not None: return item + if item is not None: + return getattr(item,'aq_base',item).__of__(self) def newItem(self, key=None): """Create a new item"""
participants (2)
-
Jephte CLAIN -
Phillip J. Eby